matlab 直方圖均衡化

原理:函數

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

原來的灰度範圍[r0,rk]變換到[s0,sk]變換函數爲:s=T(r);spa

爲便於實現,能夠用查找表(look-up table)的方式存儲,即:原始的灰度做爲查找表的索引,表中的內容是新的灰度值。code

 

其次,直方圖均衡化是圖像加強的一種基本方法,可提升圖像的對比度,即:將較窄的圖像灰度範圍以必定規則拉伸至較大(整個灰度級範圍內)的範圍。blog

目的是在獲得在整個灰度級範圍內具備均勻分佈的圖像。索引

因此,當輸入:直方圖H(r)【此處指每一個灰度級佔有的像素數】;灰度級範圍[r0,rk];目的是找到一個s=T(r)使得輸出圖像的直方圖G(s)【同指】在整個灰度級範圍內均勻分佈。且需知足get

(1)0—L(灰度範圍)單調遞增,避免黑白顛倒;input

(2)0<r<L,時0<s<L,保持動態範圍一致。it

累積分佈函數知足這幾個要求。table

\[\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('均衡化後圖像直方圖');

結果:

問題

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

相關文章
相關標籤/搜索