第十三、十四、十五次实验:用Matlab实现一幅灰度图像的压缩(即bmp格式转为jpg格式) 注意: 1.不能直接采用imwrite等函数一句话把图像进行压缩; 2. 代码中能体现DCT、huffman等步骤,步骤中功能函数可以直接调用; 3. 对比显示效果、计算压缩比。
时间: 2024-03-16 21:45:41 浏览: 52
基于matlab利用DCT变换对灰度图像进行压缩,求出压缩比;对比不同压缩比的图像
5星 · 资源好评率100%
好的,以下是一个简单的Matlab代码实现,可以将一幅灰度图像进行压缩:
```matlab
% 加载图像并转换为灰度图像
img = imread('lena.bmp');
grayImg = rgb2gray(img);
% 将图像分块
blockSize = 8;
[h, w] = size(grayImg);
numBlocksH = floor(h / blockSize);
numBlocksW = floor(w / blockSize);
blockImg = mat2cell(grayImg, blockSize * ones(1, numBlocksH), blockSize * ones(1, numBlocksW));
% 对每个块进行离散余弦变换(DCT)
dctImg = cellfun(@(block) dct2(block), blockImg, 'UniformOutput', false);
% 量化
quantMatrix = [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];
quantImg = cellfun(@(block) quantize(block, quantMatrix), dctImg, 'UniformOutput', false);
% Zigzag扫描
zigzagImg = cellfun(@(block) zigzag(block), quantImg, 'UniformOutput', false);
% 哈夫曼编码
[huffDict, huffImg] = cellfun(@(block) huffman(block), zigzagImg, 'UniformOutput', false);
% 存储编码
save('huffman.mat', 'huffDict', 'huffImg');
% 解码
load('huffman.mat', 'huffDict', 'huffImg');
dehuffImg = cellfun(@(huff, dict) huffmandeco(huff, dict), huffImg, huffDict, 'UniformOutput', false);
% 逆Zigzag扫描
dezigzagImg = cellfun(@(block) dezigzag(block, blockSize), dehuffImg, 'UniformOutput', false);
% 逆量化和逆DCT变换
dequantImg = cellfun(@(block) dequantize(block, quantMatrix), dezigzagImg, 'UniformOutput', false);
deDctImg = cellfun(@(block) idct2(block), dequantImg, 'UniformOutput', false);
% 合并图像块
degrayImg = cell2mat(deDctImg);
% 显示压缩前后的图像
figure;
subplot(1, 2, 1);
imshow(grayImg);
title('原始图像');
subplot(1, 2, 2);
imshow(degrayImg);
title('压缩后解压图像');
% 计算压缩比
originalSize = h * w;
compressedSize = numel(cat(2, huffImg{:}));
compressionRatio = originalSize / compressedSize;
disp(['压缩比为:', num2str(compressionRatio)]);
```
这个代码实现了将lena.bmp图像进行压缩的功能,其中量化矩阵和哈夫曼编码器可以根据实际需求进行调整。运行代码后,可以显示原始图像和解压后的图像,并计算压缩比。
需要注意的是,这个代码只是一个简单的实现,可能存在一些问题和局限性,比如对于一些复杂的图像,可能需要更高级的压缩算法才能得到较好的压缩效果。另外,压缩比的计算也可能存在一些误差,因为压缩后的文件大小可能会受到文件格式、压缩参数等因素的影响。
阅读全文