直方图均衡化的MATLAB实现
回顾----直方图均衡化
- 基本原理
直方图均衡化方法的基本思想是:
对在图像中像素个数多的灰度级进行展宽,而对像素个数少的灰度级进行缩减,从而达到清晰图像的目的
因为灰度分布可在直方图中描述,所以该图像增强方法是基于图像的灰度直方图。 - 直方图均衡化的处理步骤
①求待处理图像的直方图h
②计算原图的灰度分布概率hs →
Nf--图像f的总体像素个数 (m,n分别为图像的长和宽)
hs--每个灰度级的分布概率,即每个像素在整个图像中所占的比例 (i=0,1,…,255)
③计算原图灰度的累计分布hp →
(i=0,1,…,255)
④计算原、新图灰度值的影射关系
⑤原、新图灰度直方图比较
代码实现
实现程序如下图所示:
% 直方图均衡化
% function [J] = imhisteq0(I)
function [J] = dip(I)
I = imread('img\person.jpg');
figure,imshow(I)
[m,n,l] = size(I);
if(l>1)
I = rgb2gray(I);
end
nbins = 256;
hist_0 = GetImHist0(I,nbins)'; %求直方图
hist_1 = hist_0/(m*n); %求灰度分布概率
hp_0 = cumsum(hist_1); %求原图灰度累计分布 MATLAB中cumsum可用于求累计和
hp_1 = round(hp_0*255);
hp_1(1) = 0; %第1个元素强制设为0
I0 = double(I);
for i=1:m
for j=1:n
GrayScale = I0(i,j); %原图灰度值
NewGrayScale = hp_1(GrayScale+1);
J(i,j) = NewGrayScale;
end
end
J = uint8(J);
figure,imshow(J)
end
% 直方图
function counts = GetImHist0(Im,nbins)
% nbins箱子 区间的个数
[row,col,cChannel] = size(Im);
% cChannel颜色通道
counts = zeros(nbins,1);
minV = 0;
maxV = 255;
if(cChannel>1)
disp('Input error');
else
Im = double(Im);
Im2 = reshape(Im,row*col,1);
delta = (maxV-minV)/nbins;
splitVs = 0:nbins;
splitVs = splitVs*delta; %splitVs = linspace(minV,maxV,nbins+1)
i=1;
ind = find(Im2>=splitVs(i) & Im2<=splitVs(i+1));
counts(i) = length(ind);
for i = 2:nbins
ind = find(Im2>splitVs(i) & Im2<=splitVs(i+1));
counts(i) = length(ind);
end
end
end
代码执行结果: