实验复习之数字图像处理实验

实验一:图像运算

 实验步骤
(1). 编写程序add.m, subtract.m, immultiply.m文件分别实现两幅图像的加,减、乘。
(2). 从矩阵的角度编写程序实现图像的加法运算得到混合图像,然后将混合图像与背景图像做减法运算。
(3). 编写程序实现图像的局部显示。
(4). 使用subplot函数实现多图像的显示。

考虑到图像进行运算时需要满足两幅图像的大小一致,故在读入两幅不同大小的图像后运用imresize函数进行图像大小的调整,具体方法是读取到各自图像的行列大小,然后选择行和列多的数目,运用imresize函数进行填充。

实验代码如下:

i=imread('Lena.jpg');
j=imread('hfut.png');
m=size(i);
n=size(j);
a = [m(1),n(1)];
b = [m(2),n(2)];
i=imresize(i,[max(a) max(b)]);
j=imresize(j,[max(a) max(b)]);
k1=imadd(i,j);
subplot(2,2,1),imshow(k1),title('加法运算');
k2=imsubtract(i,j);
subplot(2,2,2),imshow(k2),title('减法运算');
k3=immultiply(i,j);
subplot(2,2,3),imshow(k3),title('乘法运算');

k4=imsubtract(k1,i);
subplot(2,2,4),imshow(k4),title('先加后减')

B=zeros(max(a),max(b),3); 

B(100:200,100:200,1:3)=1;
B1=uint8(B);
k5=immultiply(j,B1);
figure,imshow(k5),title('局部显示')


实验结果图如下:

读入的两张图为:

结果图为:

与部分为1,其余为0的相同大小矩阵相乘显示局部图像结果为:

思考题:

背景减法是经典的应用。使用背景减法进行运动目标的检测可提取出完整的图像,对动态场景的变化,感染等特别敏感的背景图像获取的理想情况是没有运动因素。但是这种固定背景图像的方法,只适用于外界条件比较好的场合。

实验二:图像变换

实验步骤
(1). FFT变换
1)选取一幅图像,编程并实现图像的频率位移,移到窗口中央。
2)选取一幅图像,进行离散傅里叶变换,再对其进行一定角度的旋转,进行离散傅里叶变换。

(2). DCT变换
1)真彩色图像转换成灰度图像
2)计算二维DCT变换
3)显示并观察变换图像
4)把变换矩阵中小于10的值置换为0,然后用余弦反变换重构图像。
5)显示重构图像


实验代码如下:

I=zeros(256,256);
I(88:168,124:132)=1;  %产生图像256*256的图像
subplot(2,2,1),imshow(I),title('原始图像');
J=fft2(I);
F=abs(J);
J1=fftshift(F);subplot(2,2,2),
imshow(J1),title('原始图形频谱图');
%对原始图像进行旋转
J=imrotate(I,90,'bilinear','crop');
subplot(2,2,3),
imshow(J),title('原始图像旋转90度');
%求旋转后图像的傅里叶频谱
J1=fft2(J);
F=abs(J1);
J2=fftshift(F);subplot(2,2,4),
imshow(J2),title('旋转90度后的频谱图')

%离散余弦变换
I=rgb2gray(imread('Lena.jpg'));

figure,subplot(3,1,1),imshow(I),title('原始图形')
I1=dct2(I);
subplot(3,1,2),imshow(log(abs(I1))),title('离散余弦变换')
I1(I1<10)=0;
I2=idct2(I1)./255;
subplot(3,1,3),imshow(I2),title('离散反变换')

实验结果图如下:

思考题:

1.从旋转性质和尺度变换性质分析实验结果
旋转特性是指分f(x,y)在空间域旋转一个角度,F(u,v)再频率域也旋转相同的角度。尺度变换特性是指,空间比例尺寸展宽,频域比例尺度的压缩,幅值变为原来的倍数。本次实验对图像空域中进行了90度的旋转,可以发现在频率域中也进行了90度的旋转。
2.傅里叶变换频谱特性及应用
左上角为直流成分,变换结果的四个角周围对应于低频成分,中央部分对应于高频成分。常被用来分析信号,在频域中进行图像增强,应用于图像编码等领域。
3.为什么图像编码采用DCT变换?
DCT可以达到FFT相同的效果,同时数据量又不是很大。除此之外,DCT压缩算法 ,可以降低了视频信号的空间冗余度。它将运动补偿误差或原画面的信息转换为不同频率的系数值。

实验三:图像的灰度运算

实验步骤
(1)选择一幅图像lena.jpg,设置输入/输出变换的灰度级围:
                a=0.3,b=0.6,c=0.1,d=0.9。
