1. 程式人生 > >【數字影象處理】灰度直方圖、直方圖均衡化、直方圖規定化

【數字影象處理】灰度直方圖、直方圖均衡化、直方圖規定化

 

 

灰度直方圖

  一幅影象由不同灰度值的畫素組成,影象中灰度的分佈情況是該影象的一個重要特徵。影象的灰度直方圖就描述了影象中灰度分佈情況,能夠很直觀的展示出影象中各個灰度級所佔的多少。
影象的灰度直方圖是灰度級的函式,描述的是影象中具有該灰度級的畫素的個數:其中,橫座標是灰度級,縱座標是該灰度級出現的頻率。

灰度直方圖的計算公式如下:

p(rk)=nk/MN

其中,rkrk是畫素的灰度級,nknk是具有灰度rkrk的畫素的個數,MNMN是影象中總的畫素個數。

 

直方圖均衡化 Histogram Equalization

假如影象的灰度分佈不均勻,其灰度分佈集中在較窄的範圍內,使影象的細節不夠清晰,對比度較低。通常採用直方圖均衡化及直方圖規定化兩種變換,使影象的灰度範圍拉開或使灰度均勻分佈,從而增大反差,使影象細節清晰,以達到增強的目的。

直方圖均衡化,對影象進行非線性拉伸,重新分配影象的灰度值,使一定範圍內影象的灰度值大致相等。這樣,原來直方圖中間的峰值部分對比度得到增強,而兩側的谷底部分對比度降低,輸出影象的直方圖是一個較為平坦的直方圖。

均衡化演算法

直方圖的均衡化實際也是一種灰度的變換過程,將當前的灰度分佈通過一個變換函式,變換為範圍更寬、灰度分佈更均勻的影象。也就是將原影象的直方圖修改為在整個灰度區間內大致均勻分佈,因此擴大了影象的動態範圍,增強影象的對比度。通常均衡化選擇的變換函式是灰度的累積概率,直方圖均衡化演算法的步驟:

  • 計算原影象的灰度直方圖 P(Sk)=nknP(Sk)=nkn,其中nn為畫素總數,nknk為灰度級SkSk的畫素個數
  • 計算原始影象的累積直方圖 CDF(Sk)=∑i=0knin=∑i=0kPs(Si)CDF(Sk)=∑i=0knin=∑i=0kPs(Si)
  • Dj=L⋅CDF(Si)Dj=L⋅CDF(Si),其中 DjDj是目的影象的畫素,CDF(Si)CDF(Si)是源影象灰度為i的累積分佈,L是影象中最大灰度級(灰度圖為255)

灰度直方圖均衡化實現的步驟

1.統計灰度級中每個畫素在整幅影象中的個數

2.計算每個灰度級佔影象中的概率分佈

3.計算累計分佈概率

4.計算均衡化之後的灰度值

5.映射回原來畫素的座標的畫素值

示例說明

來看看通過上述步驟怎樣實現的拉伸。假設有如下影象:

得影象的統計資訊如下圖所示,並根據統計資訊完成灰度值對映:

對映後的影象如下所示:

灰度直方圖均衡化實現

            //img_size為影象大小
            //Image_Use為影象陣列
            //Use_ROWS為行,Use_Line為列
            float img_size = Use_ROWS * Use_Line * 1.0; int count_data[256],huidu_data[256]; //計數統計、均衡化的灰度值 float midu_data[256],leijimidu_data[256]; //概率密度、累計概率密度             //陣列初始化 memset(count_data, 0, sizeof(count_data)); memset(midu_data, 0.0, sizeof(midu_data)); memset(leijimidu_data, 0.0, sizeof(leijimidu_data)); memset(huidu_data, 0.0, sizeof(huidu_data)); //1.統計灰度級中每個畫素在整幅影象中的個數 for(int i = 0; i < Use_ROWS; i++) { for(int j = 0; j < Use_Line; j++) { count_data[Image_Use[i][j]]++; } } //2.計算每個灰度級佔影象中的概率分佈 for(int i = 0; i < 256; i++) { midu_data[i] = count_data[i]/ img_size; } //3.計算累計分佈概率 leijimidu_data[0] = midu_data[0]; for(int i = 1; i < 256; i++) { leijimidu_data[i] = midu_data[i]+leijimidu_data[i-1]; } //4.計算均衡化之後的灰度值 for(int i =0; i <256; i++) { huidu_data[i] = (int)(255 * leijimidu_data[i]); } //5.映射回原來畫素的座標的畫素值 for(int i = 0; i < Use_ROWS; i++) { for(int j = 0; j < Use_Line; j++) { Image_Use[i][j] = huidu_data[Image_Use[i][j]]; } }

 

 

 

 原始影象:

 

 

 

 

 直方圖均衡化後的影象:

 

 

   

直方圖規定化

參考:

影象處理基礎(8):影象的灰度直方圖、直方圖均衡化、直方圖規定化(匹