当前位置:网站首页>Matlab学习11-图像处理之图像变换
Matlab学习11-图像处理之图像变换
2022-08-03 11:30:00 【CHengYuP】
一、傅里叶变换快速卷积
代码
% 傅里叶变换快速卷积
disp("步骤1:生成3*3的矩阵A和B");
A =[4 5 6
7 8 9];
B=[ 3 2
1 0];
disp("步骤2:验证利用卷积函数直接进行卷积");
AconvB=conv2(A,B);
disp("步骤3:对A和B补零,使其大小均为(2+2-1)X(3+2-1),即3X4");
A(3,4)=0;%对矩阵A补零
A0=A;
B(3,4)=0;%对矩阵B补零
B0=B;
disp("步骤4:对A和B分别进行傅里叶变换,并将变换结果相乘");
fftA0=fft2(A0);
fftB0=fft2(B0);
A0dcB0=fftA0.*fftB0;
disp("步骤5:对结果进行傅里叶变换");
ifftA0dcB0=ifft2(A0dcB0); %正变换与反变换结合
mm=uint8(ifftA0dcB0);
二、模板匹配
效果
代码
% 模板匹配示例。
%步骤1
%读入匹配图像
fxy=imread("img/F6_17a.bmp");
subplot(3,3,1),imshow(fxy),xlabel("(a)步骤1:二值原始图像");
axis image off
%把匹配图像转为二值图像
Bwfxy=im2bw(fxy);
%步骤2
Fuv=fft2(Bwfxy);
subplot(3,3,2),mesh(abs(fftshift(Fuv))),xlabel("(b)步骤2:二值原始图像对称傅里叶幅度图");
grid on;%网格线
axis([0 500 0 500 0 40000]);
%步骤3
%读入模板
txy=imread("img/F6_17c.bmp");
subplot(3,3,3),imshow(txy),xlabel("(c)步骤3:二值模板图像");
axis image off;
%把模板图像转为二值图像
Bwtxy=im2bw(txy);
%步骤4
RotBwtxy=rot90(Bwtxy,2);
subplot(3,3,4),imshow(RotBwtxy),xlabel("(d)步骤4:二值模板图像旋转180度");
axis image off;
%步骤5
Tuv=fft2(RotBwtxy);
subplot(3,3,6),mesh(abs(fftshift(Tuv))),xlabel("(e)步骤5:二值模板图像对称傅里叶幅度图");
grid on;%网格线
axis([0 500 0 500 0 4000]);
%步骤6
%模板与匹配图像相关计算
f=ifft2(Fuv.*Tuv);
fxy_result=abs(fftshift(f));
subplot(3,3,7),mesh(fxy_result,[-10 50]),xlabel("(f)步骤6:相关性矩阵的模板矩阵三维图");
grid on;%网格线
axis([0 500 0 500 0 4000]);
%步骤7
thresh=max(fxy_result(:));%设置阈值为图像数据中的最大值
subplot(3,3,9),imshow(fxy_result>=thresh-250),xlabel("(g)步骤7:模板匹配结果");
三、二维离散余弦变换
效果
代码
% 二维离散余弦变换原理示例。
fxy=[ 0 20 40 60
70 90 110 130
140 160 180 200
210 230 240 250];
subplot(2,3,1),imshow(fxy,[]),xlabel("(b)原始图像");
subplot(2,3,2),stem3([1:4],[1:4],fxy,'.'),axis([0 5 0 5 0 260]),xlabel("(c)原始图像三维示意图");
Fuv=dct2(fxy); %离散余弦变换结果
ABSFuv=abs(Fuv); %离散余弦变换结果的绝对值
subplot(2,3,3),imshow(ABSFuv,[]),xlabel("(f)离散余弦变换幅度谱图像");
subplot(2,3,4),stem3([1:4],[1:4],ABSFuv,'.'),axis([0 5 0 5 0 600]),xlabel("(g)离散余弦变换幅度谱三维示意图");
LogABSFuv=log(ABSFuv); %离散余弦变换结果的绝对值对数
subplot(2,3,5),imshow(LogABSFuv,[]),xlabel("(i)幅度谱对数结果图像");
subplot(2,3,6),stem3([1:4],[1:4],LogABSFuv,'.'),axis([0 5 0 5 0 7]),xlabel("(j)幅度谱对数结果三维示意图");
四、JPEG图像压缩典型算法
效果
代码
% JPEG图像压缩典型算法。
fxy=imread("img/lena.bmp");
subplot(2,2,1),imshow(fxy),xlabel("(a)原始图像");
fxy=im2double(fxy);
H=dctmtx(8);%产生8*8的DCT变换矩阵
Fuv1=blkproc(fxy,[8 8],'P1*x*P2',H,H');%分块进行DCT变换
mask1=[ 1 1 0 0 0 0 0 0
1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
];%二值掩膜,用于压缩DCT系数
Fuv1=blkproc(Fuv1,[8,8],'P1.*x',mask1);%仅保留DCT系数左上角的3个系数
fxy1=blkproc(Fuv1,[8,8],'P1*x*P2',H',H);%分块进行逆DCT变换
subplot(2,2,2),imshow(fxy1,[]),xlabel("(b)重构图像(保留左上角的3个幅度谱)");
Fuv2=blkproc(fxy,[8,8],'P1*x*P2',H,H'); %分块进行DCT变换
mask2=[ 1 1 1 0 0 0 0 0
1 1 0 0 0 0 0 0
1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
];%二值掩膜,用于压缩DCT系数
Fuv2=blkproc(Fuv2,[8,8],'P1.*x',mask2);%仅保留DCT系数左上角的6个系数
fxy2=blkproc(Fuv2,[8,8],'P1*x*P2',H',H);%分块进行逆DCT变换
subplot(2,2,3),imshow(fxy2,[]),xlabel("(c)重构图像(保留左上角的6个幅度谱)");
Fuv3=blkproc(fxy,[8,8],'P1*x*P2',H,H'); %分块进行DCT变换
mask3=[ 1 1 1 1 0 0 0 0
1 1 1 0 0 0 0 0
1 1 0 0 0 0 0 0
1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
];%二值掩膜,用于压缩DCT系数
Fuv3=blkproc(Fuv3,[8,8],'P1.*x',mask3);%仅保留DCT系数左上角的6个系数
fxy3=blkproc(Fuv3,[8,8],'P1*x*P2',H',H);%分块进行逆DCT变换
subplot(2,2,4),imshow(fxy3,[]),xlabel("(d)重构图像(保留左上角的10个幅度谱)");
总结
边栏推荐
- Question G: Word Analysis ← Questions for the second provincial competition of the 11th Blue Bridge Cup Competition
- 代码分析Objective-C中的深拷贝与浅拷贝
- 【倒计时5天】探索音画质量提升背后的秘密,千元大礼等你来拿
- Why is the new earth blurred, in-depth analysis of white balls, viewing pictures, and downloading problems
- 云原生 Dev0ps 实践
- 浅谈SVN备份
- CDH6.3.2开启kerberos认证
- Traceback (most recent call last): File
- Skills required to be a good architect: How to draw a system architecture that everyone will love?What's the secret?Come and open this article to see it!...
- html+css+php+mysql实现注册+登录+修改密码(附完整代码)
猜你喜欢
【一起学Rust】Rust学习前准备——注释和格式化输出
成为优秀架构师必备技能:怎样才能画出让所有人赞不绝口的系统架构图?秘诀是什么?快来打开这篇文章看看吧!...
后台图库上传功能
记住用户名案例(js)
[LeetCode—Question 2 Sum of Two Numbers Detailed Code Explanation ] The source code is attached, which can be copied directly
Polymorphism in detail (simple implementation to buy tickets system simulation, covering/weight definition, principle of polymorphism, virtual table)
LyScript 实现对内存堆栈扫描
优维低代码:Provider 构件
数据库一席谈:打造开源的数据生态,支撑产业数字化浪潮
2022年五面蚂蚁、三面拼多多、字节跳动最终拿offer入职拼多多
随机推荐
试题G:单词分析 ← 第十一届蓝桥杯大赛第二场省赛赛题
面试官:SOA 和微服务的区别?这回终于搞清楚了!
微信为什么使用 SQLite 保存聊天记录?
距LiveVideoStackCon 2022 上海站开幕还有3天!
基于SSM和Web实现的农作物生长监控系统
【一起学Rust】Rust的Hello Rust详细解析
CADEditorX ActiveX 14.1.X
【MySQL功法】第4话 · 和kiko一起探索MySQL中的运算符
LeetCode——622.设计循环队列
成为优秀架构师必备技能:怎样才能画出让所有人赞不绝口的系统架构图?秘诀是什么?快来打开这篇文章看看吧!...
For invoice processing DocuWare, cast off the yoke of the paper and data input, automatic processing all the invoice received
Simple implementation of a high-performance clone of Redis using .NET (1)
JS快速高效开发技巧指南(持续更新)
性能优化|从ping延时看CPU电源管理
thymeleaf中的日期格式转化
矩阵的计算[通俗易懂]
【一起学Rust】Rust包管理工具Cargo初步了解
C - 为什么指针常常初始化为 NULL?
Fastjson反序列化
劝退背后。