数字图像处理实验报告7-图像压缩编码
实验题目:图像压缩编码
实验目的:理解游程编码原理,掌握其实现方法;理解离散余弦变换编码原理,掌握其实现方法;对实验结果进行分析,得出实验结论并撰写实验报告。
实验环境:(硬件和软件) PC机、 Matlab软件
实验内容:
(1)基于游程编码的图像压缩。
(2)基于离散余弦变换的图像压缩。
实验(1)步骤
(1)新建程序文件
(2)编写程序如下
% 加载图像
img = imread('lena.jpg'); % 假设图像文件名为 'lena.jpg'
% 如果图像是彩色的,先转换为灰度图像
if size(img, 3) == 3
img_gray = rgb2gray(img);
else
img_gray = img;
end
% 设置不同的阈值
thresholds = [0.2, 0.4, 0.6];
% 创建一个新的 figure
figure;
% 原始灰度图像
subplot(2, 2, 1);
imshow(img_gray);
title('实验人: zylj-2310120168');
xlabel('原始灰度图像');
% 阈值 0.2 的二值化图像
subplot(2, 2, 2);
img_bw1 = im2bw(img_gray, thresholds(1));
imshow(img_bw1);
title('实验人: zylj-2310120168');
xlabel(['阈值: ', num2str(thresholds(1))]);
% 阈值 0.4 的二值化图像
subplot(2, 2, 3);
img_bw2 = im2bw(img_gray, thresholds(2));
imshow(img_bw2);
title('实验人: zylj-2310120168');
xlabel(['阈值: ', num2str(thresholds(2))]);
% 阈值 0.6 的二值化图像
subplot(2, 2, 4);
img_bw3 = im2bw(img_gray, thresholds(3));
imshow(img_bw3);
title('实验人: zylj-2310120168');
xlabel(['阈值: ', num2str(thresholds(3))]);
% 计算压缩比
original_bits = 8; % 原始灰度图像每像素 8 位
compressed_bits = 1; % 二值化图像每像素 1 位
compression_ratio = original_bits / compressed_bits;
% 输出压缩比结果
fprintf('压缩比为 %.1f:1\n', compression_ratio);
(3)运行程序
实验(2)步骤
(1)新建程序文件
(2)编写程序如下
% 加载图像
img = imread('lena.jpg'); % 假设图像文件名为 'lena.jpg'
% 如果图像是彩色的,先转换为灰度图像
if size(img, 3) == 3
img_gray = rgb2gray(img);
else
img_gray = img;
end
% 归一化到 [0, 1]
img_normalized = double(img_gray) / 255;
% 设置 DCT 块大小
block_size = 8;
% 设置模板矩阵
mask1 = [1 1 1 1 1 0 0 0;
1 1 1 1 0 0 0 0;
1 1 1 0 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];
mask2 = [1 1 1 1 0 0 0 0;
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];
mask3 = [1 1 1 0 0 0 0 0;
1 1 1 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];
% 创建一个新的 figure
figure;
% 原始灰度图像
subplot(2, 2, 1);
imshow(img_gray, []);
title('实验人: zylj-2310120168');
xlabel('原始灰度图像');
% 使用 mask1 压缩
reconstructed_img1 = dct_compress(img_normalized, mask1, block_size);
subplot(2, 2, 2);
imshow(reconstructed_img1, []);
title('实验人: zylj-2310120168');
xlabel(['mask1 均方误差: ', num2str(calculate_mse(img_normalized, reconstructed_img1))]);
% 使用 mask2 压缩
reconstructed_img2 = dct_compress(img_normalized, mask2, block_size);
subplot(2, 2, 3);
imshow(reconstructed_img2, []);
title('实验人: zylj-2310120168');
xlabel(['mask2 均方误差: ', num2str(calculate_mse(img_normalized, reconstructed_img2))]);
% 使用 mask3 压缩
reconstructed_img3 = dct_compress(img_normalized, mask3, block_size);
subplot(2, 2, 4);
imshow(reconstructed_img3, []);
title('实验人: zylj-2310120168');
xlabel(['mask3 均方误差: ', num2str(calculate_mse(img_normalized, reconstructed_img3))]);
% 计算均方误差的函数
function mse = calculate_mse(original, compressed)
mse = mean((original - compressed).^2, 'all');
end
% DCT 压缩和重建函数
function reconstructed_img = dct_compress(img, mask, block_size)
[rows, cols] = size(img);
reconstructed_img = zeros(rows, cols);
% 扩展 mask 到图像大小
mask_extended = repmat(mask, ceil(rows / block_size), ceil(cols / block_size));
mask_extended = mask_extended(1:rows, 1:cols);
for i = 1:block_size:rows
for j = 1:block_size:cols
% 提取块
block = img(i:min(i+block_size-1, rows), j:min(j+block_size-1, cols));
% DCT 变换
dct_block = dct2(block);
% 应用模板
dct_block = dct_block .* mask_extended(i:min(i+block_size-1, rows), j:min(j+block_size-1, cols));
% 逆 DCT 变换
idct_block = idct2(dct_block);
% 重建图像
reconstructed_img(i:min(i+block_size-1, rows), j:min(j+block_size-1, cols)) = idct_block;
end
end
end
实验数据记录:
图片暂时不予提供
问题讨论:
图像二值化
基本原理:图像二值化是将灰度图像转换为二值图像的过程,通过设定一个阈值,将图像中的像素值分为两类,即前景和背景。通常,前景像素值为 1(白色),背景像素值为 0(黑色)。
压缩比计算:二值化图像的压缩比为 8:1,因为二值化图像每个像素只用 1 位表示,而原始灰度图像每个像素用 8 位表示。
阈值选择的影响:不同的阈值会影响二值化图像的视觉效果。较低的阈值会使更多的像素被识别为前景,图像细节更丰富,但可能会引入噪声;较高的阈值会使图像更简洁,但可能会丢失一些细节。
应用场景:图像二值化在文档处理、字符识别、目标检测等领域有广泛应用。它能够简化图像处理流程,提高处理效率,同时减少存储需求。
DCT 压缩
基本原理:DCT(离散余弦变换)压缩是一种基于变换编码的图像压缩技术。它通过将图像分成小块(通常是 8x8 的块),对每块进行 DCT 变换,然后对变换后的系数进行量化和编码,从而实现图像的压缩。
模板矩阵的作用:模板矩阵用于选择保留的低频系数和舍弃的高频系数。不同的模板矩阵会影响压缩效果和图像质量。保留更多的低频系数可以提高图像质量,但会降低压缩比;反之,舍弃更多的高频系数可以提高压缩比,但会降低图像质量。
均方误差(MSE):均方误差是衡量原始图像和压缩图像之间差异的指标。MSE 越小,表示压缩图像与原始图像越接近,图像质量越高。
应用场景:DCT 压缩在图像和视频压缩领域有广泛应用,如 JPEG 图像压缩和 MPEG 视频压缩。它能够在保证一定图像质量的同时,显著减少存储需求和传输带宽。
辩证分析
图像二值化与 DCT 压缩的比较:
压缩比:图像二值化具有固定的压缩比(8:1),而 DCT 压缩的压缩比可以通过调整模板矩阵灵活控制。
图像质量:图像二值化会丢失大量细节信息,适合简单的二值图像处理;DCT 压缩通过保留低频系数,在压缩比和图像质量之间取得平衡,适合复杂图像的压缩。
应用场景:图像二值化适用于需要简化图像处理流程的场景,如文档处理和字符识别;DCT 压缩适用于需要在压缩比和图像质量之间取得平衡的场景,如图像和视频存储与传输。
多方面看问题:
技术原理:图像二值化和 DCT 压缩虽然原理不同,但都旨在通过减少冗余信息实现图像压缩。
应用场景:不同的压缩技术适用于不同的应用场景,需要根据具体需求选择合适的方法。
优缺点:图像二值化简单高效,但丢失大量细节;DCT 压缩灵活可控,但计算复杂度较高。
综上所述,图像二值化和 DCT 压缩各有优缺点,适用于不同的应用场景。在实际应用中,需要根据具体需求选择合适的方法,以在压缩比和图像质量之间取得最佳平衡