如果一副圖像的像素占有很多的灰度級而且分布均勻,那么這樣的圖像往往有高對比度和多變的灰度色調(diào)。直方圖均衡化就是一種能僅靠輸入圖像直方圖信息自動達(dá)到這種效果的變換函數(shù)。它的基本思想是對圖像中像素個數(shù)多的灰度級進(jìn)行展寬,而對圖像中像素個數(shù)少的灰度進(jìn)行壓縮,從而擴展像原取值的動態(tài)范圍,提高了對比度和灰度色調(diào)的變化,使圖像更加清晰。
基本思想
直方圖均衡化處理的“中心思想”是把原始圖像的灰度直方圖從比較集中的某個灰度區(qū)間變成在全部灰度范圍內(nèi)的均勻分布。直方圖均衡化就是對圖像進(jìn)行非線性拉伸,重新分配圖像像素值,使一定灰度范圍內(nèi)的像素數(shù)量大致相同。直方圖均衡化就是把給定圖像的直方圖分布改變成“均勻”分布直方圖分布。
直方圖均衡化的基本思想是把原始圖的直方圖變換為均勻分布的形式,這樣就增加了象素灰度值的動態(tài)范圍從而可達(dá)到增強圖像整體對比度的效果。設(shè)原始圖像在(x,y)處的灰度為f,而改變后的圖像為g,則對圖像增強的方法可表述為將在(x,y)處的灰度f映射為g。在灰度直方圖均衡化處理中對圖像的映射函數(shù)可定義為:g=EQ(f),這個映射函數(shù)EQ(f)必須滿足兩個條件(其中L為圖像的灰度級數(shù)):
(1)EQ(f)在0≤f≤L-1范圍內(nèi)是一個單值單增函數(shù)。這是為了保證增強處理沒有打亂原始圖像的灰度排列次序,原圖各灰度級在變換后仍保持從黑到白(或從白到黑)的排列。
(2)對于0≤f≤L-1有0≤g≤L-1,這個條件保證了變換前后灰度值動態(tài)范圍的一致性。
累積分布函數(shù)(cumulativedistributionfunction,CDF)即可以滿足上述兩個條件,并且通過該函數(shù)可以完成將原圖像f的分布轉(zhuǎn)換成g的均勻分布。此時的直方圖均衡化映射函數(shù)為:
=EQ()=(ni/n)=pf(
),
(k=0,1,2,……,L-1)
上述求和區(qū)間為0到k,根據(jù)該方程可以由源圖像的各像素灰度值直接得到直方圖均衡化后各像素的灰度值。在實際處理變換時,一般先對原始圖像的灰度情況進(jìn)行統(tǒng)計分析,并計算出原始直方圖分布,然后根據(jù)計算出的累計直方圖分布求出
到
的灰度映射關(guān)系。在重復(fù)上述步驟得到源圖像所有灰度級到目標(biāo)圖像灰度級的映射關(guān)系后,按照這個映射關(guān)系對源圖像各點像素進(jìn)行灰度轉(zhuǎn)換,即可完成對源圖的直方圖均衡化。
示例程序
程序:
//鎖定DIB并返回指向DIB的指針
LPSTRlpDIB=(LPSTR)::GlobalLock((HGLOBAL)hDIB);
//找到DIB圖像象素起始位置并返回指向DIB象素指針
LPSTRlpDIBBits=m_clsDIB.FindDIBBits(lpDIB);
//獲取DIB的寬度
LONGlWidth=m_clsDIB.DIBWidth(lpDIB);
//獲取DIB的高度
LONGlHeight=m_clsDIB.DIBHeight(lpDIB);
for(i=0;i { for(j=0;j { //對各像素進(jìn)行灰度統(tǒng)計 unsignedcharR=*((unsignedchar*)lpDIBBits+lWidth*3*i+j); nNs_R[R]++;j++; unsignedcharG=*((unsignedchar*)lpDIBBits+lWidth*3*i+j); nNs_G[G]++;j++; unsignedcharB=*((unsignedchar*)lpDIBBits+lWidth*3*i+j); nNs_B[B]++; } } for(i=0;i<256;i++)//計算灰度分布密度 { fPs_R[i]=nNs_R[i]/(lHeight*lWidth*1.0f); fPs_G[i]=nNs_G[i]/(lHeight*lWidth*1.0f); fPs_B[i]=nNs_B[i]/(lHeight*lWidth*1.0f); } for(i=0;i<256;i++) { //計算累計直方圖分布 if(i==0) { temp_r=fPs_R; temp_g=fPs_G; temp_b=fPs_B; } else { temp_r[i]=temp_r[i-1]+fPs_R[i]; temp_g[i]=temp_g[i-1]+fPs_G[i]; temp_b[i]=temp_b[i-1]+fPs_B[i]; } //累計分布取整,nNs_R[]、nNs_G[]、nNs_B[]保存有計算出來的灰度映射關(guān)系 nNs_R[i]=(int)(255.0f*temp_r[i]+0.5f); nNs_G[i]=(int)(255.0f*temp_g[i]+0.5f); nNs_B[i]=(int)(255.0f*temp_b[i]+0.5f); } for(i=0;i { for(j=0;j { //對R分量進(jìn)行灰度映射(均衡化) unsignedcharR=*((unsignedchar*)lpDIBBits+lWidth*3*i+j); *((unsignedchar*)lpDIBBits+lWidth*3*i+j)=nNs_R[R]; j++; //對G分量進(jìn)行灰度映射(均衡化) unsignedcharG=*((unsignedchar*)lpDIBBits+lWidth*3*i+j); *((unsignedchar*)lpDIBBits+lWidth*3*i+j)=nNs_G[G]; j++; //對B分量進(jìn)行灰度映射(均衡化) unsignedcharB=*((unsignedchar*)lpDIBBits+lWidth*3*i+j); *((unsignedchar*)lpDIBBits+lWidth*3*i+j)=nNs_B[B]; } } 這種方法通常用來增加許多圖像的全局對比度,尤其是當(dāng)圖像的有用數(shù)據(jù)的對比度相當(dāng)接近的時候。通過這種方法,亮度可以更好地在直方圖上分布。這樣就可以用于增強局部的對比度而不影響整體的對比度,直方圖均衡化通過有效地擴展常用的亮度來實現(xiàn)這種功能。 這種方法對于背景和前景都太亮或者太暗的圖像非常有用,這種方法尤其是可以帶來X光圖像中更好的骨骼結(jié)構(gòu)顯示以及曝光過度或者曝光不足照片中更好的細(xì)節(jié)。這種方法的一個主要優(yōu)勢是它是一個相當(dāng)直觀的技術(shù)并且是可逆操作,如果已知均衡化函數(shù),那么就可以恢復(fù)原始的直方圖,并且計算量也不大。這種方法的一個缺點是它對處理的數(shù)據(jù)不加選擇,它可能會增加背景噪聲的對比度并且降低有用信號的對比度。 參考資料 >基本概述