给出直方图均衡化的数学推导步骤并用程序实现-Read 下载本文

内容发布更新时间 : 2024/5/17 10:48:39星期一 下面是文章的全部内容请认真阅读。

给出直方图均衡化的数学推导、步骤,并用程序实现。

解: 总体思想:首先考虑连续函数并且让变量r代表待增强图像的灰度级,假设r被归一化到区间[0,1],且r?0表示黑色及r?1表示白色。然后再考虑一个离散公式并允许像素值在区间[0,L?1]内。

对于连续函数而言,假设其变换函数为 s?T(r) 0?r?1 (公式1) 在原始图像中,对于每一个像素值r产生一个灰度值s。其中,变换函数要满足以下条件: (1)T(r)在区间0?r?1中为单值且单调递增。这是为了保证其逆函数的存在,并且输出图像从黑到白顺序增加;

(2)当0?r?1时,0?T(r)?1。这保证输出灰度级与输入有同样的范围。 把公式1的逆函数表示为 r?T?1(s) 0?s?1 (公式2)

一幅图像的灰度级可被视为区间[0,1]的随机变量。随机变量的一个最重要的基本描述是其概率密度函数。令Pr(r)和Ps(s)分别代表随机变量r和s的概率密度函数。此处带有下标的Pr(r)和Ps(s)用于表示不同的函数。由基本概率理论得到一个基本结果:如果Pr(r)和T(r)已知,且T?1(s)满足条件(1),那么变换变量s的概率密度函数Ps(s)可由以下简单

公式得到: Ps(s)?Pr(r)|dr| (公式3) ds因此,变换变量s的概率密度函数由输人图像的灰度级概率密度函数和所选择的变换函数所决定。

r在图像处理中一个尤为重要的变换函数: s?T(r)?Pr(w)dw (公式4)

0?该被积函数其值为正,并且函数积分是一个函数曲线下的面积,其内含为随机变量r的累积分布函数,所以它遵守该变换函数是单值单调增加的条件,因此满足条件(1)。同样地,区间[0,1]也满足条件(2)。其积分过程如下:

r?dsdT(r)d???P(w)dw??r??Pr(r) (式5) drdrdr?0?用这个结果代替

dr,代入式4,取概率为正,得到: dsPs(s)?Pr(r)dr1?Pr(r)?1 0?s?1 (式6) dsPr(r)因为Ps(s)是概率密度函数,在这里可以得出区间[0,1]以外它的值为0,可见式6中给出的

Ps(s)形式为均匀概率密度函数。换句话来说,公式4给出的变换函数会得到一个随机变量,

其特征为一个均匀概率密度函数,与Pr(r)的函数形式是无关的。总述以上,可以看出

r该等式右边的意义就是随机变量s?T(r)??Pr(w)dw便是一个直方图均衡化的基本原理,

0r的累积分布函数。这样便转化为了求输入图像灰度级r的累积分布函数。

下面开始讨论离散函数。对于离散值,处理的是它函数概率的和,而不是概率密度函数的积分。一幅图像中灰度级rk出现的概率近似为:

pk(rk)?nk k?0,1,....L?1 (式7) n其中, n是图像中像素的总和,nk是灰度级为rk的像素个数,L为图像中可能的灰度级总数。式4中变换函数的离散形式为:

sk?T(rk)??pr(rj)??j?0j?0kknjn k?0,1,....L?1 (式8)

因此,已处理的图像(即输出图像)由通过式8,将输入图像中灰度级为rk的各像素映射到输出图像中灰度级为sk的对应像素得到。与连续形式不同,一般不能证明离散变换能产生均匀概率密度函数的离散值(为均匀直方图)。但是不论怎样,可以很容易地看出,式8的应用

有展开输入图像直方图的一般趋势,以至于直方图均衡化过的图像灰度级能跨越更大的范围。至此,便给出了整个的证明过程。

下面列出了直方图均衡化的一般实现过程:

(1) 统计原始输入图像各灰度级的像素数目ni,i?0,1...,L?1,其中L为灰度总级

数;

(2) 计算原始图像直方图,即各灰度级的概率密度,Pi(ri)?的总像素数目;

(3) 计算累积分布函数 sk(rk)?ninn,为原始图像

?P(r) k?0,1,....L?1 (式9)

iii?0k(4) 计算最后的输出灰度级,

gk?INT??gmax?gmin?sk(rk)?gmin?0.5?/(L?1) k?0,1,....L?1 (式10)

式中INT??是取整算符。令gmin?0,gmax?L?1,则计算式简化为

gk?INT??L?1?sk(rk)?0.5?/(L?1) (式11)

(5) 用fk(原图像的灰度级函数)和gk的映射关系,修改原图像的灰度级,获得输出图像,其直方图为近似均匀分布。

下面将会给出相关的程序实现代码(使用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=[0,0]; %原图像的累积函数

recordout=[0,0];%变换后图像的概率密度统计 change=[0,0]; %转换函数 for i=3:1:L %初始化空间 recordin(i)=0; recordout(i)=0; sk(i)=0;

change(i)=0; end

for i=1:1:info.Height for j=1:1:info.Width

recordin(source(i,j)+1)=recordin(source(i,j)+1)+1; % end end

n=info.Height*info.Width; %计算像素总值 %下面的方法亦可以用来计算n % n=0;

% for i=1:1:L

% n=n+recordin(i); % end

统计原图灰度的概率分布