用matlab,将一幅图片采用4*4和16*16 DCT变换矩阵,并通过DCT逆变换矩阵相关系数置零实现对图像的压缩。给出代码
时间: 2024-03-06 12:49:39 浏览: 133
以下是用MATLAB对一幅图像进行4x4和16x16 DCT压缩的示例代码:
```matlab
% 读取图像
img = imread('lena.png');
% 将图像转换为灰度图像
gray_img = rgb2gray(img);
% 显示原始图像
subplot(2,2,1);
imshow(gray_img);
title('Original Image');
% 使用4x4 DCT变换矩阵进行变换
dct4 = dctmtx(4);
dct_img4 = blkproc(gray_img, [4 4], @(block) dct2(block.data .* dct4));
% 对变换系数进行压缩
dct_img4(abs(dct_img4) < 20) = 0;
% 使用逆DCT变换矩阵进行逆变换
idct4 = idctmtx(4);
img_dct4 = blkproc(dct_img4, [4 4], @(block) idct2(block.data .* idct4));
% 显示4x4 DCT压缩后的图像
subplot(2,2,2);
imshow(uint8(img_dct4));
title('4x4 DCT Compressed Image');
% 使用16x16 DCT变换矩阵进行变换
dct16 = dctmtx(16);
dct_img16 = blkproc(gray_img, [16 16], @(block) dct2(block.data .* dct16));
% 对变换系数进行压缩
dct_img16(abs(dct_img16) < 20) = 0;
% 使用逆DCT变换矩阵进行逆变换
idct16 = idctmtx(16);
img_dct16 = blkproc(dct_img16, [16 16], @(block) idct2(block.data .* idct16));
% 显示16x16 DCT压缩后的图像
subplot(2,2,3);
imshow(uint8(img_dct16));
title('16x16 DCT Compressed Image');
% 计算压缩比
ori_size = numel(gray_img);
dct4_size = sum(abs(dct_img4(:)) >= 20);
dct16_size = sum(abs(dct_img16(:)) >= 20);
fprintf('Original Image Size: %d\n4x4 DCT Compressed Image Size: %d\n16x16 DCT Compressed Image Size: %d\n', ori_size, dct4_size, dct16_size);
fprintf('4x4 DCT Compressed Image Compression Ratio: %f\n', ori_size / dct4_size);
fprintf('16x16 DCT Compressed Image Compression Ratio: %f\n', ori_size / dct16_size);
```
在上面的代码中,我们首先读取一幅图像,并将其转换为灰度图像。然后,我们使用`dctmtx()`函数分别生成4x4和16x16 DCT变换矩阵,并使用`blkproc()`函数对灰度图像进行DCT变换。对于变换后的系数,我们将绝对值小于20的系数置零,从而达到压缩的目的。最后,我们使用逆DCT变换矩阵将压缩后的系数转换回图像,并计算压缩比。
阅读全文