本系列文章都是通過自己的學習經驗,以及啃文檔所寫。如需轉載,請註明出處
參考文檔:Image Processing Toolbox™ 6
User’s Guide
作者:joy
聯繫方式:[email protected]
如果圖像的對比度太差,常用的方法就是灰度直方圖均衡化。在matlab中,能達到這個目的的函數就是histeq.那麼直方圖均衡化的原理是什麼呢?下面就主要講解一下:
histeq的原理:
[MN]=size(H);
[counts,x]=imhist(H);%H是讀取的圖像,imhist是對圖像直方圖進行統計,其中count,是每個灰度值得個數,x代表灰度值。一般的,x=1:256
location=find(counts~=0);%找到所有像素個數不爲0的灰度級
MinCDF=min(counts(location));%找到包含個數最少的灰度級
for j=1:length(location)
CDF=sum(counts(location(1:j)));%計算各個灰度級像素個數累計分佈
P=find(H==x(location(j)));%找到圖像中等於某個灰度級所有像素點所在位置
H(P)=(CDF-MinCDF)/(M*N-MinCDF);%%利用灰度換算公式,修改所有位置上的像素值
end
簡單的說,就是將每個灰度值利用一個變換公式替換掉。
簡單的例子:
clc;clear;closeall;
H=imread('pout.tif');figure;subplot(121);imshow(H);%圖像應該是灰度圖,若圖像爲彩色圖,需要對每個通道進行計算
H=im2double(H);%這個是需要注意的地方,一定要變換成double類型
[MN]=size(H);
[counts,x]=imhist(H);%H是讀取的圖像,imhist是對圖像直方圖進行統計,其中count,是每個灰度值得個數,x代表灰度值。一般的,x=1:256
location=find(counts~=0);%找到所有像素個數不爲0的灰度級
MinCDF=min(counts(location));%找到包含個數最少的灰度級
for j=1:length(location)
CDF=sum(counts(location(1:j)));%計算各個灰度級像素個數累計分佈
P=find(H==x(location(j)));%找到圖像中等於某個灰度級所有像素點所在位置
H(P)=(CDF-MinCDF)/(M*N-MinCDF);%%利用灰度換算公式,修改所有位置上的像素值
end
subplot(122);imshow(H)
print(gcf,'-djpeg',['1.jpg']); % 保存爲jpg格式的圖片。
如果用histeq就更簡單了:
clc;clear;closeall;
H=imread('pout.tif');figure;imshow(H);
imhist(H);
B=histeq(H);figure;imshow(B)
imhist(B)