本教程適合Matlab數字圖像處理的初學者。直方圖均衡化是數字圖像處理中較為基礎的圖像增強方法,通過直方圖均衡化能夠自適應地有效改善圖像對比度不足問題。本文中所支持的直方圖均衡化圖像,不僅僅限於灰度圖,更將RGB真彩色圖、多波段遙感影像納入直方圖均衡化範疇。較為全面直觀地給出在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命名
結果對比
上圖:原灰度圖
下圖: 直方圖均衡化結果圖
直方圖對比
上圖:原灰度圖直方圖
下圖: 直方圖均衡化結果圖直方圖
注意事項
本例中將RGB真彩色圖各個分量進行均衡化後,圖像中會有異常點,可將RGB映射到YUV空間,對亮度單獨進行均衡化即可。
Matlab中結合imhist和histeq函數對灰度圖直接進行直方圖均衡化,本例為詳細說明方法原理,而通過自編寫代碼實現。
如需進一步瞭解詳細原理,可參考維基百科詞條直方圖均衡化。