图像增强

前言:图像增强的方法有很多,本篇博客只简单介绍个别图像增强的方法即相应的代码实现,更多的方法请查阅其他的博客或资料。

图像增强的目的:改善图像的视觉效果,或将图像转换成更适合于人眼观察和机器分析识别的形式,以便从图像中获取更有用的信息。

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 会使原来的图被新的内容覆盖

 

posted @ 2019-04-12 20:41  你的雷哥  阅读(2137)  评论(0编辑  收藏  举报