matlab 直方圖均衡化


原理:

直方圖均衡化首先是一種灰度級變換的方法:

原來的灰度范圍[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('均衡化后圖像直方圖');

結果:

問題

直方圖確實拉伸了,人眼視覺上對比度也提升了,可是說好的均勻分布呢?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM