基于点运算的直方图均衡化
基于点运算的直方图均衡化
摘要:本文给出了直方图均衡化的方法,及其整个推理过程,并其用MatLab作了仿真试验证明该方法对直方图能够有效拉伸,对图像质量的改善大有帮助。首先,给出基于点运算的输出直方图的公式,然后在此基础上推导出直方图均衡化方法,最后给出MatLab仿真试验程序及其效果。
关键词:数字图像处理 直方图均衡化 点运算 直方图拉伸
1. 引言
在通过图像摄取设备采集图像时可能由于光线太强或者太弱,使得图像整体偏亮或者整体偏暗。图像明亮程度、对比度差,图像细节分辨不清楚。分析这样的图像对应的直方图后我们会发现它们的灰度值非常集中在一端,或者集中在一个区域,如此以来,整个图像的灰度层次其实就相应的变少了,图像的细节也就难以体现出来。因此,可以通过直方图的均衡化的方法,将这些集中在一端或一个区域中的直方图拉伸到整个灰度级上,达到增强图像的目的。
2. 输出直方图
假定有一输入图像A(x,y),经过灰度变换函数f(D)所定义的点运算处理后,产生输出图像B(x,y)。其中已知输入图像的直方图为HA(D),我们希望得到输出图像直方图的表达式。
任意输出像素的灰度值可由公式计算出: DB=f(DA),假设f(D)是斜率有限的非减函数则,DA=f-1(DB)。
在灰度级范围DA 到DA+ΔDA范围内的像素转换为DB 到 DB+ΔDB其像素个数是不变的,因此直方图上DA 到DA+ΔDA范围与DB 到 DB+ΔDB之间的面积相等。分别对HA(D)与HB(D)在该区间上作定积分也应该相等。如果使得ΔDA适当的小,则ΔDB也将很小,所以可以用矩形面积来近似表示积分:HB(DB)ΔDB =HA(DA)ΔDA,所以HB(DB)=HA(DA)/(ΔDB/ΔDA)。又由于f(D)在各处存在非零的斜率,所以 HB(DB)=HA(DA)/(dDB/dDA),即HB(DB)=HA(DA)/f’(DA)
3. 直方图均衡化
我们希望通过点运算式的衣服输入图像转换为在每一个灰度级上都有相同的像素点数的输出图像(即输出的直方图是平的)。这对于在进行图像比较或者分割之前将图像转化为一致的格式将是非常有用的。经过均衡化要得到的在每一灰度级的像素个数为A0/Dm,其中A0是图像的面积,Dm输出图像的灰度级的最大值,即HB(D)= A0/Dm。
由第二节推导出的式子可得:f’(D) = Dm /A0 H(D)。
两边积分得:f(D) = Dm /A0 ∫H(u)du。图像的概率密度函数(PDF)是被归一化到单位面积的直方图,所以 p(D) = H(D)/ A0 ,图像的累积分布函数(CDF)是其面积归一化的阈值面积函数,即P(D)=∫p(u)du = 1/A0∫H(u)du ,所以f(D)=DmP(D)。到此我们得到了一个直方图均衡化点运算的变换函数(GST):B(x,y)=f(A(x,y)) = Dm*P(A(x,y))。
4. 实验与结果分析
根据第三节得到的GST,现在进行实验并检验相应的结果。
%%直方图均衡化的实现
%%MatLab7.0环境
I = imread('pout.tif');
subplot(3,2,1);imshow(I); title('原图');subplot(3,2,2);imhist(I);title('直方图');
[m,n] = size(I);
hf = zeros(1,256);
pa = zeros(1,256);
for i = 1:m
for j = 1:n
hf(I(i,j)+1)=hf(I(i,j)+1)+1;%统计各灰度像素个数
end
end
pa(1)= 0;
for k = 2:256
pf(k) =hf(k)/(m*n);%算灰度分布概率
pa(k) =pa(k-1)+pf(k);%灰度累计分布概率
end
G = zeros(size(I));
for i = 1:m
for j = 1:n
G(i,j)=floor(255*pa(I(i,j))); %将原来f的灰度值映射到新的灰度值g(i,j) = 255*pa(I(i,j))
end
end
H = mat2gray(G);
K = uint8(G);
subplot(3,2,3);imshow(K);title('均衡化');subplot(3,2,4);imhist(K);title('均衡化后直方图');
subplot(3,2,5);imshow(histeq(I));title('matlab均衡化');subplot(3,2,6);imhist(histeq(I));title('matlab均衡化后直方图');
从实验结果,可以看出直方图均衡化之后,图像质量得到了明显的改善。但均衡化后的直方图并不是像理论上的那样均衡,其主要原因是图像的灰度级是离散的且有限。理想状态是灰度级无限的情况下成立的。