matlab实现图像压缩编码

[复制链接]
发表于 2025-7-20 05:47:50 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
一、基于DCT的JPEG压缩(有损)

1. 核心步调


  • 图像分块:将图像分别为8×8的小块。
  • 离散余弦变换(DCT):对每个块进行DCT变换。
  • 量化:对DCT系数进行量化以减少高频信息。
  • 熵编码:使用哈夫曼或算术编码压缩量化后的数据。
2. MATLAB代码实现

  1. % 读取图像并转换为灰度图
  2. img = imread('lena.jpg');
  3. img_gray = rgb2gray(img);
  4. img_double = im2double(img_gray); % 转换为double类型
  5. % 定义JPEG量化表(标准亮度量化表)
  6. Q = [16 11 10 16 24 40 51 61;
  7.      12 12 14 19 26 58 60 55;
  8.      14 13 16 24 40 57 69 56;
  9.      14 17 22 29 51 87 80 62;
  10.      18 22 37 56 68 109 103 77;
  11.      24 35 55 64 81 104 113 92;
  12.      49 64 78 87 103 121 120 101;
  13.      72 92 95 98 112 100 103 99];
  14. % 图像分块(8×8)
  15. block_size = 8;
  16. [rows, cols] = size(img_double);
  17. num_blocks_row = floor(rows / block_size);
  18. num_blocks_col = floor(cols / block_size);
  19. blocks = mat2cell(img_double(1:num_blocks_row*block_size, 1:num_blocks_col*block_size), ...
  20.                   repmat(block_size, 1, num_blocks_row), repmat(block_size, 1, num_blocks_col));
  21. % DCT变换与量化
  22. quantized_blocks = cell(size(blocks));
  23. for i = 1:numel(blocks)
  24.     block = blocks{i};
  25.     dct_block = dct2(block); % DCT变换
  26.     quant_block = round(dct_block ./ Q); % 量化
  27.     quantized_blocks{i} = quant_block;
  28. end
  29. % 熵编码(使用MATLAB内置函数)
  30. compressed_data = mat2huff(quantized_blocks(:)); % 哈夫曼编码
  31. % 解码与重建(逆量化 + 逆DCT)
  32. reconstructed_blocks = cell(size(quantized_blocks));
  33. reconstructed_data = huff2mat(compressed_data); % 哈夫曼解码
  34. reconstructed_data = reshape(reconstructed_data, size(quantized_blocks));
  35. for i = 1:numel(blocks)
  36.     quant_block = reconstructed_data{i};
  37.     dequant_block = quant_block .* Q; % 反量化
  38.     idct_block = idct2(dequant_block); % 逆DCT
  39.     reconstructed_blocks{i} = idct_block;
  40. end
  41. % 合并分块并显示结果
  42. reconstructed_img = cell2mat(reconstructed_blocks);
  43. figure;
  44. subplot(1,2,1); imshow(img_gray); title('原始图像');
  45. subplot(1,2,2); imshow(reconstructed_img); title('重建图像');
  46. % 计算PSNR
  47. psnr_value = psnr(reconstructed_img, img_gray);
  48. disp(['PSNR: ', num2str(psnr_value), ' dB']);
复制代码
3. 关键说明



  • 量化表:决定压缩率和图像质量,可根据需求调整。
  • 分块处理:mat2cell函数用于分块,idct2实现逆变换。
  • 熵编码:使用MATLAB的mat2huff和huff2mat实现哈夫曼编码。

二、基于DPCM的哈夫曼编码(无损)

1. 核心步调


  • 猜测编码:使用前一个像素猜测当前像素值,计算残差。
  • 哈夫曼编码:对残差进行变长编码。
  • 代码 图像压缩编码码matlab实现M编码、变换编码、算术编码、行程编码、Huffman编码、线性猜测编码
2. MATLAB代码实现

  1. % 读取图像
  2. img = imread('lena.jpg');
  3. img_gray = rgb2gray(img);
  4. img_gray = im2double(img_gray);
  5. % DPCM编码
  6. pred = zeros(size(img_gray));
  7. diff = zeros(size(img_gray));
  8. pred(1) = img_gray(1);
  9. diff(1) = img_gray(1) - pred(1);
  10. for i = 2:numel(img_gray)
  11.     pred(i) = 0.5 * (img_gray(i-1) + img_gray(i)); % 线性预测
  12.     diff(i) = img_gray(i) - pred(i);
  13. end
  14. % 哈夫曼编码
  15. [dict, avglen] = huffmandict(unique(diff), ... % 生成哈夫曼字典
  16.     arrayfun(@(x) normpdf(x, mean(diff(diff~=0)), std(diff(diff~=0))), unique(diff)));
  17. compressed_data = huffmanenco(diff, dict);
  18. % 解码
  19. decoded_diff = huffmandeco(compressed_data, dict);
  20. reconstructed_img = zeros(size(img_gray));
  21. reconstructed_img(1) = img_gray(1);
  22. for i = 2:numel(img_gray)
  23.     reconstructed_img(i) = reconstructed_img(i-1) + decoded_diff(i);
  24. end
  25. % 显示结果
  26. figure;
  27. subplot(1,2,1); imshow(img_gray); title('原始图像');
  28. subplot(1,2,2); imshow(reconstructed_img); title('DPCM重建图像');
  29. psnr_value = psnr(reconstructed_img, img_gray);
  30. disp(['PSNR: ', num2str(psnr_value), ' dB']);
复制代码

三、方法对比

方法压缩类型压缩率图像质量适用场景JPEG(DCT)有损高可控(依赖量化表)通用图像压缩DPCM+哈夫曼无损低完全保真医学图像、卫星图像
四、扩展方向


  • 改进JPEG:引入熵编码优化(如算术编码)或自顺应量化表。
  • 深度学习压缩:使用CNN学习图像特征进行端到端压缩。
  • 混合压缩:联合有损和无损方法(如JPEG-LS)。

通过上述代码,您可以直接在MATLAB中实现图像压缩与重建,并通过调整参数(如量化表、猜测模型)优化性能。
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表