首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >《数字图像处理》实验5-图像压缩及编码

《数字图像处理》实验5-图像压缩及编码

作者头像
啊阿狸不会拉杆
发布2026-01-21 14:17:20
发布2026-01-21 14:17:20
1160
举报

一、实验核心概述

1. 实验目标
  • 理解图像压缩的核心原理(减少冗余信息)及评价标准(压缩比、图像质量);
  • 掌握无损压缩(Huffman 编码)与有损压缩(DCT 变换、小波变换)的实现方法;
  • 熟悉 JPEG 标准核心技术(DCT 变换 + 量化),理解小波变换的多分辨率压缩特性;
  • 能够通过 MATLAB 函数实现图像压缩、编码、重构,并分析压缩效果。
2. 实验环境
  • 操作系统:Windows 8/10/11
  • 软件版本:MATLAB 2014 及以上版本
3. 核心原理与关键函数
  • 压缩分类:无损压缩(无信息丢失,如 Huffman 编码)、有损压缩(牺牲部分细节换高压缩比,如 DCT、小波变换);
  • 核心技术:
    • 色彩空间压缩:彩色图转灰度图(减少通道冗余);
    • 频域压缩:DCT 变换(低频集中能量,高频系数置零);
    • 编码压缩:Huffman 编码(基于概率的变长编码);
    • 多分辨率压缩:小波变换(分离低频与高频,过滤高频冗余);
  • 关键函数:imfinfo(图像属性查询)、dct2/idct2(DCT 变换与逆变换)、huffmandict/huffmanenco(Huffman 编码)、dwt2/idwt2(小波分解与重构)。

二、完整实验内容与代码实现

(一)彩色图转灰度图的压缩比计算
实验任务

        读取彩色图像→转换为灰度图→查询图像属性→计算基于文件大小的压缩比。

完整代码
代码语言:javascript
复制
% 读取彩色图像
color_img = imread('天火三玄变.jpg');

% 转换为灰度图
gray_img = rgb2gray(color_img);

% 可视化原图与灰度图
figure('Name', '彩色图转灰度图', 'NumberTitle', 'off');
subplot(1,2,1); imshow(color_img); title('原始彩色图像');
subplot(1,2,2); imshow(gray_img); title('转换后的灰度图');

% 获取原始彩色图像属性
color_info = imfinfo('天火三玄变.jpg');

% 保存灰度图并获取其属性
imwrite(gray_img, 'gray_image.jpg');
gray_info = imfinfo('gray_image.jpg');

% 计算压缩比(原始文件大小 / 灰度图文件大小)
original_size = color_info.FileSize; % 原始图像大小(字节)
gray_size = gray_info.FileSize;       % 灰度图大小(字节)
compression_ratio = original_size / gray_size;

% 输出结果
disp('原始彩色图像属性信息:'); disp(color_info);
disp('灰度图属性信息:'); disp(gray_info);
disp(['压缩比(原始大小/灰度图大小):', num2str(compression_ratio)]);
实验结果
  • 彩色图为 24 位真彩色(3 个通道),灰度图为 8 位(1 个通道);
  • 压缩比约为 1.56,核心是减少了颜色通道冗余,属于无损压缩的简化形式。
(二)DCT 变换与图像重构
实验任务

        彩色图→灰度图→DCT 变换→逆 DCT 重构→归一化→对比变换前后图像及矩阵变化。

完整代码
代码语言:javascript
复制
% 读取彩色图像
color_img = imread('天火三玄变.jpg');

% 转换为灰度图并预处理
gray_img = rgb2gray(color_img);
gray_double = double(gray_img); % 转换为double便于运算

% 二维DCT变换
dct_img = dct2(gray_double);

% 逆DCT变换重构图像
recon_img = idct2(dct_img);

% 归一化重构结果(映射到0-255范围)
min_val = min(recon_img(:));
max_val = max(recon_img(:));
K = 255 / (max_val - min_val); % 归一化系数
recon_norm = uint8(K * (recon_img - min_val));

