给出直方图均衡化的数学推导、步骤,并用程序实现。
解: 总体思想:首先考虑连续函数并且让变量代表待增强图像的灰度级,假设被归一化到区间,且表示黑色及表示白色。然后再考虑一个离散公式并允许像素值在区间内。
对于连续函数而言,假设其变换函数为 (公式1)
在原始图像中,对于每一个像素值产生一个灰度值。其中,变换函数要满足以下条件:
(1)在区间中为单值且单调递增。这是为了保证其逆函数的存在,并且输出图像从黑到白顺序增加;
(2)当时,。这保证输出灰度级与输入有同样的范围。
把公式1的逆函数表示为 (公式2)
一幅图像的灰度级可被视为区间的随机变量。随机变量的一个最重要的基本描述是其概率密度函数。令和分别代表随机变量和的概率密度函数。此处带有下标的和用于表示不同的函数。由基本概率理论得到一个基本结果:如果和已知,且满足条件(1),那么变换变量的概率密度函数可由以下简单公式得到: (公式3)
因此,变换变量的概率密度函数由输人图像的灰度级概率密度函数和所选择的变换函数所决定。
在图像处理中一个尤为重要的变换函数: (公式4)
该被积函数其值为正,并且函数积分是一个函数曲线下的面积,其内含为随机变量的累积分布函数,所以它遵守该变换函数是单值单调增加的条件,因此满足条件(1)。同样地,区间也满足条件(2)。其积分过程如下:
(式5)
用这个结果代替,代入式4,取概率为正,得到:
(式6)
因为是概率密度函数,在这里可以得出区间以外它的值为0,可见式6中给出的形式为均匀概率密度函数。换句话来说,公式4给出的变换函数会得到一个随机变量,其特征为一个均匀概率密度函数,与的函数形式是无关的。总述以上,可以看出便是一个直方图均衡化的基本原理,该等式右边的意义就是随机变量的累积分布函数。这样便转化为了求输入图像灰度级的累积分布函数。
下面开始讨论离散函数。对于离散值,处理的是它函数概率的和,而不是概率密度函数的积分。一幅图像中灰度级出现的概率近似为:
(式7)
其中, 是图像中像素的总和,是灰度级为的像素个数,为图像中可能的灰度级总数。式4中变换函数的离散形式为:
(式8)
因此,已处理的图像(即输出图像)由通过式8,将输入图像中灰度级为的各像素映射到输出图像中灰度级为的对应像素得到。与连续形式不同,一般不能证明离散变换能产生均匀概率密度函数的离散值(为均匀直方图)。但是不论怎样,可以很容易地看出,式8的应用有展开输入图像直方图的一般趋势,以至于直方图均衡化过的图像灰度级能跨越更大的范围。至此,便给出了整个的证明过程。
下面列出了直方图均衡化的一般实现过程:
统计原始输入图像各灰度级的像素数目,,其中为灰度总级数;
计算原始图像直方图,即各灰度级的概率密度,,为原始图像的总像素数目;
计算累积分布函数
(式9)
计算最后的输出灰度级,
(式10)
式中是取整算符。令,,则计算式简化为
(式11)
用(原图像的灰度级函数)和的映射关系,修改原图像的灰度级,获得输出图像,其直方图为近似均匀分布。
下面将会给出相关的程序实现代码(使用MATLAB来实现)。
%在操作目录下面有一个2.jpg的图片
ima='2.jpg';
info=imfinfo(ima);
if info.ColorType=='truecolor'
source1=imread(ima);
source=rgb2gray(source1);
imwrite(source,'temp.jpg');
source=imread('temp.jpg');
info=imfinfo('temp.jpg');
elseif info.ColorType=='grayscale'
source=imread(ima);
end
figure(1),imshow(source)
figure(2),imhist(source)
%下面用来进行直方图均衡化处理
info=imfinfo(ima);
L=2^info.BitDepth;
recordin=[0,0]; %原图像的概率密度统计
sk=