当前位置: 首页 > news >正文

基于8×8 DCT变换的图像压缩MATLAB实现

将图像分割为8×8块,进行DCT变换、量化和压缩,最后重建图像并评估压缩效果。

function dctImageCompression(imagePath, quality)% 读取图像if nargin < 1imagePath = 'cameraman.tif'; % 默认图像endif nargin < 2quality = 50; % 默认压缩质量(0-100)end% 读取图像并转换为双精度originalImage = imread(imagePath);if size(originalImage, 3) == 3originalImage = rgb2gray(originalImage);endoriginalImage = im2double(originalImage);% 显示原始图像figure('Name', 'DCT图像压缩', 'Position', [100, 100, 1000, 500]);subplot(2, 3, 1);imshow(originalImage);title(sprintf('原始图像 (%dx%d)', size(originalImage,2), size(originalImage,1)));% 定义8×8量化矩阵 (基于JPEG标准)quantizationMatrix = [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];% 调整量化质量 (quality: 1-100)if quality <= 0quality = 1;elseif quality > 100quality = 100;endif quality < 50scalingFactor = 5000 / quality;elsescalingFactor = 200 - 2 * quality;endquantizationMatrix = floor((quantizationMatrix * scalingFactor + 50) / 100);quantizationMatrix(quantizationMatrix < 1) = 1;% 填充图像使其尺寸为8的倍数[rows, cols] = size(originalImage);paddedRows = ceil(rows / 8) * 8;paddedCols = ceil(cols / 8) * 8;paddedImage = padarray(originalImage, [paddedRows-rows, paddedCols-cols], 'replicate', 'post');% 初始化变量dctCoeffs = zeros(size(paddedImage));quantizedCoeffs = zeros(size(paddedImage));reconstructedImage = zeros(size(paddedImage));% 压缩率统计totalCoeffs = numel(paddedImage);nonZeroCoeffs = 0;% 处理每个8×8块for i = 1:8:paddedRowsfor j = 1:8:paddedCols% 提取当前块block = paddedImage(i:i+7, j:j+7);% DCT变换dctBlock = dct2(block);dctCoeffs(i:i+7, j:j+7) = dctBlock;% 量化quantBlock = round(dctBlock ./ quantizationMatrix);quantizedCoeffs(i:i+7, j:j+7) = quantBlock;% 统计非零系数nonZeroCoeffs = nonZeroCoeffs + nnz(quantBlock);% 反量化dequantBlock = quantBlock .* quantizationMatrix;% IDCT重建reconstructedImage(i:i+7, j:j+7) = idct2(dequantBlock);endend% 裁剪回原始尺寸reconstructedImage = reconstructedImage(1:rows, 1:cols);% 计算压缩率和PSNRcompressionRatio = totalCoeffs / nonZeroCoeffs;mse = mean((originalImage(:) - reconstructedImage(:)).^2);psnr = 10 * log10(1 / mse);% 显示结果subplot(2, 3, 2);imshow(paddedImage);title('填充后的图像');subplot(2, 3, 3);imshow(log(abs(dctCoeffs) + 1), []);colormap(jet); colorbar;title('DCT系数 (对数尺度)');subplot(2, 3, 4);imshow(abs(quantizedCoeffs), [0, max(quantizedCoeffs(:))]);colormap(jet); colorbar;title('量化后的系数');subplot(2, 3, 5);imshow(reconstructedImage);title(sprintf('重建图像 (质量: %d%%)', quality));subplot(2, 3, 6);diffImage = abs(originalImage - reconstructedImage) * 5; % 放大误差imshow(diffImage);title(sprintf('误差图 (x5放大)'));% 显示压缩信息fprintf('图像尺寸: %d x %d\n', cols, rows);fprintf('压缩质量: %d%%\n', quality);fprintf('压缩率: %.2f:1\n', compressionRatio);fprintf('非零系数比例: %.2f%%\n', (nonZeroCoeffs/totalCoeffs)*100);fprintf('PSNR: %.2f dB\n', psnr);fprintf('MSE: %.6f\n', mse);% 保存结果saveas(gcf, 'dct_compression_result.png');
end

示例

% 示例1:使用默认图像和默认质量(50%)
dctImageCompression();% 示例2:指定图像和质量
dctImageCompression('peppers.png', 75);% 示例3:高质量压缩
dctImageCompression('mandril.tif', 90);% 示例4:低质量高压缩
dctImageCompression('satellite.jpg', 10);

算法说明

