直方图均衡化
1、背景
由于图像的直方图统计信息结果其对比度比较窄,大部分的像素都集中在某一个区域内,因而造成图像过亮或者是过暗。而对于一部比较好的图像,其对比度是比较高的,也就是图像的像素的灰度会分布比较均匀。因此要想改善上述图像问题就必须想办法将这些像素进行重新均匀分布。这很容易让人想到数学上的分布函数。涉及概率论的知识。
2、均衡化过程
当然我们均衡化过程是不能改变其灰度值的范围。均衡化的过程图如下:
3、为什么均衡化可以解决问题
一副好的图片是表现出良好的细节信息,就希望每个灰度值出现的概率都均等(最大熵)。假设我们有四个灰度级a,b,c,d,做个类比的话可以将她们理解为四个描述情感的词喜、怒、哀、乐。一般情况下我们得到的直方图可认为是p(a)=0.5,p(b)=0.5,p(c)=0,p(d)=0,而均衡化后的直方图是p(a)=0.25,p(b)=0.25,p(c)=0.25,p(d)=0.25. 如果我们以均衡化前的词描述人的情感则只有喜、怒,而均衡化后的词则有喜、怒、哀、乐。试问,哪种情形能够描述人更细微的情感变化呢?这也是笔者认为直方图均衡化之后能够描述更多图像细节的原因。更进一步,如果一般情况下我们得到的直方图是p(a)=0.4,p(b)=0.4,p(c)=0.1,p(d)=0.1,那这按我们的理解意味什么呢?意味着大部分情况用喜、怒描述人的情感,而哀、乐几乎不用,当然了,如果能够自由运用喜、怒、哀、乐来描述人的情感是最好的哦。
4、运行效果图:
(1)变换函数T(r)在r属于[0,1]范围内是单值、单调增函数;
(2)对于r属于[0,1],s=T(r)也属于[0,1]
实现的的原理是利用一个单值严格递增的函数作为变换函数,该函数就是使得数据更加分散,把过分散的又可以集合起来。让尖峰压平,让谷底紧凑上升!
对于图像离散型:可以做下面的定义
在灰度直方图均衡化处理中对图像的映射函数可定义为:g = EQ (f),这个映射函数EQ(f)必须满足两个条件(其中L为图像的灰度级数):
(1)EQ(f)在0≤f≤L-1范围内是一个单值单增函数。这是为了保证增强处理没有打乱原始图像的灰度排列次序,原图各灰度级在变换后仍保持从黑到白(或从白到黑)的排列。
(2)对于0≤f≤L-1有0≤g≤L-1,这个条件保证了变换前后灰度值动态范围的一致
性。
累积分布函数(cumulative distribution function,CDF)即可以满足上述两个条件,并且通过该函数可以完成将原图像f的分布转换成g的均匀分布。此时的直方图均衡化映射函数为:
gk = EQ(fk) = (ni/n) = pf(fi) 的分布函数,
(k=0,1,2,……,L-1)
6、代码(MATLAB)
%直方图均衡化
I = imread('rice.png');
[height,width] = size(I);
figure
subplot(221)
imshow(I)%显示原始图像
subplot(222)
imhist(I)%显示原始图像直方图
%进行像素灰度统计;
NumPixel = zeros(1,256);%统计各灰度数目,共256个灰度级
for i = 1:height
for j = 1: width
NumPixel(I(i,j) + 1) = NumPixel(I(i,j) + 1) + 1;%对应灰度值像素点数量增加一
end
end
%计算灰度分布密度
ProbPixel = zeros(1,256);
for i = 1:256
ProbPixel(i) = NumPixel(i) / (height * width * 1.0);
end
%计算累计直方图分布
CumuPixel = zeros(1,256);
for i = 1:256
if i == 1
CumuPixel(i) = ProbPixel(i);
else
CumuPixel(i) = CumuPixel(i - 1) + ProbPixel(i);
end
end
%累计分布取整
CumuPixel = uint8(255 .* CumuPixel + 0.5);
%对灰度值进行映射(均衡化)
for i = 1:height
for j = 1: width
I(i,j) = CumuPixel(I(i,j));
end
end
subplot(223)
imshow(I)%显示原始图像
subplot(224)
imhist(I)%显示原始图像直方图
参考:
1、http://blog.csdn.net/u012230579/article/details/52824910