前言:图像增强的方法有很多,本篇博客只简单介绍个别图像增强的方法即相应的代码实现,更多的方法请查阅其他的博客或资料。
图像增强的目的:改善图像的视觉效果,或将图像转换成更适合于人眼观察和机器分析识别的形式,以便从图像中获取更有用的信息。
1 反转变换
下图(a)是一幅X射线照片,其中显示一小块病变。尽管事实上两幅图像在视觉内容上都一样,
但应注意,在这种情况下,分析乳房组织时使用反转图像会容易得多
1 image1=imread('D:/picture/ZiXia.jpg'); 2 subplot(121); 3 imshow(image1); 4 image2=imcomplement(image1);%imcomplement为一个函数的名称,其可以对图像数据进行取反运算(实现底片效果)。 5 subplot(122); 6 imshow(image2);
紫霞仙子白白的脸因为颜色反转变成偏黑色,黑色的秀发变成了白发,衣服的反转更明显,变过后的样子有点小恐怖呐
2基于直方图的图像增强
上面的一道题大致就说明了直方图增强的原理,从该例可知,直方图均衡化的实质是减少图像的灰度级以换取对比度的加大。
在均衡过程中,原来的直方图上频数较小的灰度级被归入很少几个或一个灰度级内。
若这些灰度级所构成的图像细节比较重要,则需采用局部区域直方图均衡。
下面的函数是求图像的直方图的方法
1 I=imread('C:/lenagray.jpg'); 2 %I=double(I); 3 for i=1:256 4 h(i)=sum(sum(I==i-1)); end% 5 subplot(121); 6 imshow(I); 7 title('原始图像'); 8 subplot(122) 9 plot(h); 10 title('图像的直方图');
可能大家对于h(i)=sum(sum(I==i-1)); end%这句代码有点不理解,其实就是计算I中i的个数
那为啥是两个sum呢,看一下下面的例子就应该明白了
直方图均衡化
1 I=imread('D:/picture/lenagray.jpg'); 2 K=16; 3 H=histeq(I,K);%均衡化后的直方图只有16个灰度级; 4 figure,subplot(2,2,1); 5 imshow(I,[]); 6 subplot(2,2,2); 7 imshow(H,[]),hold on%注释一 8 subplot(223); 9 hist(double(I),16), 10 subplot(224) 11 hist(double(H),16)
3Butterworth低通滤波器(频率域图像增强)
1 image1=imread('D:/picture/boy.jpg'); 2 %image1=rgb2gray(image1); 3 figure 4 imshow(image1) 5 I1=fftshift(fft2(image1)); 6 [M,N]=size(I1); 7 n=2; 8 d0=30; 9 n1=floor(M/2); 10 n2=floor(N/2); 11 for i=1:M; 12 for j=1:N 13 d=sqrt((i-n1)^2+(j-n2)^2); 14 H=1/(1+(d/d0)^(2*n));%对应的公式 15 I2(i,j)=H*I1(i,j); 16 end 17 end 18 I2=ifftshift(I2); 19 I3=real(ifft2(I2)); 20 figure; 21 imshow(I3,[]); 22 23
4同态滤波
1 [image_0,map]=imread('D:/picture/lenagray.jpg'); 2 image_1=log(double(image_0)+1); 3 image_2=fft2(image_1); 4 n=3; D0=0.05*pi; rh=0.8; rl=0.5; 5 [row,col]=size(image_2); 6 for k=1:1:row 7 for l=1:1:col 8 D1(k,l)=sqrt((k^2+l^2)); 9 H(k,l)=rl+(rh/(1+(D0/D1(k,l))^(2*n))); 10 image_2(k,l)=image_2(k,l)*H(k,l); 11 end 12 end 13 image_4=ifft2(image_2); 14 image_5=(exp(image_4)-1); 15 subplot(121),imshow(image_0,map);title('原图') 16 subplot(122),imshow(real(image_5),map);title('同态滤波后的图')
注释一
hold on 和hold off(默认),是相对使用的
前者的意思是,你在当前图的轴(坐标系)中画了一幅图,再画另一幅图时,原来的图还在,与新图共存,都看得到
后者表达的是,你在当前图的轴(坐标系)中画了一幅图,此时,状态是hold off,则再画另一幅图时,原来的图就看不到了,在轴上绘制的是新图,原图被替换了
看下面三个例子
p1
1 t=(0:pi/100:pi)'; 2 y1=sin(t)*[1,-1]; 3 y2=sin(t).*sin(9*t); 4 t3=pi*(0:9)/9; 5 y3=sin(t3).*sin(9*t3); 6 plot(t,y1,'r:',t,y2,'-bo') 7 hold on 8 plot(t3,y3,'s','MarkerSize',10,'MarkerEdgeColor',[0,1,0],'MarkerFaceColor',[1,0.8,0]) 9 axis([0,pi,-1,1]) 10 hold off
p2
1 t=(0:pi/100:pi)'; 2 y1=sin(t)*[1,-1]; 3 y2=sin(t).*sin(9*t); 4 t3=pi*(0:9)/9; 5 y3=sin(t3).*sin(9*t3); 6 plot(t,y1,'r:',t,y2,'-bo') 7 %hold off 8 plot(t3,y3,'s','MarkerSize',10,'MarkerEdgeColor',[0,1,0],'MarkerFaceColor',[1,0.8,0]) 9 axis([0,pi,-1,1])
hold on 会使接下来画的图累加在原来的图上,hold off 会使原来的图被新的内容覆盖