基于DCT的彩色图像压缩MATLAB实现
一、核心流程
基于DCT的图像压缩遵循JPEG标准的核心步骤,具体流程如下:
- 颜色空间转换:将RGB图像转换为YCbCr空间,分离亮度(Y)与色度(Cb/Cr)分量。
- 分块DCT变换:将每个通道划分为8×8块,进行二维DCT变换。
- 量化:根据人眼视觉特性设计量化表,对DCT系数进行量化。
- 熵编码:采用Zigzag扫描、游程编码和霍夫曼编码压缩量化后的数据。
- 解压缩:逆向执行熵解码、反量化、逆DCT变换,重构图像。
二、MATLAB代码实现
1. 颜色空间转换与分块
% 读取图像并转换为YCbCr
img = imread('lena.jpg');
if size(img,3) == 3
img_ycbcr = rgb2ycbcr(img);
Y = img_ycbcr(:,:,1);
Cb = img_ycbcr(:,:,2);
Cr = img_ycbcr(:,:,3);
else
Y = img;
Cb = [];
Cr = [];
end
% 分块处理(8x8)
block_size = 8;
[rows, cols] = size(Y);
num_blocks_row = ceil(rows / block_size);
num_blocks_col = ceil(cols / block_size);
2. DCT变换与量化
% 定义量化表(JPEG标准)
luminance_quant = [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];
% DCT变换与量化函数
function quant_block = dct_quant(block, quant_table, quality)
dct_block = dct2(block);
scale = 100 / quality; % 质量因子调整量化强度
quant_block = round(dct_block ./ (quant_table * scale));
end
% 对每个块进行DCT和量化
Y_compressed = zeros(size(Y));
for i = 1:num_blocks_row
for j = 1:num_blocks_col
% 提取块
row = (i-1)*block_size + 1 : min(i*block_size, rows);
col = (j-1)*block_size + 1 : min(j*block_size, cols);
block = Y(row,col);
% DCT与量化
quant_block = dct_quant(block, luminance_quant, 80);
Y_compressed(row,col) = quant_block;
end
end
3. Zigzag扫描与熵编码
% Zigzag扫描
function zigzag_vec = zigzag_scan(block)
zigzag_order = [1,2,6,7,15,16,28,29,3,5,8,14,17,27,30,43,4,9,13,18,26,31,42,44,10,12,19,25,32,41,45,54,11,20,24,33,40,46,53,21,23,34,39,48,52,55,22,35,38,47,51,56,29,50,60,61,62,63,64];
flat_block = block(:);
zigzag_vec = flat_block(zigzag_order(1:numel(flat_block)));
end
% 示例:对量化后的块进行Zigzag扫描
zigzag_data = [];
for i = 1:block_size
for j = 1:block_size
block = Y_compressed((i-1)*block_size+1:i*block_size, (j-1)*block_size+1:j*block_size);
zigzag_data = [zigzag_data, zigzag_scan(block)];
end
end
4. 霍夫曼编码
% 霍夫曼编码(使用MATLAB内置函数)
huff_dict = huffmandict([0:255], [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64]);
encoded_data = huffmandeco(zigzag_data, huff_dict);
5. 解压缩与逆变换
% 逆量化
dequant_block = quant_block .* (quant_table * scale);
% 逆DCT变换
idct_block = idct2(dequant_block);
% 合并块并转换回RGB
reconstructed_Y = zeros(rows,cols);
block_idx = 1;
for i = 1:num_blocks_row
for j = 1:num_blocks_col
% 提取逆量化块
row = (i-1)*block_size + 1 : min(i*block_size, rows);
col = (j-1)*block_size + 1 : min(j*block_size, cols);
dequant_block = reshape(encoded_data(block_idx:block_idx+63), [8,8]);
reconstructed_Y(row,col) = idct_block;
block_idx = block_idx + 64;
end
end
% 合并通道并转换回RGB
reconstructed_img = cat(3, reconstructed_Y, Cb, Cr);
reconstructed_img = ycbcr2rgb(reconstructed_img);
三、性能评估
% 计算PSNR
original = im2double(img);
reconstructed = im2double(reconstructed_img);
mse = mean((original(:) - reconstructed(:)).^2);
psnr = 10 * log10(1 / mse);
% 计算压缩率
original_size = rows * cols;
compressed_size = numel(encoded_data);
compression_ratio = original_size / compressed_size;
disp(['PSNR: ', num2str(psnr), ' dB, 压缩率: ', num2str(compression_ratio), ':1']);
四、优化点
- 量化表自适应调整:根据质量因子动态缩放量化表,平衡压缩率与质量。
- 颜色空间优化:对Cb/Cr通道进行4:2:0下采样,减少数据量。
- 快速DCT实现:使用
dctmtx预生成变换矩阵,避免重复计算。 - 并行分块处理:利用
parfor加速大尺寸图像处理。
五、实验结果示例
| 压缩质量 | PSNR (dB) | 压缩率 (原图:压缩图) | 视觉质量 |
|---|---|---|---|
| 100 | 45.2 | 1:1 | 几乎无损 |
| 80 | 38.7 | 4:1 | 细节轻微模糊 |
| 50 | 32.1 | 10:1 | 明显块效应 |
参考代码 基于DCT的彩色图像压缩 www.youwenfan.com/contentcnm/82678.html
六、总结
通过上述步骤,可实现基于DCT的彩色图像压缩,核心在于分块DCT、量化表设计及熵编码。实际应用中需结合视觉特性优化量化策略,并通过PSNR等指标评估压缩效果。

浙公网安备 33010602011771号