1. DCT变换核心原理

  • 将8×8图像块转换为频域表示
  • 公式:F(u,v)=14C(u)C(v)∑x=07∑y=07f(x,y)cos⁡((2x+1)uπ16)cos⁡((2y+1)vπ16)F(u,v) = \frac{1}{4}C(u)C(v)\sum_{x=0}^{7}\sum_{y=0}^{7}f(x,y)\cos\left(\frac{(2x+1)u\pi}{16}\right)\cos\left(\frac{(2y+1)v\pi}{16}\right)F(u,v)=41C(u)C(v)x=07y=07f(x,y)cos(16(2x+1)uπ)cos(16(2y+1)vπ)
  • 其中 C(u)={1/2if u=01otherwiseC(u) = \begin{cases} 1/\sqrt{2} & \text{if } u=0 \\1 & \text{otherwise}\end{cases}C(u)={1/21if u=0otherwise

2. 量化过程

  • 使用JPEG标准量化矩阵作为基础
  • 根据质量因子调整量化步长:
    • 高质量 → 小步长 → 保留更多细节
    • 低质量 → 大步长 → 更高压缩率

3. 压缩机制

  • 高频分量通常具有较小值,量化后变为零
  • 使用行程编码(RLE)和霍夫曼编码可进一步压缩(本实现中省略)
  • 仅存储非零系数可显著减少数据量

4. 性能评估

  • 压缩率:原始数据量 / 压缩后数据量
  • PSNR:峰值信噪比,衡量重建质量
    PSNR=10log⁡10(MAX2MSE)PSNR = 10 \log_{10}\left(\frac{MAX^2}{MSE}\right)PSNR=10log10(MSEMAX2)
  • MSE:均方误差
    MSE=1MN∑i=0M−1∑j=0N−1[I(i,j)−K(i,j)]2MSE = \frac{1}{MN}\sum_{i=0}^{M-1}\sum_{j=0}^{N-1}[I(i,j)-K(i,j)]^2MSE=MN1i=0M1j=0N1[I(i,j)K(i,j)]2

参考代码 把图像分成8×8的图像块进行DCT变换压缩 youwenfan.com/contentcsc/83441.html

参数

  1. 量化矩阵:控制不同频率分量的压缩程度

  2. 质量因子:0-100之间的值,控制整体压缩质量

    • 90+:接近无损压缩
    • 70-80:良好视觉质量
    • 50:中等压缩
    • 30以下:明显压缩伪影
  3. 块尺寸:8×8是JPEG标准,平衡计算效率和压缩性能

此实现展示了DCT压缩的核心原理,实际应用中可结合熵编码和更先进的量化策略进一步提升压缩效率。

http://www.lryc.cn/news/617907.html

相关文章:

  • 云服务器部署SSM项目
  • Kubernetes生产环境健康检查自动化指南
  • 7.Java的继承
  • 北京朝阳区中小学生信息学竞赛选拔赛C++真题
  • 左子树之和
  • 【数据可视化-86】中国育儿成本深度可视化分析(基于《中国统计年鉴2023》数据):用Python和pyecharts打造炫酷可视化大屏
  • 矩阵游戏(二分图最大匹配)
  • (3万字详解)Linux系统学习:深入了解Linux系统开发工具
  • MCU中的存储器映射(Memory Map)
  • Docker 网络-单机版
  • 在 .NET Core 5.0 中启用 Gzip 压缩 Response
  • js异步操作 Promise :fetch API 带来的网络请求变革—仙盟创梦IDE
  • Qwen2.5-vl源码解读系列:ImageProcessor
  • Android14 QS编辑页面面板的加载解析
  • Android中Activity销毁底层原理
  • GSON 框架下百度天气 JSON 数据转 JavaBean 的实战攻略
  • Mysql——Sql的执行过程
  • 从 0 到 1:用 MyCat 打造可水平扩展的 MySQL 分库分表架构
  • Linux-常用命令
  • 深入解析 resolv.conf 文件:DNS 配置的核心
  • 驱动_ConfigFS多级目录操作
  • 光功率dBm为何是负数?一文详解
  • Google OAuth 配置步骤指南,实现Google Drive文件同步功能。
  • UVM验证—UVM 简述
  • 快速了解TF-IDF算法
  • 逐际动力开源运控 tron1-rl-isaacgym 解读与改进
  • 自由学习记录(81)
  • 5B 参数,消费级显卡可部署:Wan2.2-TI2V-5B 本地部署教程,9分钟跑出电影级大片!
  • 【运维进阶】WEB 服务器
  • GB17761-2024标准与电动自行车防火安全的技术革新