写一个基于matlab的图像压缩代码, 代码要求1.图片格式为JPEG 2.原图像显示 3.使用无损压缩,尽可能提供高压缩比例 4.显示压缩比例 5.压缩后图像显示
时间: 2024-03-10 09:49:50 浏览: 18
好的,以下是一个基于MATLAB的图像压缩代码,满足你的要求:
```matlab
% 读取原始图片
orig_img = imread('input.jpg');
% 显示原始图片
figure, imshow(orig_img), title('Original Image');
% 无损压缩
compressed_img = jpeg_write(orig_img, 'output.jpg', 95);
% 显示压缩比例
orig_size = dir('input.jpg').bytes;
compressed_size = dir('output.jpg').bytes;
compression_ratio = orig_size / compressed_size;
fprintf('Compression Ratio: %f\n', compression_ratio);
% 显示压缩后图片
figure, imshow(compressed_img), title('Compressed Image');
```
需要注意的是,这个代码需要依赖一个名为"jpeg_write"的函数,这个函数是在MATLAB File Exchange上找到的,你需要先下载并添加到MATLAB路径中。
相关问题
写一个基于matlab的图像压缩代码, 代码要求1.图片格式为JPEG 2.原图像显示和压缩后图像显示 3.使用有损压缩,尽可能提供高压缩比例 4.显示压缩比例 5.图片大小不确定
好的,以下是一个基于matlab的图像压缩代码:
```matlab
% 读取图像文件
img = imread('image.jpg');
% 显示原图像
subplot(1, 2, 1);
imshow(img);
title('Original Image');
% 将图像转换为YCbCr颜色空间
img_ycbcr = rgb2ycbcr(img);
% 对Cb和Cr分量进行下采样
img_ycbcr(:,:,2) = imresize(img_ycbcr(:,:,2), 0.5);
img_ycbcr(:,:,3) = imresize(img_ycbcr(:,:,3), 0.5);
% 对Y分量进行离散余弦变换
img_dct = blkproc(img_ycbcr(:,:,1), [8 8], @dct2);
% 量化Y分量
quant_mtx = [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];
quant_mtx = quant_mtx * 10;
img_quant = blkproc(img_dct, [8 8], @(block_struct) round(block_struct.data ./ quant_mtx));
img_quant = int16(img_quant);
% 显示量化后的Y分量图像
subplot(1, 2, 2);
imshow(img_quant, []);
title('Quantized Image');
% 计算压缩比例
original_size = numel(img);
compressed_size = numel(img_quant);
compression_ratio = original_size / compressed_size;
fprintf('Compression Ratio: %f\n', compression_ratio);
% 反量化Y分量
img_dequant = blkproc(img_quant, [8 8], @(block_struct) block_struct.data .* quant_mtx);
img_dequant = int16(img_dequant);
% 对Y分量进行离散余弦逆变换
img_idct = blkproc(img_dequant, [8 8], @idct2);
% 将图像转换回RGB颜色空间
img_compressed = uint8(cat(3, img_idct, imresize(img_ycbcr(:,:,2), 2), imresize(img_ycbcr(:,:,3), 2)));
img_compressed = ycbcr2rgb(img_compressed);
% 显示压缩后的图像
subplot(1, 2, 2);
imshow(img_compressed);
title('Compressed Image');
```
这个代码使用了以下步骤:
1. 读取图像文件;
2. 将图像转换为YCbCr颜色空间;
3. 对Cb和Cr分量进行下采样;
4. 对Y分量进行离散余弦变换;
5. 量化Y分量;
6. 显示量化后的Y分量图像;
7. 计算压缩比例;
8. 反量化Y分量;
9. 对Y分量进行离散余弦逆变换;
10. 将图像转换回RGB颜色空间;
11. 显示压缩后的图像。
这个代码使用了JPEG压缩的基本思想,即对图像进行离散余弦变换和量化。其中,量化矩阵是根据JPEG标准定义的。注意,这个代码只对Y分量进行了处理,而Cb和Cr分量则被简单地下采样了一倍。这是因为人眼对亮度信息更加敏感,而对色度信息不那么敏感。
用matlab写一个图像压缩代码 要求1.图像格式是jpeg 2.原图像显示,压缩后的图像显示 3.压缩图像的压缩比例显示
好的,我理解了您的要求。下面是一个简单的 MATLAB 图像压缩代码,它可以将 JPEG 格式的图像进行压缩,并显示原图像和压缩后的图像,同时展示压缩比例。
```matlab
% 读入 JPEG 图像
im = imread('image.jpg');
% 显示原图像
figure(1);
imshow(im);
title('原图像');
% 将图像转换为 YCbCr 颜色空间,只对 Y 分量进行压缩
im_ycbcr = rgb2ycbcr(im);
im_y = im_ycbcr(:,:,1);
% 对 Y 分量进行离散余弦变换(DCT)
im_dct = dct2(im_y);
% 设定压缩比例
compression_ratio = 0.5;
% 计算需要保留的 DCT 系数数量
dct_coeffs = numel(im_dct);
num_coeffs = round(dct_coeffs * compression_ratio);
% 保留最大的 DCT 系数
dct_flat = reshape(im_dct, [], 1);
[~, idx] = sort(abs(dct_flat), 'descend');
dct_thresh = dct_flat(idx(num_coeffs));
im_dct(abs(im_dct) < dct_thresh) = 0;
% 对 Y 分量进行反离散余弦变换(IDCT)
im_y_compress = idct2(im_dct);
% 将压缩后的 Y 分量与原图像的 CbCr 分量组合成压缩后的图像
im_compress_ycbcr = im_ycbcr;
im_compress_ycbcr(:,:,1) = im_y_compress;
im_compress = ycbcr2rgb(im_compress_ycbcr);
% 显示压缩后的图像
figure(2);
imshow(im_compress);
title('压缩后的图像');
% 计算压缩比例并显示
num_pixels = size(im, 1) * size(im, 2);
num_coeffs_compress = sum(abs(im_dct(:)) > 0);
compression_ratio_actual = num_coeffs_compress / dct_coeffs;
fprintf('压缩比例:%f\n', compression_ratio_actual);
```
请将代码保存为 `compress_image.m` 并将 `image.jpg` 替换为您要压缩的 JPEG 图像。压缩比例可以通过修改 `compression_ratio` 变量来实现。