1. 实验内容
(1)对图像lena、cameraman和face进行傅里叶变换,观察图像能量在频谱图中的分布情况。
(2)利用Matlab生成下列图像,并对其进行旋转30度、90度和120度,然后对他们分别进行傅里叶变换。
(3)对图像lena、cameraman和face用DCT变换进行图像压缩,舍掉的变换系数分别小于0.01、0.03、0.05,求经压缩、解压后的图像。
%读取图像
I1=imread('lena.jpg');
I2=imread('cameraman.tif');
I3=imread('face.jpg');
%第一幅图片
subplot(3,2,1);
I1=im2double(I1);
imshow(I1);
xlabel('原始图像');
subplot(3,2,2);
J1=fft2(I1);
F1=abs(J1);
K1=fftshift(F1);
g1=im2uint8(mat2gray(log(1+K1)));
imshow(g1);
xlabel('傅里叶谱');
%第二幅图片
subplot(3,2,3);
I2=im2double(I2);
imshow(I2);
xlabel('原始图像');
subplot(3,2,4);
J2=fft2(I2);
F2=abs(J2);
K2=fftshift(F2);
g2=im2uint8(mat2gray(log(1+K2)));
imshow(g2);
xlabel('傅里叶谱');
%第三幅图片
subplot(3,2,5);
I3=im2double(I3);
imshow(I3);
xlabel('傅里叶谱');
subplot(3,2,6);
J3=fft2(I3);
F3=abs(J3);
K3=fftshift(F3);
g3=im2uint8(mat2gray(log(1+K3)));
imshow(g3);
xlabel('原始图像')
% 创建一个全黑的179x179的图像
image1 = zeros(179, 179);
% 定义白色矩形的位置
x_start = 60;
x_end = 117;
y_start = 60;
y_end = 117;
% 在指定的位置创建白色矩形
image1(y_start:y_end, x_start:x_end) = 1; % 1 表示白色
%第一幅图片
subplot(2,2,1);
I1=im2double(image1);
imshow(I1);
xlabel('原始图像');
subplot(2,2,2);
J1=fft2(I1);
F1=abs(J1);
K1=fftshift(F1);
g1=im2uint8(mat2gray(log(1+K1)));
imshow(g1);
xlabel('傅里叶谱');
% 创建一个全黑的179x179的图像
image2 = zeros(179, 179);
% 定义白色矩形的位置
x_start = 85;
x_end = 97;
y_start = 60;
y_end = 117;
% 在指定的位置创建白色矩形
image2(y_start:y_end, x_start:x_end) = 1; % 1 表示白色
%第二幅图片
subplot(2,2,3);
I2=im2double(image2);
imshow(I2);
xlabel('原始图像');
subplot(2,2,4);
J2=fft2(I2);
F2=abs(J2);
K2=fftshift(F2);
g2=im2uint8(mat2gray(log(1+K2)));
imshow(g2);
xlabel('傅里叶谱');
% 读取图像并显示原始图像
lena = imread('lena.jpg');
cameraman = imread('cameraman.tif');
face = imread('face.jpg');
figure;
% 定义不同的压缩比例
compression_ratios = [0.01, 0.03, 0.05];
for i = 1:length(compression_ratios)
% 压缩
lena_dct = dct2(lena);
cameraman_dct = dct2(cameraman);
face_dct = dct2(face);
% 计算要舍弃的系数数量
num_coeffs_to_keep = round(compression_ratios(i) * numel(lena_dct));
% 舍弃系数
lena_dct_sorted = sort(abs(lena_dct(:)), 'descend');
cameraman_dct_sorted = sort(abs(cameraman_dct(:)), 'descend');
face_dct_sorted = sort(abs(face_dct(:)), 'descend');
threshold_lena = lena_dct_sorted(num_coeffs_to_keep);
threshold_cameraman = cameraman_dct_sorted(num_coeffs_to_keep);
threshold_face = face_dct_sorted(num_coeffs_to_keep);
lena_dct(abs(lena_dct) < threshold_lena) = 0;
cameraman_dct(abs(cameraman_dct) < threshold_cameraman) = 0;
face_dct(abs(face_dct) < threshold_face) = 0;
% 解压缩
lena_reconstructed = idct2(lena_dct);
cameraman_reconstructed = idct2(cameraman_dct);
face_reconstructed = idct2(face_dct);
% 显示压缩后的图像
subplot(3, 4, i);
imshow(lena_reconstructed, []);
xlabel(['变换系数小于' num2str(compression_ratios(i))]);
subplot(3, 4, i + 4);
imshow(cameraman_reconstructed, []);
xlabel(['变换系数小于' num2str(compression_ratios(i)) ]);
subplot(3, 4, i + 8);
imshow(face_reconstructed, []);
xlabel(['变换系数小于' num2str(compression_ratios(i))]);
end
作者:henu 2021级 空午