图像变换

图像变换

Scroll Down

图像变换

基本要求
理解傅里叶变换和离散余弦变换原理及性质,掌握图像的傅里叶变换和离散余弦变换的实现方法,对实验结果进行分析,得出实验结论并撰写实验报告。

1. 实验内容

(1)对图像进行傅里叶变换,观察图像能量在频谱图中的分布情况。
%清理
clc;
close all;
clear all;

figure();
img_a = imread('lena.jpg');
subplot(2,3,1);
imshow(img_a);
title('实验人:戚浩强');
xlabel('(a) lena原图像');

img_b = imread('cameraman.tif');
subplot(2,3,2);
imshow(img_b);
title('实验人:戚浩强');
xlabel('(b) cameraman原图像');

img_c = imread('face.jpg');
subplot(2,3,3);
imshow(img_c);
title('实验人:戚浩强');
xlabel('(c) face原图像');

%原始图片的傅里叶频谱
img_a_d = im2double(img_a); %转换类型为double
img_a_J = fft2(img_a_d);
img_a_F = abs(img_a_J);
img_a_J_s = fftshift(img_a_F); %将零频分量移到频谱中心
subplot(2,3,4);
imshow(img_a_J_s,[5,50]);
title('实验人:戚浩强');
xlabel('(d) lenagray傅里叶频谱');

img_b_d = im2double(img_b); %转换类型为double
img_b_J = fft2(img_b_d);
img_b_F = abs(img_b_J);
img_b_J_s = fftshift(img_b_F); %将零频分量移到频谱中心
subplot(2,3,5);
imshow(img_b_J_s,[5,50]);
title('实验人:戚浩强');
xlabel('(e) cameraman傅里叶频谱');

img_c_d = im2double(img_c); %转换类型为double
img_c_J = fft2(img_c_d);
img_c_F = abs(img_c_J);
img_c_J_s = fftshift(img_c_F); %将零频分量移到频谱中心
subplot(2,3,6);
imshow(img_c_J_s,[5,50]);
title('实验人:戚浩强');
xlabel('(f) face傅里叶频谱');

image.png

(2)利用Matlab生成给定的图像,并对其进行旋转30度、90度和120度,然后对他们分别进行傅里叶变换。
%清理
clc;
close all;
clear all;

figure();
%构建第一个原图像
img = zeros(256,256);
img(85:171,85:171) = 1;
%旋转30度
img_30 = imrotate(img,30,'crop'); %截去部分
subplot(2,3,1);
imshow(img_30);
title('实验人:戚浩强');
xlabel('(a) 原图像旋转30度');

%旋转90度
img_90 = imrotate(img,90);
subplot(2,3,2);
imshow(img_90);
title('实验人:戚浩强');
xlabel('(b) 原图像旋转90度');

%旋转120度
img_120 = imrotate(img,120,'crop');
subplot(2,3,3);
imshow(img_120);
title('实验人:戚浩强');
xlabel('(c) 原图像旋转120度');

%旋转后的傅里叶频谱
J = fft2(img_30);
F = abs(J);
J_s = fftshift(F);
subplot(2,3,4);
imshow(J_s,[5,50]);
title('实验人:戚浩强');
xlabel('(d) 旋转30度图像傅里叶频谱');

J = fft2(img_90);
F = abs(J);
J_s = fftshift(F);
subplot(2,3,5);
imshow(J_s,[5,50]);
title('实验人:戚浩强');
xlabel('(e) 旋转90度图像傅里叶频谱');

J = fft2(img_120);
F = abs(J);
J_s = fftshift(F);
subplot(2,3,6);
imshow(J_s,[5,50]);
title('实验人:戚浩强');
xlabel('(f) 旋转120度图像傅里叶频谱');

%==============================================%
figure();
%构建第二个图像
img = zeros(256,256);
img(85:171,112:134) = 1;
%旋转30度
img_30 = imrotate(img,30,'crop'); %截去部分
subplot(2,3,1);
imshow(img_30);
title('实验人:戚浩强');
xlabel('(a) 原图像旋转30度');

%旋转90度
img_90 = imrotate(img,90);
subplot(2,3,2);
imshow(img_90);
title('实验人:戚浩强');
xlabel('(b) 原图像旋转90度');

%旋转120度
img_120 = imrotate(img,120,'crop');
subplot(2,3,3);
imshow(img_120);
title('实验人:戚浩强');
xlabel('(c) 原图像旋转120度');

%旋转后的傅里叶频谱
J = fft2(img_30);
F = abs(J);
J_s = fftshift(F);
subplot(2,3,4);
imshow(J_s,[5,50]);
title('实验人:戚浩强');
xlabel('(d) 旋转30度图像傅里叶频谱');

J = fft2(img_90);
F = abs(J);
J_s = fftshift(F);
subplot(2,3,5);
imshow(J_s,[5,50]);
title('实验人:戚浩强');
xlabel('(e) 旋转90度图像傅里叶频谱');

J = fft2(img_120);
F = abs(J);
J_s = fftshift(F);
subplot(2,3,6);
imshow(J_s,[5,50]);
title('实验人:戚浩强');
xlabel('(f) 旋转120度图像傅里叶频谱');

image.png
image.png

(3)用DCT变换对图像进行图像压缩,求经压缩、解压后的图像。DCT压缩时,舍掉的变换系数分别小于0.01、0.03、0.05
%清理
clc;
close all;
clear all;

figure();
img = imread('face.jpg');
subplot(1,2,1);
imshow(img);
title('实验人:戚浩强');
xlabel('(a) 原图像');

[M,N] = size(img);
img_d = im2double(img); %转换类型为double
%生成标准DCT变化中的矩阵(8x8)
n = 8;
[cc,rr] = meshgrid(0:n - 1);
C = sqrt(2 / n) * cos(pi * (2 * cc +1) .* rr / (2 * n));
C(1,:) = C(1,:) / sqrt(2);
%光亮度量化表
a = [16 11 10 16 24 40 51 61;
        12 12 14 19 26 58 60 55;
        14 13 16 24 40 57 69 56;
        14 17 22 29 51 87 80 62;
        18 22 37 56 68 109 103 77;
        24 35 55 64 81 104 113 92;
        49 64 78 87 103 121 120 101;
        72 92 95 98 112 100 103 99];
 
 %分块做DCT变换(8x8),DCT变换公式:正变换Y=CIC';
 for i = 1:8:M
     for j = 1:8:N
         P = img_d(i:i+7,j:j+7);
         K = C * P * C';
         img1(i:i+7,j:j+7) = K;
         K = K ./ a; %量化
         K(abs(K) < 0.03) = 0;
         img2(i:i+7,j:j+7) = K;
     end
 end
 
 %分块做DCT变换(8x8),逆变换:P=C'YC;
 for i = 1:8:M
     for j = 1:8:N
         P = img2(i:i+7,j:j+7) .* a; %反量化
         K = C' * P * C;
         img3(i:i+7,j:j+7) = K;
     end
 end
 
 subplot(1,2,2);
 imshow(img3);
 title('实验人:戚浩强');
 xlabel('(b) 舍掉的变换系数小于0.03');

image.png

总结

实验一是观察图像在频谱中的表现,可以看出能量主要集中在低频区,高频区幅值都很小,在平移之前高频部分主要集中在四周,所以图像中间有很多细节,低频能量多。

实验二验证了傅里叶变换的旋转性,对f(x,y)旋转一个角度q对应于傅里叶变换F(u,v)也旋转相同的角度q,F(u,v)到f(x,y)也一样。
实验三利用离散余弦变换比快速傅里叶变换更具有优势,运算过程不涉及复数,计算方便。但是肉眼可见复原后的图像出现了一些马赛克,主要应该是量化时丢掉了一些数据。

三、1:在进行DCT处理图像时,每个点都要取周边像素的平均值,要如何分配权重?
如果使用简单平均,显然不是很合理,因为图像都是连续的,越靠近的点关系越密切,越远离的点关系越疏远。因此,加权平均更合理,距离越近的点权重越大,距离越远的点权重越小。
三、2:关于DCT变换后,图像变模糊的原因理解
傅里叶变换将原始图像像素值进行重置,这个过程采用将每一个像素都设置成周边像素的平均值,进行卷积计算求和,“中间点"取"周围点"的平均值,在图形上,就相当于产生"模糊"效果,"中间点"失去细节。当计算平均值时,取值范围越大,"模糊效果"越好。