资源描述
图像的直方图均衡与分段灰度变换
F1003025 5100309018 董威
一、 基本原理与主要用途;
1.直方图均衡与分段灰度变换的基本原理;
直方图均衡化的目的是将原始图像的直方图变为均衡分布的形式,即将一已知灰度概率密度分布的图像,经过某种变换变成一幅具有均匀灰度概率密度分布的新图像,从而改善图像的灰度层次。它的基本思想是把原始图像的直方图变换成均匀分布的形式,这样就增加了像素灰度值的动态范围,从而达到了增强图像整体对比度的效果。
MATLAB图像处理工具箱中提供的histeq函数,可以实现直方图的均衡化。
线性变换是指在图像灰度范围内分段对逐个像元进行处理, 是将原图像亮度值动态范围按线性关系( 线性函数) 变换到指定范围或整个动态范围。在实际运算中给定的是 2 个亮度区间, 即要把输入图像的某个亮度值区间[ a, b] 映射为输出图像的亮度值区间[ c, d] 。即按线性比例对图像每一个象素灰度作灰度线性变换, 改善图像视觉效果。在实际图像处理中, 为了突出感兴趣的目标或灰
度区域, 相对抑制不感兴趣的灰度区域, 常常采用分段线性变换来进行图像灰度的处理。
MATLAB图像处理工具箱中提供的imadjust函数,可以实现上述的线性变换。
2.主要用途;
在获取图像的过程中,由于噪声,光照等外界环境或设备本身的原因,原始数字图像质量会退化。例如一般成像系统只具有一定的响应亮度,常出现对比度不足的弊病,影响视觉效果,在这些情况下需要对图像做增强处理。图像增强可以提高清晰度,改善图像的视觉效果,突出图像中的有用信息,削弱或消除不需要的信息。
二、 实现方案与源码;
1. 直方图均衡化;
MATLAB图像处理工具箱的histep函数可以很方便的实现直方图均衡化。
由于原图片是彩色,因而在转换前需要用rgb2gray函数将图片转化为灰度图。源程序如下:
a=imread('e:\b.bmp');%读取图像
b=rgb2gray(a); %转化为灰度图像
subplot(121),imshow(a);
subplot(122), imhist (b);
实现结果如下:
原图 转化为的灰度图像
subplot(121),imshow(b);
subplot(122), imhist (b); %显示灰度图像与其直方图
实现结果如下:
c=histeq(b); %直方图均衡化
subplot(121),imshow(b);
subplot(122), imhist (b); %显示处理后的图像与其直方图
实现结果如下:
不调用histeq函数,利用matlab语言也可直接编程实现图像的直方图均衡化处理。图像的灰度直方图均衡化公式:
公式中,T(rk)来表示原图像的第k个灰度级的转换函数。∑表示总和。∑nj/N表示0~j个灰度级的像素数量总和与像素总数的比值,也就是前面讲过的百分位(当前色阶与前面色阶的所有像素数量÷总像素数量)。∑Pr(rk)表示第0~k的灰度级出现概率累积相加。因为s是归一化的数值(s∈[0,1]),要转换为0~255的颜色值,需要再乘上255,即S=∑Pr(rk)*255。
流程如下:
读取图像 ——>转换为灰度图像 ——> 计算各灰度出现的概率——> 计算新的各灰度出现的概率——> 填充各像素点新的灰度值——>显示图像
相应的源程序如下:
a=imread('e:\b.bmp');%读取图像
[m,n,o]=size(a);
grayPic=rgb2gray(a);
figure,imshow(a);
figure,imshow(grayPic);
gp=zeros(1,256); %计算各灰度出现的概率
for i=1:256
gp(i)=length(find(grayPic==(i-1)))/(m*n);
end
figure,bar(0:255,gp);
title('原图像直方图');
xlabel('灰度值');
ylabel('出现概率');
newGp=zeros(1,256); %计算新的各灰度出现的概率
S1=zeros(1,256);
S2=zeros(1,256);
tmp=0;
for i=1:256
tmp=tmp+gp(i);
S1(i)=tmp;
S2(i)=round(S1(i)*256);
end
for i=1:256
newGp(i)=sum(gp(find(S2==i)));
end
figure,bar(0:255,newGp);
title('均衡化后的直方图');
xlabel('灰度值');
ylabel('出现概率');
newGrayPic=grayPic; %填充各像素点新的灰度值
for i=1:256
newGrayPic(find(grayPic==(i-1)))=S2(i);
end
figure,imshow(newGrayPic);
实现结果与调用函数一致。
2. 分段线性灰度变换;
通过分段线性变换, 原图 f ( x , y ) 中灰度值在 0到 a 和 b 到 M f 间的动态范围映射到 g ( x , y ) 后被压缩, 而 a 到 b 区间的动态范围增加, 从而增强了这个范围内的对比度 。 为了实现灰度线性变换在图像处理中的应用, 本文以彩色图像" b.bmp" 为例, 采用 M A T LA B 语言编制了分段线性变换的实现程序, 并获得了变换效果。编程思路如下:
设原图像f (x, y)灰度范围为[0,Mf],变换后的图像g (x, y)灰度范围为[0,Mg],
通过调整折线拐点的位置及控制分段直线的斜率,可对任一灰度区间进行扩展或压缩。将感兴趣的灰度范围线性扩展,相对抑制不不感兴趣的灰度区域。
源程序如下:
b=imread('e:\b.bmp');%读取图像
i=rgb2gray(b); %转化为灰度图像
di=double(i);
imhist(i);
a=min(min(di));
b=max(max(di));
c=120.0;d=150.0;
a1=0.0;b1=255.0;
c1=30.0;d1=171.0;
n1=find(di>=a&di<c);
n2=find(di>=c&di<d);
n3=find(di>=d&di<b);
di2=di;
di2(n1)=(di(n1)-a)*(c1-a1)/(c-a)+a1;
di2(n2)=(di(n2)-c)*(d1-c1)/(d-c)+c1;
di2(n3)=(di(n3)-d)*(b1-d1)/(b-d)+d1;
i2=uint8(di2);
subplot(221),imshow(i);
subplot(222),imshow(i2);
subplot(223),imhist(i);
subplot(224),imhist(i2);
实现结果如下:
原图转化为的灰度图像 分段灰度变换后图像
三、对实验结果的总结和分析;
直方图均衡化前后对比如下:
原图的灰度图像 变换后图像
通过对比可以看出原图动态范围较小, 像素集中在图像中间调区域, 亮调和暗调几乎没有像素, 所以图像平淡,对比度低。均衡化后直方图扩展到整个图象灰度允许的范围, 对比度明显增强。用直方图均衡化后,图像的直方图的灰度间隔被拉大了,均衡化的图像的一些细节显示了出来,这有利于图像的分析和识别。
分段灰度变换前后对比如下:
原灰度图 变换后图像
通过对比可以看出原图经过分段变换前后的对比图可知原图中间得到拉伸,对比度得到增强。在显示设备的亮度动态范围不足以满足要求时,可以用这种变换再显示,以利于在较大的灰度范围内显示出灰度值的差异。
图像的像素灰度变化是随机的,直方图的图形高低不齐,直方图均衡化就是用一定的算法使直方图大致平和。灰度变换主要通过对原图像素值进行重新分配, 提高图像的对比度; 直方图处理是把原始图的直方图变换为均匀分布的形式, 增加像素灰度值的动态范围以达到增图像整体对比度的效果;图像增强处理并不能使原始图像信息增加, 而只能增强对某种信息的辨别能力,提高了图像的视觉特性 。
展开阅读全文