直方圖就是對數據進行統計,將統計值組織到一系列事先定義好的 bin( 直方圖中的柱子 ) 中。 bin 中的數值是從數據中計算出的特徵的統計量,這些數據可以是諸如梯度、方向、色彩或任何其他特徵。無論如何,直方圖獲得的是數據分佈的統計圖。
灰度圖像的直方圖的性質:
(1) 直方圖是一幅圖像中各像素灰度出現頻次的統計結果,它只反映圖像中不同灰度值出現的次數,而沒反映某一灰度所在的位置。也就是說,它只包含了該圖像的某一灰度像素出現的概率,而丟失了其所在的位置信息。
(2) 任一幅圖像,都有惟一確定一幅與它對應的直方圖,但不同的圖像可能有相同的直方圖。即圖像與直方圖之間是多對一的映射關係。
(3) 由於直方圖是對具有相同灰度值的像素統計得到的,因此,一幅圖像各子區的直方圖之和就等於該圖像全圖的直方圖。
通過直方圖均衡化進行圖像增強
直方圖均衡化是灰度變換的一個重要應用,廣泛應用在圖像增強處理中,它是以累計分佈函數變換爲基礎的直方圖修正法,可以產生一幅灰度級分佈具有均勻概率密度的圖像,擴展了像素的取值動態範圍。許多圖像的灰度值是非均勻分佈的 , 其中灰度值集中在一個小區間內的圖像是很常見的,直方圖均衡化是一種通過重新均勻地分佈各灰度值來增強圖像對比度的方法,經過直方圖均衡化的圖像對二值化閾值選取十分有利。一般來說,直方圖修正能提高圖像的主觀質量 , 因此在處理藝術圖像時非常有用。 直方圖均衡化處理的中心思想是把原始圖像的灰度直方圖從比較集中的某個灰度區間變成在全部灰度範圍內的均勻分佈。
OpenCV2.4.4中提供了現成的直方圖均衡化函數:
void equalizeHist(InputArray src, OutputArraydst );
實現代碼如下:
//讀入圖像
Mat mat = imread("長虹大廈20120810.jpg");
Mat mergeImg;//合併後的圖像
//用來存儲各通道圖片的向量
vector<Mat> splitBGR(mat.channels());
//分割通道,存儲到splitBGR中
split(mat,splitBGR);
//對各個通道分別進行直方圖均衡化
for(int i=0; i<mat.channels(); i++)
equalizeHist(splitBGR[i],splitBGR[i]);
//合併通道
merge(splitBGR,mergeImg);
結果:
原圖
處理後
IplImage結構實現見下面這篇文章: