histeq从用法到原理——Matlab直方图均衡化函数

转载于http://blog.sina.com.cn/s/blog_14d1511ee0102wwyt.html (公式未正常显示,请看原文链接)

一、用法

histeq是Matlab中的一个工具箱函数。其调用格式为:

f1 = histeq(f,n)

[f1,T] = histeq(f,n)

其中,f为输入图像,n为指定直方图均衡化后的灰度级数(若n为向量,且长度小于等于f的灰度级数,则此时为直方图规定化映射,映射灰度区间为n),f1为输出均衡化之后的图像,T为变换矩阵,且存在下列关系:

[m,n]=size(f);

fI=imhist(f);

fI1=fI/(m*n);

fj=imhist(f1);

fj1=fj/(m*n);

可得:

fj1=fl.*T’;

二、数学原理

直方图均衡化方法可以产生一幅灰度级分布概率均匀的图像。以概率论中的概率密度和分布函数为基础,因此,若想对整个函数有准确的把握,则我们首先需要了解:

设一个大小为4X4的4bit(灰度级为2^4=16)灰度图像,将其表示为:

图片


其灰度直方图分布为:

灰度直方图分布  

由灰度分布直方图,得其任意一灰度级数xx∈[1 16])概率密度表达式:

 

可得灰度级为1、2的概率密度为:

由概率论基本知识,其概率分布函数为

可得灰度级为1、2的分布值为:

        通过上述原理,我们不难发现,概率密度表示对应的某一灰度级数在图片中出现的概率,某一灰度级数的分布函数值则表示小于等于该灰度级数的所有灰度值在图片中所占概率。正如前文所述,直方图均衡化作用在于将原始直方图变为更均匀分布的图片。因此,基于上述数学原理,我们便可在此基础上推出直方图均衡化的实现原理:

自己写的代码附上:

f = imread('tire.tif');

[m,n] = size(f);

f1 = im2uint8(ones(m,n));

%得到输入图像的直方图h

h = imhist(f);

l = length(h);

%概率密度PDF

PDF = h/numel(f);

%分布函数CDF

CDF = cumsum(PDF);

%取整扩展,得到均衡化之后的灰度分布直方图

j = CDF.*256;

%由于灰度级数为1-256之间的整数,故需对扩展之后的灰度灰度级数取整才有意义,

%得到的J矩阵为1X256大小,表示扩展之前的灰度级数,其中每个级数对应元素的

%值为该灰度级数扩展后的灰度级数值。如J(3)=24,表示原始灰度直方图为3灰度值

%的地方经灰度扩展后其灰度值为24

J = round(j);

%将扩展后的灰度级数对应映射到图片中

for i=1:l%l=256

    nn = find(J==i);%找出扩展后的灰度级数对应的扩展前的灰度级数

    L = length(nn);

    for k=1:L

    nn1 = find(f==(nn(k)-1));%再找到扩展前的灰度级数对应的像素点,

    f1(nn1)=i;              %并将像素点对应灰度值值置为扩展后的灰度值

    end

end


三、

原图
灰度均衡化图

当然,对于T的求法暂时还没弄明白,日后补上。T T

参考文献:

1.章毓晋. 图像工程[M]. 清华大学出版社, 2013.
​​2.左飞. 数字图像处理:原理与实践(MATLAB版)[M]. 电子工业出版社, 2014.

猜你喜欢

转载自blog.csdn.net/lihe4151021/article/details/106746497