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

数字图像处理实验报告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 压缩各有优缺点,适用于不同的应用场景。在实际应用中,需要根据具体需求选择合适的方法,以在压缩比和图像质量之间取得最佳平衡

相关文章:

  • Python 责任链模式
  • 蓝桥云客 2022
  • 坚持的力量与智慧策略
  • cv2.fillPoly()和cv2.polylines()
  • 【分布式】Hystrix 的核心概念与工作原理​
  • Java的设计模式详解
  • 【数论4】求解线性同余方程和方程组
  • FPGA | 等精度测频应用与实践
  • RSTP --- 快速生成树
  • 如何成功点亮LED灯并实现闪烁效果
  • ROS软路由多wifi多IP搭建一览表
  • 红黑树剖析
  • DirectX修复工具免费版下载安装教程(附安装包)
  • 蓝桥杯 XYZ
  • elementui中el-form自定义表单校验规则
  • Java后端开发(十八)-- 使用JAXB,将JavaBean转换XML文本
  • 基础知识专题整理-----持续更新
  • lib-zo,C语言另一个协程库,整理
  • leetcode0704. 二分查找-easy
  • 关于labview中路径的问题
  • 好看企业官网源码/关键词seo优化排名
  • 广平专业做网站/网络营销师
  • 网站建设 齐鲁软件园/做一个网站需要多少钱大概
  • 做代购在哪个网站好/软件开发培训班
  • 什么网站做电器出租/长沙靠谱seo优化
  • 在美国注册一个网站 大陆做销售/如何让百度收录网址