实验项目04 图像变换

1. 实验内容

1)对图像lena、cameraman和face进行傅里叶变换,观察图像能量在频谱图中的分布情况。

2)利用Matlab生成下列图像,并对其进行旋转30度、90度和120度,然后对他们分别进行傅里叶变换。

  

3)对图像lena、cameraman和faceDCT变换进行图像压缩,舍掉的变换系数分别小于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级 空午

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值