直方图均衡化会造成灰度级的合并伪轮廓
Posted Good Good Study~
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了直方图均衡化会造成灰度级的合并伪轮廓相关的知识,希望对你有一定的参考价值。
均衡化处理后的图象只能是近似均匀分布。均衡化图象的动态范围扩大了,但其本质是扩大了量化间隔,而量化级别反而减少了,
因此,原来灰度不同的象素经处理后可能变的相同,形成了一片的相同灰度的区域,各区域之间有明显的边界,从而出现了伪轮廓。
如果原始图像对比度本来就很高,如果再均衡化则灰度调和,对比度降低。在泛白缓和的图像中,均衡化会合并一些象素灰度,从而增大对比度。均衡化后的图片如果再对其均衡化,则图像不会有任何变化。
灰度直方图均衡化的算法,简单地说,就是把直方图的每个灰度级进行归一化处理,求每种灰度的累积分布,得到一个映射的灰度映射表,然后根据相应的灰度值来修正原图中的每个像素。
经典的直方图均衡化算法可能存在以下一些不足:
- 输出图像的实际灰度变化范围很难达到图像格式所允许的最大灰度变化范围。
- 输出图像的灰度分布直方图虽然接近均匀分布, 但其值与理想值1/n仍有可能存在较大的差异, 并非是最佳值。
- 输出图像的灰度级有可能被过多地合并。由于灰度的吞噬也易造成图像信息的丢失。
直方图均衡化的机理,是将对应像素较少的几个连续灰度级合并成一个灰度级,通过减少灰度级来实现的均衡化。对于离散灰度级的图像,不可能做到完全的均衡,我们得到的结果只是一个大致的均衡。
〈=s〈=1。则前后之间存在如下转换关系:
s(k) = T(r(k))
T(r)为一个单调递增函数,它的获得可由下面的公式给出:
T(r(k)) = ∑pr(r(j)) , j=0:k
pr(r(k)) = n(r(k))/n ,表示每一个灰度值出现的概率
n = ∑n(rj) , j=0:L-1 ,图像总像素值
计算s(k) = T(r(k),就得到了r(k)~s(k)的映射关系。寻找待处理图像的灰度值全部转换成相应灰度值,便完成了直方图的均衡化操作。
如某图像有像素分布:
- 原灰度级r(k) : 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1
- 像素数n(r(k)) : 15 2 10 11 6 3 9 12 23 8 1
- 灰度概率pr(r(k)): 0.15 0.02 0.1 0.11 0.06 0.03 0.09 0.12 0.23 0.08 0.01
- 转换函数T(r(k)) : 0.15 0.17 0.27 0.38 0.44 0.47 0.56 0.68 0.91 0.99 1
- 现灰度s(k) : 0.2 0.2 0.3 0.4 0.4 0.5 0.6 0.7 0.9 1 1
由此,得到转换关系为
灰度值0、0.1都写成0.2,概率0.17;合并了
灰度级0.2写成0.3,概率0.1;
灰度值0.3、0.4都写成0.4,概率0.17;合并了
灰度级0.5写成0.5,概率0.03;
灰度值0.6写成0.6,概率0.09;
灰度级0.7写成0.7,概率0.12;
灰度值0.8写成0.9,概率0.23;
灰度级0.9、1写成1,概率0.09;合并了
matlab实现: im = imread(‘image/dipum_images_ch03/Fig0308(a)(pollen).tif‘); [m,n] = size(im); L = 256; %灰度级L=256 pixel = zeros(1,L); % for i=1:L temp = find( im==(i-1) ); len = size(temp); pixel(i) = len(1)/(m*n); end T = linspace(0,L-1,L); temp = 0; for i=1:L temp = temp + pixel(i); T(i) = temp; end s = uint8(T * L); newim = im; for i =1:L newim(find(im == (i-1))) = s(i); end newpixel = zeros(1,L); for i=1:L temp = size( find( newim==(i-1) ) ); newpixel(i) = temp(1) /(m*n); end subplot(2,2,1);imshow(im); subplot(2,2,2);bar(0:L-1,pixel); subplot(2,2,3);imshow(newim); subplot(2,2,4);bar(0:L-1,newpixel);
效果图:
以上是关于直方图均衡化会造成灰度级的合并伪轮廓的主要内容,如果未能解决你的问题,请参考以下文章