Matlab圖像處理-直方圖均衡化原理方法?

本教程適合Matlab數字圖像處理的初學者。直方圖均衡化是數字圖像處理中較為基礎的圖像增強方法,通過直方圖均衡化能夠自適應地有效改善圖像對比度不足問題。本文中所支持的直方圖均衡化圖像,不僅僅限於灰度圖,更將RGB真彩色圖、多波段遙感影像納入直方圖均衡化範疇。較為全面直觀地給出在Matlab中對圖像進行直方圖均衡化的方法原理和Matlab源代碼,並配合必要的代碼註釋,希望能幫助Matlab和數字圖像處理的初學者入門。

Matlab圖像處理-直方圖均衡化原理方法

工具/原料

推薦:Matlab 2013a及以上

支持:灰度圖、RGB真彩色圖、多波段遙感影像

方法/步驟

打開圖像

[FileName, FilePath]=uigetfile('*.tif;*.jpg;*.png;*.img;*.gif;','請選擇圖像數據');

str=[FilePath FileName];

Image=imread(str);

% 以對話框的形式選擇打開一幅圖像

[M,N,nDims]=size(Image);

Image=im2double(Image);

% 獲取圖像的尺寸和波段數

直方圖均衡化

HISTEQ=Image;

for i=1:nDims % 分別對各波段進行直方圖均衡化

H=Image(:,:,i);

[counts,x]=imhist(H); % 計算各灰度級x的像素個數count

loction=find(counts~=0); % 找到所有像素個數不為0的灰度級

MinCDF=min(counts(loction));

for j=1:length(loction)

CDF=sum(counts(loction(1:j))); % 計算各灰度級像素個數累積分佈CDF

P=find(H==x(loction(j)));

H(P)=(CDF-MinCDF)/(M*N-MinCDF); % 灰度轉換公式

end

HISTEQ(:,:,i)=H; % 將均衡化後各分量分別保存在結果中

end

保存輸出

figure, % 在同一窗口顯示原圖與灰度拉伸結果圖

if nDims==3 nDims==1 % 若為灰度圖和RGB真彩色圖則以常規方式保存並輸出

subplot(1,2,1),imshow(Image);title('原圖');

subplot(1,2,2),imshow(HISTEQ);title('直方圖均衡化');

imwrite(HISTEQ,'Result_HISTEQ.jpg','jpeg');

else % 若為多波段遙感影像則按照TM 3,2,1組合形式保存並輸出

subplot(1,2,1),imshow(Image(:,:,[3,2,1]));title('原圖');

subplot(1,2,2),imshow(HISTEQ(:,:,[3,2,1]));title('直方圖均衡化');

imwrite(HISTEQ(:,:,[3,2,1]),'Result_HISTEQ.tif','tiff');

end

% 將直方圖均衡化結果保存至當前目錄並以Result_HISTEQ命名

結果對比

上圖:原灰度圖

下圖: 直方圖均衡化結果圖

Matlab圖像處理-直方圖均衡化原理方法

Matlab圖像處理-直方圖均衡化原理方法

直方圖對比

上圖:原灰度圖直方圖

下圖: 直方圖均衡化結果圖直方圖

Matlab圖像處理-直方圖均衡化原理方法

Matlab圖像處理-直方圖均衡化原理方法

注意事項

本例中將RGB真彩色圖各個分量進行均衡化後,圖像中會有異常點,可將RGB映射到YUV空間,對亮度單獨進行均衡化即可。

Matlab中結合imhist和histeq函數對灰度圖直接進行直方圖均衡化,本例為詳細說明方法原理,而通過自編寫代碼實現。

如需進一步瞭解詳細原理,可參考維基百科詞條直方圖均衡化。

相關問題答案