直方图均衡化

来源:互联网 发布:mac 微信截图 编辑:程序博客网 时间:2024/05/05 12:32

一、直方图均衡化

直方图均衡化一来可以提高图像的对比度,二来可以把图像变换成像素值是几乎均匀分布的图像。

变换

假定r已经标准化在[0,1]区间内,r=0表示黑色,r=1表示白色,变换函数

s=T(r),  0 =< r < = 1

满足以下条件:

T(r)是一单值函数,并且在区间[0,1]单调递增;

0 <= r <= 10<= T(r) <=1

对变换T的大致感觉如下:


直方图均衡化是基于一个随机变量的概率密度函数的变换。令分别表示随机变量rs的概率密度函数。如果T(r)是已知的,变换得到的随机变量s的概率密度函数可以通过

得到。

定义一个变换函数


等式的右边是随机变量r的累积分布函数。

给定变换,



显然是一个均匀概率密度函数,T(r)依赖于,但总是均匀的。


离散情况时,

图像中灰度级出现的概率是

变换函数是

因此,通过映射输入图像中灰度级是的每个像素值到一个相应的具有灰度级的像素值。

对于范围为[0,G]的输入图像,计算变换后的图像像素值,可以采用如下两种方法:

1

2

例:一幅8灰度级图像具有如下所示的直方图,求直方图均衡后的灰度级和对应概率,并画出均衡后的直方图的示意图。(图中的8个不同灰度级对应的归一化直方图为[0.17  0.25  0.21  0.16  0.07  0.08  0.04  0.02]


得:


采用准则,这里G=8,我们得到


利用matlab画出直方图:

>> horz=0:7

 

horz =

 

     0     1     2     3     4     5     6     7

 

>> h1=[0;0.17;0.25;0;0.21;0.16;0.19;0.02]

 

h1 =

 

         0

    0.1700

    0.2500

         0

    0.2100

    0.1600

    0.1900

    0.0200

 

>> bar(horz,h1,0.8)

>> set(gca,'ytick',0:0.05:0.3)

>> axis([0 8 0 0.3])



二、matlab里的直方图均衡化函数

g=histeq(f,nlev)

f是输入图像,nlev是输出图像灰度级的个数

如果nlev等于L(输入图像可能灰度级的总个数),然后histeq直接执行变换函数;如果nlev小于Lhisteq试图使它们的灰度级分布尽量是一个平坦的直方图


>> f=imread('E:\cv\冈萨雷斯数字图像处理MATLAB版图片\dipum_images_ch03\Fig0308(a)(pollen).tif');

>> imshow(f)


>> figure,imhist(f)

>> ylim('auto');


>> g=histeq(f,256);

>> figure,imshow(g)


>> figure,imhist(g)

>> ylim('auto')


发现1,均衡化后的直方图一般不是均匀分布(不平坦的),但由于可以使像素扩展至0-255,所以一般可以图像的视觉效果更好;

解释:

uint8类灰度图像为例,灰度级共有256个,均衡化之后,假定每个灰度级都可以取到,则说明原始图像和均衡化后的图像完全一样,所以如果uint8类的灰度图像的直方图不是平坦的,则均衡化后的图像的直方图也不是均衡化的;另一方面,如果均衡后某些 灰度级不可以取到,则这个像素级的像素个数为0,所以也不可能是平坦的。

此外,如果原始图像的某个灰度级个数很多,均衡化之后对应像素级的像素个数也是很多,于是也会造成不平坦的。


对均衡化后的图像再次均衡化

>> h=histeq(g,256);

>> figure,imshow(h)


>> figure,imhist(h)

>> ylim('auto')


>> z=g-h;

>> max(z(:))

 

ans =

 

    0

 

由于图像g和图像h的完全相等,于是我们可以得到

发现2,第二次直方图均衡化处理的结果与第一次直方图均衡化处理的结果相同。


对直方图均衡化的介绍先到这里,下一章介绍直方图匹配。

0 0