clear all;
I=imread('cameraman.tif');
figure(1);
imshow(I);title('原始图像');
I=im2double(I);
D=dctmtx(8);
% 系数取舍矩阵
mask=[1 1 1 1 1 0 0 0
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];
Bdct=blkproc(I,[8 8],'P1*x*P2',D,D');
% 用 D*A*D' 来计算离散余弦变换
Bch=blkproc(Bdct,[8 8],'P1.*x',mask);
% 系数选择
Bidct=blkproc(Bch,[8 8],'P1*x*P2',D',D);
% 离散余弦逆变换
figure(2);
imshow(Bidct);title('解压图像');
注:1. 先把图像分为 8×8 块,然后用 dctmtx 分别对每个子图像进行离散余弦变换,对变换系数仅保留左上角的 15 个值 (5+4+3+2+1),然后对这 15 个系数进行离散余弦逆变换重新得到各个子图像,再用 dctmtx 进行重构。
2. 仅用 8×8 = 64 中的 15 个就能有较好的视觉效果。
https://blog.sciencenet.cn/blog-287000-510054.html
上一篇:
离散余弦逆变换---idct2函数下一篇:
Matlab 自带演示程序 --- qtdemo 函数