(2)设置非线性扩展函数的参数c=2。
(3)采用灰度倒置变换函数s=255-r进行图像变换。
(4)设置二值化图像的阈值,分别为level=0.4,或level=0.7。

实验代码如下:

I=imread('Lena.jpg');
figure;
subplot(2,3,1);
imshow(I);
title('原图');

J=imadjust(I,[0.3;0.6],[0.1;0.9]);     %设置灰度变换的范围
subplot(2,3,2);
imshow(J);
title('线性扩展');

I1=double(I);                      %将图像转换为double类型
I2=I1/255;                         %归一化此图像
C=2;
K=C*log(1+I2);                     %求图像的对数变换
subplot(2,3,3);
imshow(K);
title('非线性扩展');

M=im2bw(I,0.5);
M=~M;                  %将此图像取反
subplot(2,3,4);
imshow(M);
title('灰度倒置');

N1=im2bw(I,0.4);               %将此图像二值化,阈值为0.4
N2=im2bw(I,0.7);               %将此图像二值化,阈值为0.7
subplot(2,3,5);
imshow(N1);
title('二值化阈值0.4');
subplot(2,3,6);
imshow(N2);
title('二值化阈值0.7');

实验结果如下:

思考题:

比例线性变换是对每个线性段逐个像素进行处理,可将原图像灰度值动态范围按线性关系式扩展到指定范围或整个动态范围。非线性扩展常用对数变换,指数变换。对数变换常用来扩展低值灰度,压缩高值灰度,使低值灰度的图像细节更容易看清。指数变换,则起到相反的效果。
 

实验四:图像增强

实验步骤
(1).选取一幅图像,加入椒盐噪声,分别用均值滤波和中值滤波进行平滑处理,比较滤波效果,
(2).选取一幅含高斯噪声图像,用巴特沃斯低通,指数低通和梯形低通处理该图像。
(3).选取一幅图像,采用sobel算子,prewitt算子和拉普拉斯算子对图像进行锐化处理
(4).选取一副图像,采用同态滤波对其进行处理。

实验代码如下:

clc,clear,close all;
I=rgb2gray(imread('Lena.jpg'));
I1 = imnoise(I,'salt & pepper',0.02);       %添加椒盐噪声 
I2 = double(I1)/255;                      %归一化处理
ave=fspecial('average',3);                %产生3×3的均值模版
K = conv2(I2,ave,'same');                 %均值滤波3×3
N = medfilt2(I2,[4 4]);                   %中值滤波4×4模板
figure
subplot(2,2,1),imshow(I),title('原始图像');
subplot(2,2,2),imshow(I1),title('加椒盐噪声');
subplot(2,2,3),imshow(K),title('均值滤波图像');
subplot(2,2,4),imshow(N),title('中值滤波图像');

[I,map]= imread('Lena.jpg');
I=rgb2gray(I);
noisy = imnoise(I,'gaussian',0.01);
imshow(noisy,map) ;
[M,N]= size(I);
F= fft2(noisy);
fftshift(F);
Dcut = 100;
D0 = 150;
D1= 250;
for u=1:M
    for v=1:N
        D(u,v)=sqrt(u^2 + v^2);
        BUTTERH(u,v)=1/(1+ (sqrt(2)-1) * (D(u,v)/Dcut)^ 2);
        EXPOTH(u,v) = exp(log(1/sqrt(2))*(D(u,v)/Dcut)^2);
        if D(u,v)<D0
            TRAPEH(u,v) = 1;
        elseif D(u,v)<=D1
            TRAPEH(u,v) =(D(u,v)-D1)/(D0-D1);
        else TRAPEH(u,v)= 0;
        end
    end
end
BUTTERG=BUTTERH.*F;
BUTTERfiltered = ifft2(BUTTERG) ;
EXPOTG=EXPOTH.*F;
EXPOTGfiltered = ifft2(EXPOTG) ;
TRAPEG = TRAPEH.* F;
TRAPEfiltered = ifft2(TRAPEG) ;
figure
subplot(2,2,1),imshow(noisy);title('高斯噪声');
subplot(2,2,2),imshow(BUTTERfiltered,map);title('巴特沃斯低通滤波');
subplot(2,2,3),imshow(EXPOTGfiltered,map);title('指数型低通滤波');
subplot(2,2,4),imshow(TRAPEfiltered,map);title('梯形低通滤波');