% 可视化结果
figure('Name', 'DCT变换与重构', 'NumberTitle', 'off');
subplot(2,2,1); imshow(color_img); title('原图');
subplot(2,2,2); imshow(gray_img); title('灰度图像');
subplot(2,2,3); imshow(log(abs(dct_img)), []); title('二维DCT变换'); % 对数增强显示
subplot(2,2,4); imshow(recon_norm); title('重构图像');

% 输出矩阵变化(左上角8x8块)
fprintf('=== 原始灰度矩阵(左上角8x8) ===\n');
disp(gray_double(1:8, 1:8));
fprintf('\n=== DCT变换后矩阵(左上角8x8) ===\n');
disp(dct_img(1:8, 1:8));
fprintf('\n=== 归一化后重构矩阵(左上角8x8) ===\n');
disp(recon_norm(1:8, 1:8));

% 输出数值范围
fprintf('\n原始灰度矩阵值范围:[%.1f, %.1f]\n', min(gray_double(:)), max(gray_double(:)));
fprintf('DCT变换后矩阵值范围:[%.1f, %.1f]\n', min(dct_img(:)), max(dct_img(:)));
fprintf('归一化后重构矩阵值范围:[%.1f, %.1f]\n', min(recon_norm(:)), max(recon_norm(:)));
实验结果
  • DCT 变换后:能量集中在左上角(低频系数),四周为接近零的高频系数;
  • 重构图像:与原图视觉一致,矩阵数值高度接近,验证了 DCT 变换的可逆性;
  • 核心:DCT 变换将空间域冗余转换为频域冗余,为后续量化压缩奠定基础。
(三)基于 DCT 的量化与掩模压缩
实验任务

        灰度图→补零为 8 的整数倍→8x8 分块 DCT 变换→量化 / 掩模过滤→逆 DCT 重构→对比压缩效果。

完整代码
代码语言:javascript
复制
% 读取彩色图像并转换为灰度图
color_img = imread('CSGO.jpg');
I = rgb2gray(color_img);
I = im2double(I); % 转换为双精度

% 补零使图像尺寸为8的整数倍(DCT分块处理需求)
[h, w] = size(I);
pad_h = 8 - mod(h, 8);
pad_w = 8 - mod(w, 8);
if pad_h == 8, pad_h = 0; end
if pad_w == 8, pad_w = 0; end
I_pad = padarray(I, [pad_h, pad_w], 0, 'post'); % 末尾补零
[h_pad, w_pad] = size(I_pad);

% 生成8x8 DCT变换矩阵
T = dctmtx(8);

% 定义JPEG标准量化矩阵
quant_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];

% 1. 量化压缩(DCT+量化+阈值过滤)
I_quant = zeros(h_pad, w_pad);
for i = 1:8:h_pad
    for j = 1:8:w_pad
        % 提取8x8块并执行DCT
        block = I_pad(i:i+7, j:j+7);
        dct_block = T * block * T';
        % 量化 + 小系数置零(压缩核心)
        quant_block = dct_block ./ quant_matrix;
        quant_block(abs(quant_block) < 0.03) = 0; % 阈值过滤
        % 反量化 + 逆DCT重构
        recon_block = quant_block .* quant_matrix;
        I_quant(i:i+7, j:j+7) = T' * recon_block * T;
    end
end

% 2. 掩模压缩(保留低频系数,过滤高频)
mask = [1 1 1 1 0 0 0 0
        1 1 0 0 0 0 0 0
        1 0 0 0 0 0 0 0
        0 0 0 0 0 0 0 0
        0 0 0 0 0 0 0 0
        0 0 0 0 0 0 0 0
        0 0 0 0 0 0 0 0
        0 0 0 0 0 0 0 0];
