
imfinfo(图像属性查询)、dct2/idct2(DCT 变换与逆变换)、huffmandict/huffmanenco(Huffman 编码)、dwt2/idwt2(小波分解与重构)。读取彩色图像→转换为灰度图→查询图像属性→计算基于文件大小的压缩比。
% 读取彩色图像
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)]);
彩色图→灰度图→DCT 变换→逆 DCT 重构→归一化→对比变换前后图像及矩阵变化。
% 读取彩色图像
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(:)));
灰度图→补零为 8 的整数倍→8x8 分块 DCT 变换→量化 / 掩模过滤→逆 DCT 重构→对比压缩效果。
% 读取彩色图像并转换为灰度图
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));
灰度图→提取像素序列→生成 Huffman 字典→编码与解码→计算压缩比。
% 读取彩色图像并转换为灰度图
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)]);
灰度图→一级小波分解(LL 低频 + LH/HL/HH 高频)→不同阈值过滤高频系数→小波重构→对比压缩效果与压缩比。
% 读取图像并转换为灰度图
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
实验模块 | 压缩类型 | 核心逻辑 | 压缩比 | 适用场景 |
|---|---|---|---|---|
彩色转灰度 | 无损(通道压缩) | 减少颜色通道冗余 | ~1.5 | 无需彩色信息的场景 |
DCT 量化压缩 | 有损(频域压缩) | 量化 + 高频置零 | 中高 | JPEG 标准核心、普通图像存储 |
Huffman 编码 | 无损(编码压缩) | 基于概率的变长编码 | ~1.1 | 无失真要求的压缩(如医疗图像) |
小波变换压缩 | 有损(多分辨率压缩) | 过滤高频细节 | 3-4 | 分级传输、高质量压缩场景 |
double类型,避免uint8运算溢出;通过本次实验,系统掌握了图像压缩的核心技术与实现方法,理解了不同压缩算法的原理与适用场景,为实际工程中选择合适的压缩方案提供了技术支撑