数字图像处理
采用Matlab对图像进行处理,实验记录;
参考文献:傅里叶变换、图像增强、直方图、均衡化
文章目录
实验一:常用的数学变换
1.Matlab采用加法运算对两幅不同的图像(自定)进行叠加
- 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('两幅图像进行相加操作后效果');
- 原始图像、处理后的图像:
- 处理的过程和结果的说明:
如上图算法流程图所示,在程序初始化清空工作区存储数据后,要对两幅不同图像进行叠加操作时,首先需要在Matlab中通过imread函数读取两幅不同图像并将两幅图片分别赋值给一个接收变量I,J;
考虑到两幅图片直接叠加会出现二次曝光的情况,我们需要对图片进行灰度处理操作,即先通过stretchlim函数计算出两幅图片灰度图像的最佳输入区间,并把区间值赋值给Is以及Js变量。再使用imadjust函数对两幅图片调整对应灰度图像的灰度范围,得到两张灰度处理过的图片Ix和Jx;最后通过imadd函数将Ix以及Jx进行叠加处理,得到两幅图片相加后的图片P。程序结束前分别显示两幅原始图片I和J以及处理后的图片P;从效果图上我们可以看出两幅图叠加在一起成功。
2. Matlab采用减法运算对两幅同一场景但存在差异的图像(自定)进行减法运算;
- 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');
- 原始图像、处理后的图像;
情景一:相同场景存在差异图像减法运算:
情景二:相同的两幅图像减法运算:
- 处理的过程和结果的说明:
如上图算法流程图所示,在程序初始化清空工作区存储数据后,首先要获取两幅同一场景但存在差异的图像,因此希望结合上述加法算法,把求出的加法图算作其他两幅图的相同场景存在差异图像使用;
想要获取未进行灰度操作的图像3,需要先读入图片1和2,使用imwrite函数保存图片3。在获得两幅具有差异的图像之后,使用imsubtract函数对两幅图进行减法运算,最后把处理后的图片显示出来即可;
减法操作有两种使用通过修改代码获得两种图像,一种是相同场景存在差异的2个图像做减法运算,效果即如下所示,将A图与B图相同的元素去除;另一种情况是两种相同的图像做减法,可以看到减法处理后的整张图像呈现全黑现象,代表做减法的两幅图相同;
3. 采用Matlab对一幅图像(自定,建议有较明显纹理特征的)求功率谱和相位谱。
- 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,并使用rgb2gray函数获取其灰度图像;获取灰度图像后根据傅里叶变换得到频谱图,选择二维快速傅里叶变换函数fft2处理灰度图像,并将频谱图使用fftshift函数将频谱图中的0频率成分移至频谱图中心;接着分别由频谱图到功率图、频谱图到相位图的公式计算得出图片的功率图以及相位图;
首次运行程序时出现提示信息:“警告: 显示复数输入项的实部”,查询相关资料后知道若图像经过傅里叶变换直接用imshow函数显示,会提示如上错误。因此需要对处理过的相位图以及功率图进行二次处理,即对其使用abs函数求取其复数矩阵的模,辅以对数变换优化图像显示。