一、处理内容
(1)获取一帧图像,对该图像进行正变换、反变换、指数变换、对数变换、幂指数变换,并分析各种变换中参数对增强图像的影响;
(2)获取一帧图像,对该图像进行分段线性变换处理,并分析各种变换中参数对增强图像的影响。
二、基本原理
2.1线性变换
图像中常会出现对比度不够的情况,这可能是因图像记录装置的动态范围太小所至,也可能是由于摄影过程中原先曝光不足所造成的。增大对比度的方法是简便的,可通过灰度范围的线性变换来达到。我们假定原图像的灰度范围是[a, b],变换后图像的灰度范围希望扩大到[m, n],那么应采用下述线性变换:
(1)
2.2分段线性变换
分段线性变换也是常用的一种灰度变换方法,通常都是分成三段。这种变换的数学表示如下:
(2)
2.3直方图修正
直方图修正的应用非常广泛。例如:在医学上,为了改善X射线机操作人员的工作条件,可以采用低强度X射线曝光,但是这样获得的X光片灰度级集中哎暗区,许多图像细节无法看清,判读困难,通过修正是灰度级分布在人眼合适的亮度区域,就可以使X光片中的细节,如筋骨,关节等清晰可见。
1)直方图均衡化处理
灰度级的直方图就是反映一幅图像中的灰度级与出现这种灰度的概率之间的关系的图形。设变量代表图像中的像素灰度级。在图像中,像素的灰度级可作归一化处理,值将限定在下述范围之内。在灰度级中,代表黑,代表白。对于一幅给定的图像来说,每一个像素取得[0, 1]区间内的灰度级是随机的,也就是说是一个随机变量。假定对每一瞬间它们是连续的随机变量,那么,就可以用概率密度函数来表示原始图像的灰度分布。如果用直角坐标系的横轴代表灰度级,用纵轴代表灰度的概率密度函数,这样就可以针对一幅图像在这个坐标系中作一曲线,这条曲线就是概率论中的分布密度曲线。
为了有利于数字图像处理,必须引入离散形式。在离散形式下,用代表离散灰度级,用代表,并且有下式成立:
(3)
式中为图像中出现这种灰度的像素数,是图像中像素的总数,而就是概率论中所说的频数,在直角坐标系中作出与关系的图形,这个图形称为直方图。一幅给定的图像的灰度级分布在范围内。可以对[0, 1]区间内的任一个值进行如下变换:
(4)
也就是说,通过上述变换,每一个原始图像的像素灰度值都对应产生一个值。变换函数应满足下列条件:
1)在0≤r≤1区间内,为单值单调增加。
2)对于0≤r≤1,有0≤T(r)≤1。
这里的第一个条件保证了灰度级从白到黑次序不变。第二个条件则保证了映射后的像素灰度值在允许的范围内。从到的反变换关系可表示为:
(5)
由概率论可知,如果已知随机变量的概率密度为,而随机变量是的函数,即,的概率密度可以由求出。
因为是单调增加的,由数学分析可知,它的反函数也是单调函数。在这种情况下,当且仅当时发生,所以可以求得随机变量的分布函数为:
(6)
对上式两边求导,即可以得到随机变量的分布密度函数,为:
(7)
可见,通过变换函数可以控制原图像灰度级的概率密度函数,从而改善原图像的灰度层次。直方图均衡化处理是以累积分布函数变换法为基础的直方图修正法。假定变换函数为:
(8)
式中是积分变量,而是的累积分布函数(CDF)。这里,累积分布函数是的函数,并且单调地从0增加到1,所以这个变换函数满足于在0≤r≤1区间内单值单增,对于0≤r≤1,有0≤T(r)≤1的两个条件。
对式(8)求导,则:
(9)
把结果代入式(9),则:
(10)
由上面的推导可见,在变换后的变量的定义域内的概率密度是均匀分布的。由此可见,用累积分布函数作为变换函数可以产生一幅灰度级分布具有均匀概率密度的图像。其结果扩展了像素取值的动态范围。
上面的修正方法是以连续随机变量为基础进行讨论的。为了对数字图像进行处理,必须引入离散形式的公式。当灰度级是离散值的时候,可以用频数近似代替概率值,即
(11)
式中是灰度级的总数目,是取这种灰度的概率,为图像中出现这种灰度的次数,是图像中像素的总数。通常把为得到均匀直方图的图像增强技术叫做直方图均衡化处理。式(8)的离散形式可表示为:
(12)
其反变换为:
(13)
三、结果
对于幂指数变换,改变伽马值会改变亮暗,与对数变换不同,伽玛变换可以根据γ的不同取值选择性地增强低灰度区域的对比度或是高灰度区域的对比度。γ即决定了是增强低灰度(阴影区域)还是增强高灰度(髙亮区域)其中:γ>1时,图像的高灰度区域对比度得到增强;γ<1时,图像的低灰度区域对比度得到增强;γ=1时,这灰度变换是线性的,即不改变原图像,同时对比度也会变换。分段线性变换函数可以扩展图像灰度级动态范围,分段灰度变换法的优点是可以根据用户的需要,拉伸特征目标的灰度细节,相对抑制不感兴趣的背景的灰度级。
四、程序
我用的MATLAB编写的,当然也可以用C++。。。
clear all
clc
A=imread('C:\Users\Administrator\Desktop\22.bmp');
A=rgb2gray(A);
subplot(221);
imshow(A);title('原始图像')
[h,w]=size(A);
%正变换
z=zeros(h,w);
for i=1:h
for j=1:w
z(i,j)=2*A(i,j);
end
end
subplot(222);
imshow(uint8(z));title('正变换灰度图像');
%反变换
f=zeros(h,w);
for i=1:h
for j=1:w
f(i,j)=255-A(i,j);
end
end
subplot(223);
imshow(uint8(f));title('反变换灰度图像');
%幂指数变换
if length(size(A))>3
A=rgb2gray(A);
end
A=double(A);
a=0.3;
E=A.^a;
subplot(224);
imshow(E,[]);
title('幂0.3次变换灰度图像');
%指数变换
c=double(1.05);
for i = 1:h
for j = 1: w
f(i,j)=c^A(i,j);
end
end
figure(2)
subplot(221);
imshow(uint8(f));title('指数变换灰度图像');
%对数变换
for i=1:h
for j = 1: w
f(i,j)=20*log(double(A(i,j)+1));
end
end
subplot(222);
imshow(uint8(f));
title('对数变换灰度图像');
%分段线性变换
x0=0;y0=0; x1=20;y1=55;
x2=221;y2=180;x3=255;y3=255;
subplot(223);
plot([x0,x1,x2,x3],[y0,y1,y2,y3]);
title('分段函数图像')
r1=(y1-y0)/(x1-x0);
i1=-r1*x0+y0;
r2=(y2-y1)/(x2-x1);
i2=-r2*x1+y1;
r3=(y3-y2)/(x3-x2);
i3=-r3*x2+y2;
axis([0 255 0 255]);
[m,n]=size(A);
h=double(A);
for i=1:m
for j=1:n
t=h(i,j);
u(i,j)=0;
if((t>=x0)&&(t<=x1))
u(i,j)=r1*t+i1;
else
if ((t>=x1)&&(t<=x2))
u(i,j)=r2*t+i2;
else
if((t>=x2)&&(t<=x3))
u(i,j)=r3*t+i3;
end
end
end
end
end
subplot(224);imshow(mat2gray(u));
title('分段线性变换灰度图像');