% 分块处理掩模压缩
dct_all = blockproc(I_pad, [8 8], @(x) T*x.data*T'); % 全图DCT
dct_masked = blockproc(dct_all, [8 8], @(x) mask .* x.data); % 掩模过滤
I_masked = blockproc(dct_masked, [8 8], @(x) T'*x.data*T); % 逆DCT重构

% 裁剪回原尺寸(去除补零部分)
I_quant = I_quant(1:h, 1:w);
I_masked = I_masked(1:h, 1:w);

% 可视化结果
figure('Name', 'DCT量化与掩模压缩', 'NumberTitle', 'off');
subplot(1,3,1); imshow(I); title('原始图像');
subplot(1,3,2); imshow(I_quant); title('DCT量化压缩图像');
subplot(1,3,3); imshow(I_masked); title('掩模压缩图像');

% 输出矩阵对比
fprintf('=== 原始图像8x8矩阵 ===\n');
disp(I(1:8, 1:8));
fprintf('\n=== 量化压缩后8x8矩阵 ===\n');
disp(I_quant(1:8, 1:8));
fprintf('\n=== 掩模压缩后8x8矩阵 ===\n');
disp(I_masked(1:8, 1:8));
实验结果
  • 量化压缩:通过量化矩阵降低高频系数精度,小系数置零,压缩比高且视觉失真小;
  • 掩模压缩:仅保留左上角低频系数,压缩比极高,但边缘细节有轻微模糊;
  • 核心:DCT 压缩的本质是丢弃人眼不敏感的高频细节,实现 “有损但可用” 的高压缩比。
(四)Huffman 编码无损压缩
实验任务

        灰度图→提取像素序列→生成 Huffman 字典→编码与解码→计算压缩比。

完整代码
代码语言:javascript
复制
% 读取彩色图像并转换为灰度图
color_img = imread('天火三玄变.jpg');
gray_img = rgb2gray(color_img);
gray_uint8 = gray_img; % 保持uint8类型(0-255像素值)

% 转换为一维像素序列(便于编码)
pixel_values = gray_uint8(:);

% 生成Huffman编码字典(基于像素值概率分布)
symbols = unique(pixel_values); % 唯一像素值(符号)
counts = histcounts(pixel_values, [symbols; Inf]); % 统计每个符号出现次数
prob = counts / sum(counts); % 计算概率(总和为1)
dict = huffmandict(symbols, prob); % 生成变长编码字典

% Huffman编码与解码
encoded = huffmanenco(pixel_values, dict); % 编码为二进制序列
decoded_values = huffmandeco(encoded, dict); % 解码还原
huffman_img = reshape(uint8(decoded_values), size(gray_img)); % 重构图像

% 可视化结果
figure('Name', 'Huffman编码压缩', 'NumberTitle', 'off');
subplot(1,2,1); imshow(gray_uint8); title('原图');
subplot(1,2,2); imshow(huffman_img); title('Huffman处理后图像');

% 计算压缩比(原始比特数 / 编码后比特数)
original_bits = numel(pixel_values) * 8; % 原始:每个像素8比特
encoded_bits = length(encoded); % 编码后:二进制序列长度
compression_ratio = original_bits / encoded_bits;
disp(['Huffman编码压缩比:', num2str(compression_ratio)]);
实验结果
  • 解码后图像与原图完全一致,属于无损压缩;
  • 压缩比约为 1.12,核心是对高频出现的像素值分配短编码,低频出现的分配长编码,减少编码冗余;
  • 特点:无信息丢失,但压缩比低于有损压缩,适用于对质量要求极高的场景。
(五)基于小波变换的多分辨率压缩
实验任务

        灰度图→一级小波分解(LL 低频 + LH/HL/HH 高频)→不同阈值过滤高频系数→小波重构→对比压缩效果与压缩比。

完整代码
代码语言:javascript
复制
% 读取图像并转换为灰度图
I = imread('天火三玄变.jpg');
if size(I,3) == 3
    I = rgb2gray(I); % 彩色转灰度
end
I = im2double(I); % 转换为双精度

% 一级小波分解(使用db1小波,分离低频与高频)
[LL, LH, HL, HH] = dwt2(I, 'db1'); 
% LL:低频分量(保留图像主体);LH/HL/HH:高频分量(细节与噪声)

% 定义3个不同阈值(阈值越大,压缩越强,细节损失越多)
thresholds = [0.05, 0.1, 0.2];
num_thresh = length(thresholds);

% 可视化原图与不同阈值压缩结果
figure('Name', '小波变换压缩', 'NumberTitle', 'off');
subplot(1, num_thresh+1, 1);
imshow(I); title('原图');

% 循环处理不同阈值
for k = 1:num_thresh
    threshold = thresholds(k);
    % 高频系数阈值过滤:小于阈值的置零(压缩核心)
    LH_thresh = LH .* (abs(LH) > threshold);
    HL_thresh = HL .* (abs(HL) > threshold);
    HH_thresh = HH .* (abs(HH) > threshold);
    % 小波重构
    I_rec = idwt2(LL, LH_thresh, HL_thresh, HH_thresh, 'db1');
    % 显示重构图像
    subplot(1, num_thresh+1, k+1);
    imshow(I_rec);
    title(['阈值=', num2str(threshold)]);
    % 计算压缩比(总系数数 / 非零系数数)
    total_coeff = numel(LL) + numel(LH) + numel(HL) + numel(HH);
    nonzero_coeff = numel(LL) + sum(LH_thresh(:)~=0) + sum(HL_thresh(:)~=0) + sum(HH_thresh(:)~=0);
    compression_ratio = total_coeff / nonzero_coeff;
    fprintf('阈值=%.2f 时的压缩比: %.2f\n', threshold, compression_ratio);
end
实验结果
  • 阈值影响:阈值越大,高频系数置零越多,压缩比越高(最高约 3.98),但图像细节越模糊;
  • 压缩特点:小波变换保留低频主体信息,过滤高频细节冗余,失真程度低于 DCT 掩模压缩;
  • 优势:多分辨率特性可灵活调整阈值,平衡压缩比与图像质量,适用于需要分级压缩的场景(如网络传输)。

三、实验总结与关键知识点

1. 核心技术梳理

实验模块

压缩类型

核心逻辑

压缩比

适用场景

彩色转灰度

无损(通道压缩)

减少颜色通道冗余

~1.5

无需彩色信息的场景

DCT 量化压缩

有损(频域压缩)

量化 + 高频置零

中高

JPEG 标准核心、普通图像存储

Huffman 编码

无损(编码压缩)

基于概率的变长编码

~1.1

无失真要求的压缩(如医疗图像)

小波变换压缩

有损(多分辨率压缩)

过滤高频细节

3-4

分级传输、高质量压缩场景

2. 关键注意事项
  • 数据类型:DCT、小波变换需转换为double类型,避免uint8运算溢出;
  • DCT 分块:需将图像补零为 8 的整数倍,确保分块处理无越界;
  • 阈值选择:小波压缩的阈值需平衡压缩比与失真,阈值过大导致细节丢失严重;
  • 无损 vs 有损:无损压缩(Huffman)无信息丢失但压缩比低,有损压缩(DCT、小波)压缩比高但需控制失真。
3. 应用场景拓展
  • JPEG 标准:结合 DCT 变换、量化、Huffman 编码,是图像存储的主流标准;
  • 小波压缩:用于 JPEG 2000、医学图像、遥感图像等对质量要求较高的场景;
  • 实时传输:小波变换的多分辨率特性可实现 “先传低频(模糊图),后传高频(细节)” 的渐进式传输。

        通过本次实验,系统掌握了图像压缩的核心技术与实现方法,理解了不同压缩算法的原理与适用场景,为实际工程中选择合适的压缩方案提供了技术支撑

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2026-01-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、实验核心概述
    • 1. 实验目标
    • 2. 实验环境
    • 3. 核心原理与关键函数
    • 二、完整实验内容与代码实现
      • (一)彩色图转灰度图的压缩比计算
      • (二)DCT 变换与图像重构
      • (三)基于 DCT 的量化与掩模压缩
      • (四)Huffman 编码无损压缩
      • (五)基于小波变换的多分辨率压缩
    • 三、实验总结与关键知识点
      • 1. 核心技术梳理
      • 2. 关键注意事项
      • 3. 应用场景拓展
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档