直方圖變換圖像處理技術
發表于:2007-07-14來源:作者:點擊數:
標簽:
信息產業部電子第二十二研究所青島分所 郎銳 圖像增強處理技術一直是圖像處理領域一類非常重要的基本處理技術。通過采取適當的增強處理可以將原本模糊不清甚至根本無法分辨的原始圖片處理成清楚、明晰的富含大量有用信息的可使用圖像,因此此類圖像處理技術
信息產業部電子第二十二研究所青島分所 郎銳
圖像增強處理技術一直是圖像處理領域一類非常重要的基本處理技術。通過采取適當的增強處理可以將原本模糊不清甚至根本無法分辨的原始圖片處理成清楚、明晰的富含大量有用信息的可使用圖像,因此此類圖像處理技術在醫學、遙感、微生物、刑偵以及軍事等諸多領域得到廣泛應用。本文從空間域的角度對圖像的灰度直方圖增強處理方法進行詳細的介紹。
圖像的灰度直方圖處理技術
在空間域對圖像進行增強處理的方式有許多種,如增強對比度和動態范圍壓縮等等,但這些處理方式都是針對原始圖像的每一個像素直接對其灰度進行處理的,其處理過程主要是通過增強函數對像素的灰度級進行運算并將運算結果作為該像素的新灰度值來實現的。通過改變選用的增強函數的解析表達式就可以得到不同的處理效果,這類處理方法比較靈活方便,處理效果也不錯,但對于某些灰度分布很密集或對比度很弱的圖像,雖然也能起到一定的增強效果但并不明顯。對于這種情況就可以采用本文提出的灰度直方圖變換方法將原始圖像密集的灰度分布變得比較疏散,從而拉大圖像的對比度并在視覺上達到明顯增強的效果,使一些原本不易觀察到的細節能變得清晰可辨。
圖像的灰度變換處理是通過改變原始圖像各像素在各灰度級上的概率分布來實現的。通過對圖像的灰度值進行統計可以得到一個一維離散的圖像灰度統計直方圖函數p(sk)=nk/n(這里k=0,1,2……L-1),該式表示在第k個灰度級上的像素個數nk占全部像素總數n的比例,p(sk)則給出了對sk出現概率的一個估計。因此該直方圖函數實際是圖像的各灰度級的分布情況的反映,換句話說也就是給出了該幅圖像所有灰度值的整體描述。通過該函數可以清楚地了解到圖像對應的動態范圍情況,可以了解到圖像灰度的主要集中范圍。因此可以通過圖像增強程序的干預來改變直方圖的灰度分布狀況,使灰度均勻地或是按預期目標分布于整個灰度范圍空間,從而達到增強圖像對比度的效果。這種方法是基于數理統計和概率論的,比直接在空間域對原始圖像采取對比度增強效果要好得多。在實際應用中直方圖的變換主要有均衡變換和規定變換兩種,而后者又可根據灰度級映射規則的不同分單映射規則和組映射規則兩種。
直方圖均衡化處理
直方圖均衡化處理的中心思想是把原始圖像的灰度直方圖從比較集中的某個灰度區間變成在全部灰度范圍內的均勻分布。對圖像空間域點的增強過程是通過增強函數t=EH(s)來完成的,t、s分別為目標圖像和原始圖像上的像素點(x,y),在進行均衡化處理時,增強函數EH需要滿足兩個條件:增強函數EH(s)在0≤s≤L-1的范圍內是一個單調遞增函數,這個條件保證了在增強處理時沒有打亂原始圖像的灰度排列次序; 另一個需要滿足的條件是對于0≤s≤L-1應當有0≤EH(s)≤L-1,它保證了變換過程中灰度值的動態范圍的一致性。同樣的,對于反變換過程s=EH-1(t),在0≤t≤1時也必須滿足上述兩個條件。累計分布函數(cumulative distribution function,CDF)就是滿足上述條件的一種,通過該函數可以完成s到t的均勻分布轉換。此時的增強轉換方程為:
tk = EH(sk)=∑(ni/n)=∑ps(si),(k=0,1,2……L-1)
上述求和區間為0到k,根據該方程可以由原圖像的各像素灰度值直接得到直方圖均衡化后各像素的灰度值。在實際處理變換時,一般先對原始圖像的灰度情況進行統計分析,并計算出原始直方圖分布,然后根據計算出的累計直方圖分布tk,按式tk=[(N-1)* tk+0.5]對其取整并得出源灰度sk到tk的灰度映射關系,其中N為灰度的級數。重復上述步驟,得到所有的源圖像各灰度級到目標圖像各灰度級的映射關系,再按照新的映射關系對源圖像各點像素進行灰度轉換,即可完成對源圖的直方圖均衡化。下面是按照上述算法實現的部分關鍵程序代碼。
首先對原始圖像的各像素點的灰度情況進行統計計算。對于24位BMP圖像,圖像陣列是從第54字節開始的,每像素按R、G、B的順序占3個字節。
for (DWORD i=54; i
ns_r[m_cpBuffer[i]]++; //ns_r[k]為k灰度級像素數,m_cpBuffer[i]為當前的灰度值
i++;
ns_g[m_cpBuffer[i]]++;
//ns_g為G分量的統計計數
i++;
ns_b[m_cpBuffer[i]]++;
//ns_b為B分量的統計計數
}
for (i=0; i<256; i++)
//計算R、G、B三分量的直方圖分布
{
ps_r[i]=ns_r[i]/((m_dwFileLen-54)/3.0f);
//ps_r[i]為R分量中i灰度級出現的概率
ps_g[i]=ns_g[i]/((m_dwFileLen-54)/3.0f);
//ps_b[i]為G分量中i灰度級出現的概率
ps_b[i]=ns_b[i]/((m_dwFileLen-54)/3.0f);
//ps_b[i]為B分量中i灰度級出現的概率
}
然后計算R、G、B三分量各灰度級的累計直方圖分布,并對其進行取整以得出源和目標圖像灰度之間的映射關系:
for (i=0; i<256; i++)
{
//計算累計直方圖分布
temp_r[i]=temp_r[i-1]+ps_r[i];
temp_g[i]=temp_g[i-1]+ps_g[i];
temp_b[i]=temp_b[i-1]+ps_b[i];
//累計分布取整,ns_r[]、ns_g[]、ns_b[]保存有計算出來的灰度映射關系
ns_r[i]=(int)(255.0f*temp_r[i]+0.5f);
ns_g[i]=(int)(255.0f*temp_g[i]+0.5f);
ns_b[i]=(int)(255.0f*temp_b[i]+0.5f);
}
最后按照計算出來的映射關系,把原圖的原始灰度值映射到經過均衡化的新灰度級上。圖1、圖2分別是原始圖像和用本程序得出的經過直方圖均衡化處理后的目標圖像,從實驗結果可以看出原始圖像太暗,根本看不清細節,而處理過的圖像則比較清晰:
for (i=54; i
{
m_cpBuffer[i]=ns_r[m_cpBuffer[i]];
//對R分量進行灰度映射(均衡化)
i++;
m_cpBuffer[i]=ns_g[m_cpBuffer[i]];
//對G分量進行灰度映射(均衡化)
i++;
m_cpBuffer[i]=ns_b[m_cpBuffer[i]];
//對B分量進行灰度映射(均衡化)
}
單映射規則的直方圖規定化處理
前面介紹的直方圖均衡化處理方法從實驗效果看還是很不錯的,從實現算法上也可以看出其優點主要在于能自動增強整幅圖像的對比度,但具體的增強效果也因此不易控制,只能得到全局均衡化處理的直方圖。在科研和工程應用中往往要根據不同的要求得到特定形狀的直方圖分布以有選擇的對某灰度范圍進行局部的對比度增強,此時可以采用對直方圖的規定化處理,通過選擇合適的規定化函數取得期望的效果。對于灰度級數分別為M和N(滿足M≥N)的原始圖和規定圖,一般仍先按均衡化對原始圖進行處理:
tk =EHs(si)=∑ps(si),(k=0,1,2……M-1)
然后規定需要的直方圖,并計算出能使規定的直方圖均衡化的變換:
vl = EHu(uj)=∑pu(ui),(l=0,1,2……N-1)
最后將第一步得到的變換反轉過去,即把原始直方圖對應映射到規定的直方圖,也就是把所有的ps(si)映射到pu(uj)中去。由于映射是在離散空間進行的,而且在取整時不可避免會引入誤差,因此采取何種對應規則是一個很重要的問題。比較常用的一種方法是Gonzalez在1987年提出的單映射規則(single mapping law,SML),首先尋找能滿足|∑ps(si)-∑pu(uj)| 最小的k和l(ps()和pu()的求和上限),然后把ps(si)映射到pu(uj)中去。
本文針對原始圖像比較暗的特點,采取如下的規定直方圖,以使高亮度像素能得到充分的加強:
float a=1.0f/(32.0f*63.0f);
//64個灰度級,a為步長
for (int i=0; i<64; i++)
{
nu[i]=i*4;
pu[i]=a*i;
}
接下來對原始圖和規定直方圖計算累計直方圖,在此不再贅述,重點是根據SML規則把ps(si)映射到pu(uj)中去:
for (i=0;i<256;i++)
{
……
for (int j=0; j<64; j++)
{
float now_value=0.0f;
//計算R分量的兩累計直方圖的絕對差值,并找到滿足最小的灰度級
if (ps_r[i]-pu[j]>=0.0f)
now_value=ps_r[i]-pu[j];
else
now_value=pu[j]-ps_r[i];
if (now_value
{
m_r=j;
min_value_r=now_value;
}
……
//對G和B分量處理的代碼與R分量類似,在此省略
……
}
//建立灰度映射關系
ns_r[i]=nu[m_r];
ns_g[i]=nu[m_g];
ns_b[i]=nu[m_b];
}
在得到ps(si)到pu(uj)的映射關系后,按照該映射關系把原圖的原始灰度值映射到經過均衡化的新灰度級上,以完成最后的處理。上圖(圖3)為實驗得到的按單映射規則對直方圖規定化后的效果,同直方圖均衡化處理效果相比,可以看出高亮度部分得到了充分的增強。
組映射規則的直方圖規定化處理
單映射規則雖然實現起來比較簡單直觀,但在實際處理時仍存在不可忽視的取整誤差,因此在一定程度上還不能很好的實現規定直方圖的意圖??梢酝ㄟ^在規定化直方圖時選取適當的對應規則來改善,一種比較好的對應規則是組映射規則(group mapping law,GML)。這種規則的約定如下:
存在一維離散整數函數I(a),(a=0,1,2……N-1),而且滿足0≤I(0) ≤I(1) ≤……≤I(a) ≤……≤I(N-1) ≤M-1。尋找能使 |∑ps(si)-∑pu(uj)| 達到最小的I(a),其中ps(si)的求和區間為[0,I(a)],pu(uj)的求和區間仍為[0,a]。a=0時,將介于0和I(0)之間的ps(si)都映射到pu(u0)中;1≤a≤N-1時,將介于I(a-1)+1和I(a)之間的ps(si)都映射到pu(uj)中去。
由于同單映射規則相比只是對應規則做了變化,因此編碼部分只需將對應規則部分的代碼根據上面介紹的組映射規則做必要修改即可:
for (i=0; i<64; i++)
//對規定直方圖的灰度級進行枚舉
{
……
for (int j=0; j<256; j++)
//對原圖的灰度級進行枚舉
{
float now_value=0.0f;
//尋找對于R變量能滿足差值最小的I(a),保存于A2_r
if (ps_r[j]-pu[i]>=0.0f)
now_value=ps_r[j]-pu[i];
else
now_value=pu[i]-ps_r[j];
if (now_value
{
A2_r=j;
min_value_r=now_value;
}
for (int k=A1_r; k<=A2_r; k++)
//建立R分量的映射規則
ns_r[k]=nu[i]; A1_r=A2_r+1;
//對于G、B分量的處理類似,在此省略
……
}
對原始圖像應用本算法,實驗得出的按組映射規則對原圖做直方圖規定化后的效果如圖4所示。
該圖同單映射規則處理圖像相比雖無太大變化,但在直方圖分布和圖像細節上更能體現出規定直方圖的意圖,而且通過下面的分析也可以看出組映射規則的誤差要小得多。
在ps(si)映射到pu(uj)時,采取SML規則的映射方法由于取整誤差的影響可能產生的最大誤差是pu(uj)/2,而采用GML規則的映射方法可能出現的誤差為ps(si)/2,由于M≥N,所以一定有pu(uj)/2≥ps(si)/2成立,也就是說SML映射規則的期望誤差一定不會小于GML映射規則的期望誤差。而且從算法實現上也可以看出,SML映射規則是一種有偏的映射規則,某些范圍的灰度級會被有偏地映射到接近開始計算的灰度級;而GML映射規則是統計無偏的,從根本上避免了上述問題的出現。通過分析可以看出GML映射規則總會比SML映射規則更能體現規定直方圖的意圖,而且通常產生的誤差只有SML映射規則的十幾分之一。
結論
本文從理論上講述了直方圖變換處理中常用的直方圖均衡化、采取單映射和組映射規則的直方圖規定化變換方法,通過程序算法實現了上述圖像增強過程,并給出了通過三種算法實驗得出的處理圖像。實驗表明,本文介紹的方法對于暗、弱信號的原始圖像的目標識別和圖像增強等有著良好的處理效果,尤其是通過組映射規則的直方圖規定化變換方法結合設計良好的規定直方圖,可以得到更佳的圖像處理效果。本文給出的程序代碼在Microsoft Visual C++ 6.0下編譯通過。
原文轉自:http://www.kjueaiud.com