I=rgb2gray(imread('Lena.jpg'));
figure
subplot(2,2,1),imshow(I);title('原图像');%显示原图像 
H=fspecial('sobel'); %应用sobel算子锐化图像 
I2=filter2(H,I); %sobel算子滤波锐化 
subplot(2,2,2);imshow(I2);%显示sobel算子锐化图像
title('sobel算子锐化图像');
I=double(I);
h=[0,1,0,1,-4,1,0,1,0];
J=conv2(I,h,'same');
subplot(2,2,3),imshow(J);title('laplace算子锐化图像');

I=double(I);
h1=[1,0,-1,1,0,-1,1,0,-1];
J1=conv2(I,h1,'same');
subplot(2,2,4),imshow(J1);
title('prewitt算子锐化图像');

I=rgb2gray(imread('Lena.jpg'));
figure
subplot(1,2,1),imshow(I);title('同态滤波之前原始图像');     
I=double(I);    
[M,N]=size(I);    
rL=0.5;    
rH=5;%可根据需要效果调整参数    
c=3;    
d0=9;    
I1=log(I+1);%取对数    
FI=fft2(I1);%傅里叶变换    
n1=floor(M/2);    
n2=floor(N/2);    
for i=1:M    
    for j=1:N    
        D(i,j)=((i-n1).^2+(j-n2).^2);    
        H(i,j)=(rH-rL).*(exp(c*(-D(i,j)./(d0^2))))+rL;%高斯同态滤波    
    end    
end    
I2=ifft2(H.*FI);%傅里叶逆变换    
I3=real(exp(I2));    
subplot(1,2,2),imshow(I3,[]);title('同态滤波增强后'); 

实验结果如下:

同态增晰的目的:消除不均匀照度的影响而又不损失图象细节。同态滤波是一种在频域中同时将图像亮度范围进行压缩和将图像对比度进行增强的方法。大致原理为:在突出边缘的同时又不想使低频部分由于高通滤波而变模糊,所以在高通滤波器上再加上一个常量,但这样做又会导致高频成分的增加,所以在高频滤波后在对其进行直方图平坦化,使灰度值重新分配,这样处理的结果会使图像的质量得到巨大的改善。

思考题:

1. 比较平滑模板与锐化模板?
平滑模板和锐化模板最大的差别就是他们要实现的目的是不一样的。平滑模板是为了消除噪声,去除太小的细节。二锐化模板的目的是为了曾强被模糊的细节。
2. 为什么在频率域用原始图减去高通滤波图得到低通滤波的结果?
图像中的高频成分对应图像的边缘,轮廓;低频成分对应于图像变化缓慢的区域。一幅图像是有高频和低频成分共同构成。也即使用原始图像减去高通滤波的高频图像可以得到低通滤波后的效果。

实验五:图像分割

实验步骤
(1). 选取一幅图像,用Sobel,Roberts,Prewitt,LOG,Canny算子进行边缘检测,观察效果。
(2). 选取图像circuit.tif,用Hough变换在图像中检测直线。
 

实验代码如下:

clc,clear,close all;
f=rgb2gray(imread('Lena.jpg'));
gv=edge(f,'sobel');
subplot(2,3,1),imshow(gv);
title('sobel算子提取边缘');
 
gv=edge(f,'roberts');
subplot(2,3,2),imshow(gv);
title('roberts算子提取边缘');
 
gv=edge(f,'prewitt');
subplot(2,3,3),imshow(gv);
title('prewitt算子提取边缘');
 
gv=edge(f,'log');
subplot(2,3,4),imshow(gv);
title('log算子提取边缘');
 
gv=edge(f,'canny');
subplot(2,3,5),imshow(gv);
title('cannny算子提取边缘');

I = imread('circuit.tif');
Img = edge(I,'prewitt');
[H,T,R] = hough(Img);

P= houghpeaks(H,15,'threshold',ceil(0.3*max(H(:))));
lines = houghlines(Img,T,R,P,'FillGap',10,'MinLength',20);

figure,imshow(I),hold on
max_len = 0;
for k =1:length(lines)   
    xy=[lines(k).point1;lines(k).point2];
    plot(xy(:,1),xy(:,2),'LineWidth',3,'Color','green');
    plot(xy(1,1),xy(1,2),'LineWidth',3,'Color','yellow');
    plot(xy(2,1),xy(2,2),'LineWidth',3,'Color','red');
end 

实验结果如下:

 思考题:

通过边缘特征提取来看。采用一阶微分算子进行边缘检测时,除了微分算子对边缘结果有影响外,阈值的选择也有重要的影响。比较几种算法的边缘检测结果,Canny算子提取边缘较完整,效果优于其他算子,其次是Prewitt算子,其边缘比较完整。再次之就是Sobel算子。

  • 19
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值