数字图像处理:实验一

数字图像处理

采用Matlab对图像进行处理,实验记录;
参考文献:傅里叶变换图像增强直方图、均衡化

实验一:常用的数学变换

1.Matlab采用加法运算对两幅不同的图像(自定)进行叠加

  1. Matlab程序:(2016a版本)
1.	clear;  
2.	clc;  
3.	I= imread('OIP-C.jpg');%读入图片1  
4.	J=imread('OIP-D.jpg');%读入图片2  
5.	Is = stretchlim(I);%计算图片1的灰度图像的最佳输入区间  
6.	Js = stretchlim(J);%同理计算图片2  
7.	Ix=imadjust(I,Is,[0;1]);%调整图片1灰度图像的灰度范围  
8.	Jx=imadjust(J,Js,[0;1]);%同理调整图片2  
9.	P=imadd(Ix,Jx);%实现2副图相加运算  
10.	subplot(1,3,1);imshow(I);%创建子图、显示图像1  
11.	title('图像1');  
12.	subplot(1,3,2),imshow(J);%创建子图、显示图像2  
13.	title('图像2');  
14.	subplot(1,3,3),imshow(P);%创建子图、显示图像3  
15.	title('两幅图像进行相加操作后效果');  

  1. 原始图像、处理后的图像:
    在这里插入图片描述
  2. 处理的过程和结果的说明:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rOzwNcJ4-1667490230485)(file:///c:/user/default/AppData/Local/Temp/msohtmlclip1/01/clip_image003.gif)]

如上图算法流程图所示,在程序初始化清空工作区存储数据后,要对两幅不同图像进行叠加操作时,首先需要在Matlab中通过imread函数读取两幅不同图像并将两幅图片分别赋值给一个接收变量I,J;

考虑到两幅图片直接叠加会出现二次曝光的情况,我们需要对图片进行灰度处理操作,即先通过stretchlim函数计算出两幅图片灰度图像的最佳输入区间,并把区间值赋值给Is以及Js变量。再使用imadjust函数对两幅图片调整对应灰度图像的灰度范围,得到两张灰度处理过的图片Ix和Jx;最后通过imadd函数将Ix以及Jx进行叠加处理,得到两幅图片相加后的图片P。程序结束前分别显示两幅原始图片I和J以及处理后的图片P;从效果图上我们可以看出两幅图叠加在一起成功。

2. Matlab采用减法运算对两幅同一场景但存在差异的图像(自定)进行减法运算;

  1. Matlab程序:(2016a版本)
1.	clear;  
2.	clc;  
3.	I= imread('OIP-C.jpg');%读入图片1  
4.	J=imread('OIP-D.jpg');%读入图片2  
5.	P=imadd(I,J);%得到未进行灰度处理的加法图  
6.	imwrite(P,'OIP-E.jpg');%把处理过的图片写出保存  
7.	%图像相减  
8.	%实现2副存在差异的图相减运算
9.	Px=imsubtract(P,I);
10.	%实现2副相同图做减法运算 
11.	%Px=imsubtract(P,P);
12.	subplot(1,3,1),imshow(P),xlabel('A');  
13.	subplot(1,3,2),imshow(I),xlabel('B');  
14.	subplot(1,3,3),imshow(Px),xlabel('A-B');  

  1. 原始图像、处理后的图像;

情景一:相同场景存在差异图像减法运算:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-laCs3SvJ-1667490230486)(file:///c:/user/default/AppData/Local/Temp/msohtmlclip1/01/clip_image002.jpg)]

情景二:相同的两幅图像减法运算:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q60Dqwhd-1667490230487)(file:///c:/user/default/AppData/Local/Temp/msohtmlclip1/01/clip_image004.jpg)]

  1. 处理的过程和结果的说明:

在这里插入图片描述

如上图算法流程图所示,在程序初始化清空工作区存储数据后,首先要获取两幅同一场景但存在差异的图像,因此希望结合上述加法算法,把求出的加法图算作其他两幅图的相同场景存在差异图像使用;

想要获取未进行灰度操作的图像3,需要先读入图片1和2,使用imwrite函数保存图片3。在获得两幅具有差异的图像之后,使用imsubtract函数对两幅图进行减法运算,最后把处理后的图片显示出来即可;

​ 减法操作有两种使用通过修改代码获得两种图像,一种是相同场景存在差异的2个图像做减法运算,效果即如下所示,将A图与B图相同的元素去除;另一种情况是两种相同的图像做减法,可以看到减法处理后的整张图像呈现全黑现象,代表做减法的两幅图相同;

3. 采用Matlab对一幅图像(自定,建议有较明显纹理特征的)求功率谱和相位谱。

  1. Matlab程序:(2016a版本)
1.	clc;  
2.	clear;  
3.	img = imread('hua.jpg');  
4.	imggray = rgb2gray(img);%灰度处理  
5.	imgf = fft2(imggray);%傅里叶变换二维快速傅里叶变换函数  
6.	imgfshift = fftshift(imgf);%频谱图中零频率成分移动至频谱图中心  
7.	%获得傅里叶变换的幅度谱  
8.	imgA = log(1+abs(imgfshift));%对数变换,压缩动态范围  
9.	%由幅度谱求出功率谱 对信号傅里叶变换--幅度谱--取模求平方--功率谱  
10.	imgB=abs(imgfshift).^2;  
11.	imgB=10 * log10(imgB);  
12.	%获得傅里叶变换的相位谱  
13.	imgPhase = log(angle(imgfshift)*180/pi);  
14.	%变换后图像矩阵大多是复试矩阵,包含实部虚部  
15.	%需要对数组元素进行绝对值处理求其复数矩阵的模,在进行对数变换进行显示  
16.	imgPhase=log(abs(imgPhase)+1);  
17.	subplot(2,2,1);  
18.	imshow(img);  
19.	title('原图像');  
20.	subplot(2,2,2);  
21.	imshow(imggray);  
22.	title('灰度处理后的原图像');  
23.	subplot(2,2,3);  
24.	imshow(imgB,[]); %显示图像的功率谱,参数’[]'是为了将其值线性拉伸  
25.	title('图像功率谱');  
26.	subplot(2,2,4);  
27.	imshow(imgPhase,[]);  
28.	title('图像相位谱');  

  1. 原始图像、处理后的图像;
    在这里插入图片描述

  2. 处理的过程和结果的说明;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BHhb2NlV-1667490230492)(file:///c:/user/default/AppData/Local/Temp/msohtmlclip1/01/clip_image001.gif)]

如上图算法流程图所示,在程序初始化清空工作区存储数据后,首先读入一幅图片1,并使用rgb2gray函数获取其灰度图像;获取灰度图像后根据傅里叶变换得到频谱图,选择二维快速傅里叶变换函数fft2处理灰度图像,并将频谱图使用fftshift函数将频谱图中的0频率成分移至频谱图中心;接着分别由频谱图到功率图、频谱图到相位图的公式计算得出图片的功率图以及相位图;

首次运行程序时出现提示信息:“警告: 显示复数输入项的实部”,查询相关资料后知道若图像经过傅里叶变换直接用imshow函数显示,会提示如上错误。因此需要对处理过的相位图以及功率图进行二次处理,即对其使用abs函数求取其复数矩阵的模,辅以对数变换优化图像显示。

猜你喜欢

转载自blog.csdn.net/TianHW103/article/details/127680724
今日推荐