直方圖均衡化(Histogram Equalization) 又稱直方圖平坦化,實質上是對圖像進行非線性拉伸,重新分配圖像象元值,使一定灰度範圍內象元值的數量大致相等。這樣,原來直方圖中間的峰頂部分對比度得到增強,而兩側的谷底部分對比度降低,輸出圖像的直方圖是一個較平的分段直方圖:如果輸出數據分段值較小的話,會產生粗略分類的視覺效果。[1]
根據香農定理關於信息熵的定義:
對於一副圖像而言,當每一個灰度值分布更均衡,圖像所包含的信息量是越大的;相反,僅僅只有一個灰度值的時候,信息量很少。這個是我們能夠想來的比如:純黑圖像包含信息量很少,而其他圖像我們可能會看到一些人物、景物。
就效果而言,直方圖均衡化使得圖像信息量變大,但是不可能會發生較小的灰度值在經過均衡化後變得比原來較大的灰度值更大。這也就意味著,我們通過均衡化後的圖所觀察到的景物應當與原來圖像所觀察到的一致,只是顏色層次更清晰,更加具有辨識度。
二、直方圖均衡化算法它首先是一種灰度級變換的方法,原來的灰度範圍[r0,rk]變換到[s0,sk]變換函數為:s=T(r);為便於實現,可以用查找表(look-up table)的方式存儲,即:原始的灰度作為查找表的索引,表中的內容是新的灰度值。其次,直方圖均衡化是圖像增強的一種基本方法,可提高圖像的對比度,即:將較窄的圖像灰度範圍以一定規則拉伸至較大(整個灰度級範圍內)的範圍。目的是在得到在整個灰度級範圍內具有均勻分布的圖像。
所以,當輸入:直方圖H(r)【此處指每個灰度級佔有的像素數】;灰度級範圍[r0,rk];目的是找到一個s=T(r)使得輸出圖像的直方圖G(s)【同指】在整個灰度級範圍內均勻分布。且需滿足
(1)0—L(灰度範圍)單調遞增,避免黑白顛倒;
(2)0<r<L,時0<s<L,保持動態範圍一致。
累積分布函數滿足這幾個要求。
若圖像有M*N個像素,則均衡化後的直方圖G(q)就有均勻分布:
代入上式:
轉換成離散形式:
clc;clear;set(0,'defaultfigurecolor','w')RGB = imread('1.png'); % 讀取彩色圖subplot(2,2,1);imshow(RGB);title('彩色圖'); fx=rgb2gray(RGB);subplot(2,2,2);imshow(fx);title('灰度圖');% subplot(2,2,3);imhist(fx);title('灰度圖'); [R, C] = size(fx); % 統計每個像素值出現次數count = zeros(1, 256);for i = 1 : R for j = 1 : C count(1, fx(i, j) + 1) = count(1, fx(i, j) + 1) + 1; endend%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%一下編寫T函數[2]T = zeros(1, 256);T = double(T); count = double(count); % 統計每個像素值出現的概率, 得到概率直方圖for i = 1 : 256 T(1, i) = count(1, i) / (R * C);end % 求累計概率,得到累計直方圖for i = 2 : 256 T(1, i) = T(1, i - 1) + T(1, i);end % 完善T函數的定義for i = 1 : 256 T(1, i) = T(1, i) * 255;end%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 完成每個像素點的映射fy = double(fx);for i = 1 : R for j = 1 : C fy(i, j) = T(1, fy(i, j) + 1); endend % 輸出仍然要記得改數據類型fy = uint8(fy);subplot(2,2,3);imshow(fy);title('直方圖均衡化');subplot(2,2,4);imhist(fy);title('直方圖均衡化');往期回顧>>>>>>