问题一:随机选取一整幅图像(命名“x.jpg”),编写Matlab程序显示灰度图像、反余弦变换恢复图、DCT变换图、余弦变换系数图,并与原始图像对比。
clc
clear
close all;%清理Matlab窗口
A=imread('D:\x.jpg');%读取图像x.jpg(引号内是图像在计算机内的存储路径)
I=rgb2gray(A);%RGB图像转灰度图像
DCT=dct2(I);%DCT变换
DCT(abs(DCT)<10)=0;%将小于10的DCT余弦变换系数值置为0
reI=idct2(DCT);%逆DCT变换
subplot(2,2,1);%绘图
imshow(I,[0,255]);
title('灰度图像');
subplot(2,2,2);
imshow(reI,[0,255]);
title('IDCT灰度图像');
subplot(2,2,3);
imshow(DCT,[0,255]);
title('DCT变换图');
subplot(2,2,4);
imshow(log(abs(DCT)),[]);
title('余弦变换系数');
编程结果如下图,根据编程结果,将小于10的DCT余弦变换系数值置为0(“DCT(abs(DCT)<10)=0;”)后IDCT灰度图像与原始灰度图像相比差别不大,图像恢复效果较好。
问题二:在问题一的基础上,改变变换矩阵系数,观察DCT处理变化。
clc
clear
close all;%清理Matlab窗口
A=imread('D:\x.jpg');%读取图像x.jpg(引号内是图像在计算机内的存储路径)
I=rgb2gray(A);%RGB图像转灰度图像
DCT=dct2(I);%DCT变换
DCT500=dct2(I);%DCT变换
DCT(abs(DCT)<10)=0;%将小于10的DCT余弦变换系数值置为0
DCT500(abs(DCT500)<500)=0;%将小于500的DCT余弦变换系数值置为0
reI=idct2(DCT);%逆DCT变换
reI500=idct2(DCT500);%逆DCT变换
subplot(2,2,1);%绘图
imshow(I,[0,255]);
title('DCT<10 灰度图像');
subplot(2,2,2);
imshow(reI,[0,255]);
title('DCT<10 IDCT灰度图像');
subplot(2,2,3);
imshow(reI500,[0,255]);
title('DCT<500 IDCT灰度图像');
编程结果如下图,根据编程结果对比,可以明显看出,将小于500的DCT余弦变换系数值置为0(“DCT(abs(DCT)<500)=0;”)后IDCT灰度图像与原始灰度图像相比发生了明显的失真,图像恢复效果较差。