Matlab学习11-图像处理之图像变换


一、傅里叶变换快速卷积

代码

% 傅里叶变换快速卷积
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个幅度谱)");

总结

点击获取源码

猜你喜欢

转载自blog.csdn.net/CHengYuP/article/details/125986164