写一个Matlab实现图像压缩的代码,代码要求 1.使用有损压缩,尽可能把图像压缩小 2.尽量不适用库函数,哈夫曼编码可以使用库函数 3.显示输入的原图像 4.显示压缩后的图像 5.计算压缩比例并显示出来
时间: 2024-03-21 09:42:20 浏览: 21
好的,以下是一个简单的 Matlab 实现图像压缩的代码,使用了离散余弦变换(DCT)和哈夫曼编码:
```matlab
% 读取原图像
img = imread('lena.png');
figure(1);
imshow(img);
title('原图像');
% 将图像转换为灰度图
gray_img = rgb2gray(img);
% 将图像分块并对每个块进行离散余弦变换
block_size = 8;
[h, w] = size(gray_img);
dct_img = zeros(h, w);
for i = 1:block_size:h
for j = 1:block_size:w
block = double(gray_img(i:i+block_size-1, j:j+block_size-1));
dct_block = dct2(block);
dct_img(i:i+block_size-1, j:j+block_size-1) = dct_block;
end
end
% 对 DCT 系数进行量化
quantization_matrix = [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];
quantized_img = zeros(h, w);
for i = 1:block_size:h
for j = 1:block_size:w
dct_block = dct_img(i:i+block_size-1, j:j+block_size-1);
quantized_block = round(dct_block ./ quantization_matrix);
quantized_img(i:i+block_size-1, j:j+block_size-1) = quantized_block;
end
end
% 对量化后的 DCT 系数进行哈夫曼编码
symbols = [-255:1:255];
counts = histcounts(quantized_img, symbols);
p = counts ./ sum(counts);
dict = huffmandict(symbols, p);
huffman_img = huffmanenco(quantized_img(:), dict);
% 计算压缩比例
original_size = h * w * 8; % 原图像大小(8 位灰度图像)
compressed_size = length(huffman_img); % 压缩后的图像大小
compression_ratio = original_size / compressed_size;
fprintf('压缩比例为 %.2f\n', compression_ratio);
% 解码哈夫曼编码并恢复量化后的 DCT 系数
decoded_img = huffmandeco(huffman_img, dict);
decoded_img = reshape(decoded_img, h, w);
dequantized_img = zeros(h, w);
for i = 1:block_size:h
for j = 1:block_size:w
quantized_block = decoded_img(i:i+block_size-1, j:j+block_size-1);
dequantized_block = quantized_block .* quantization_matrix;
dequantized_img(i:i+block_size-1, j:j+block_size-1) = dequantized_block;
end
end
% 对恢复的 DCT 系数进行逆变换并显示压缩后的图像
compressed_img = zeros(h, w);
for i = 1:block_size:h
for j = 1:block_size:w
dct_block = dequantized_img(i:i+block_size-1, j:j+block_size-1);
block = idct2(dct_block);
compressed_img(i:i+block_size-1, j:j+block_size-1) = block;
end
end
compressed_img = uint8(compressed_img);
figure(2);
imshow(compressed_img);
title('压缩后的图像');
```
注意事项:
1. 该代码仅实现了基本的图像压缩功能,实际应用中还需要考虑更多因素,如色彩空间转换、预处理、压缩率控制等;
2. 该代码使用了 Matlab 自带的哈夫曼编码函数,实际应用中可以使用其他更高效的压缩算法,如 LZW、LZ77、JPEG 等;
3. 该代码中使用了 8x8 的块,实际应用中可以尝试其他大小的块,以达到更好的压缩效果。