原理:
直方圖均衡化首先是一種灰度級變換的方法:
原來的灰度范圍[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,保持動態范圍一致。
累積分布函數滿足這幾個要求。
\[\sum\limits_{i = 0}^k {G({s_i})} = \sum\limits_{j = 0}^k {H({r_j})} \]
若圖像有M*N個像素,則均衡化后的直方圖G(q)就有均勻分布:
\[F = \frac{{NM}}{{{s_k} - {s_0}}}\]
代入上式:
\[NM\int\limits_{{s_0}}^s {\frac{1}{{{s_k} - {s_0}}}} ds = \frac{{NM(s - {s_0})}}{{{s_k} - {s_0}}} = \int\limits_{{r_0}}^r {H(r)} dr\]
則:
\[s = T(r) = \frac{{{s_k} - {s_0}}}{{NM}}\int\limits_{{r_0}}^r {H(r)} dr + {s_0}\]
轉換成離散形式:
\[s = T(r) = \frac{{{s_k} - {s_0}}}{{NM}}\sum\limits_{{r_0}}^r {H(r)} + {s_0}\]
一般\[{s_k} = 255,{s_0} = 0\]
自此就得到了與r相應的s。
matlab代碼:
[filename,pathname]=uigetfile('*.*','select an image'); input_I=imread([pathname filename]);%讀入圖像 subplot(3,3,1);imshow(input_I); title('原始圖像');%顯示原始圖像 I_gray = rgb2gray(input_I); subplot(3,3,4);imshow(I_gray); title('灰度圖像'); subplot(3,3,5);imhist(I_gray); title('灰度圖像直方圖');%顯示灰度圖像及直方圖 [height,width]=size(I_gray); r=zeros(1,256); for i=1:height for j=1:width r(I_gray(i,j)+1)= r(I_gray(i,j)+1)+1; end end %計算灰度直方圖中的數值:每個灰度級對應的像素數目。 subplot(3,3,6);stem(r); title('計算所得灰度圖像直方圖'); s=zeros(1,256); s(1)=r(1); for i=2:256 s(i)=s(i-1)+r(i); end %累積分布函數:對應的也是像素的數目。 subplot(3,3,9);stem(s); for i=1:256 s(i)=floor(255*s(i)/(height*width)); end % s(i)/(height*width) 為頻率,*256 為歸一到0—255之間,floor為取整(整數部分)函數。【round為四舍五入函數,ceil為取整數部分加1】 I_HE=I_gray; for i=1:height for j=1:width I_HE(i,j)= s(I_gray(i,j)+1); end end%得到均衡化后的圖像。s(1)~s(256)里的數值即為灰度值,1~256標號對應的是原始灰度圖像的0~255的灰度值。 m=zeros(1,256); for i=1:height for j=1:width m(I_HE(i,j)+1)= m(I_HE(i,j)+1)+1; end end %計算直方圖中的數值:每個灰度級對應的像素數目。 subplot(3,3,9);stem(m); title('計算所得均衡化后圖像直方圖'); imwrite(I_gray,'1gray.png'); imwrite(I_HE,'1he.png'); subplot(3,3,7);imshow(I_HE); title('均衡化后的圖像'); subplot(3,3,8);imhist(I_HE); title('均衡化后圖像直方圖');
結果:
問題
直方圖確實拉伸了,人眼視覺上對比度也提升了,可是說好的均勻分布呢?