数字图像编码

一、实验目的和要求

1、了解有关数字图像压缩的基本概念,了解几种常用的图像压缩编码方式;

2、进一步熟悉JPEG编码与离散余弦变换(DCT)变换的原理及含义;

3、掌握编程实现离散余弦变换(DCT)变换及JPEG编码的方法;

二、实验内容简介

1、基本概念

2、无损图像压缩编码

3、有损图像压缩编码

4、图像压缩标准

三、实验步骤

1、使用matlab的DPCM函数对锯齿波信号进行编解

2、 对彩色图像进行DPCM编码

3、 对一维序列进行dct变换,并计算变换后多少个元素能量占全部的99%

 4、对图像进行DCT变换,并通过DCT逆变换矩阵相关系数置零实现对图像的压缩

 可以查看压缩前后的文件属性

 5、对图像进行小波分解和重构

 四、实验心得

 1、通过本次实验,学习了有损和无损图像压缩编码,无损压缩:在压缩和解压过程中没有信息损失;有损压缩:解压后图像不能恢复原状。

首先学习了霍夫曼编码,它是一种无损图像压缩编码,了解了它的基本步骤:

(1)将所有符号按照出现概率大小降序排列;

(2)从概率最小的两个符号开始,分别配以0和1两种码元(注意顺序会影响编码结果,也可以反过来)。然后将这两个符号概率相加继续和未编码的符号进行码元分配。

(3)按照码元分配顺序,像这样从下往上,直到分配到第一行符号概率最大,也必然为0)。

(4)最后,从上往下读取编码后的结果,即为哈夫曼编码。

2、其次学习了有损图像压缩编码,有以下这些:

(1)DPCM编码:

DPCM,个人理解就是用前一个像素(左边或者上边)来作为下一个像素值的预测值,而一个像素存储值的就会变成预测值与当前实际值的差值。经过DPCM编码,可以提高数据所占的比特数,降低所占内存,从而提高传输效率。但因为DPCM编码为有损编码,在进行量化的过程中会引入量化误差,因此相较于原图像,其图像质量会有所下降。

(2)离散余弦变换编码(DCT):

只使用余弦函数来表达信号,与傅里叶变换紧密相关。在图像数据的压缩中,通过将图像分成大小相等(一般为8*8)的块,利用DCT对其进行变换,得到更加简洁的数据。

dct()一维DCT变换;dct2() 二维DCT变换;idct2() 二维DCT逆变换

利用DCT对图像进行有损编码的主要步骤为:

①将输入图像分解为8×8的块;

②对每个块进行二维DCT变换;

③将图像变换到频域;

④ 每个块只保留部分DCT的系数(可分别保留1,5,10,30和64个系数);

⑤进行DCT反变换的滤波图像。

(3)小波变换:

小波变换用于图像压缩的基本思想就是根据二维小波分解算法,将一幅图像做小波分解,可得到一系列不同分辨率的图像。表现一幅图像最主要的部分是低频部分,而水平、垂直和对角线部分表征了原图像的边缘信息,具有明显的方向特性。低频部分可以称为亮度图像,水平、垂直和对角线部分可以称为细节图像。如果去掉图像的高频部分,保留低频部分,再根据人类的视觉生理和心理特点分别作不同策略的量化和编码处理,则可以达到图像压缩的目的。

用到的函数:

①wcompress()——使用小波对灰度或彩色图像进行压缩或解压缩;

②dwt2():单级离散二维小波变换

[cA,cH,cV,cD]=dwt2(X,'wname')——进行二维小波变换,计算近似互相关矩阵cA和水平、垂直、对角方向的互相关矩阵cH、cV、cD。

③wdencmp():对一维或二维信号使用小波进行降噪或压缩。

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
LZW(Lempel-Ziv-Welch)压缩算法是一种无损压缩算法,能够对数据流进行有效压缩。在图像压缩方面,LZW算法可以将原始图像数据流进行压缩,并且不会损失原始图像的任何信息。下面是一个基于 MATLAB 的 LZW 图像压缩编码实现: ```matlab function [compressedImage, dict] = lzw_compress(image) % 将图像转换为一维数据流 data = reshape(image, 1, []); % 初始化编码字典 dict = cell(256, 1); for i = 1:256 dict{i} = uint8(i-1); end % 初始化编码参数 code = 257; p = uint8([]); compressedImage = []; % LZW 编码 for i = 1:numel(data) c = data(i); pc = [p c]; if ismember(pc, dict) p = pc; else compressedImage = [compressedImage uint16(find(ismember(dict, p)))]; dict{code} = pc; code = code + 1; p = c; end end % 将编码后的数据流转换为字节流 compressedImage = typecast(compressedImage, 'uint8'); end ``` 这个函数将输入的图像 `image` 转换为一维数据流 `data`,并且初始化编码字典。接下来,我们对数据流进行 LZW 编码,将编码后的数据转换为字节流并返回。此外,函数还返回了编码字典 `dict`,方便解码时使用。 以下是一个基于 MATLAB 的 LZW 图像压缩编码实现: ```matlab function image = lzw_decompress(compressedImage, dict) % 将字节流转换为编码数据流 compressedImage = typecast(compressedImage, 'uint16'); % 初始化解码参数 code = 257; p = uint8([]); data = []; % LZW 解码 for i = 1:numel(compressedImage) k = compressedImage(i); if k <= 256 c = dict{k}; else c = [p dict{k}(1)]; end data = [data c]; if ~isempty(p) dict{code} = [p c(1)]; code = code + 1; end p = c; end % 将一维数据流转换为图像 image = reshape(data, size(image)); end ``` 这个函数将输入的压缩后的字节流 `compressedImage` 转换为编码数据流,然后初始化解码参数。接下来,我们对编码数据流进行 LZW 解码,将解码后的数据转换为图像并返回。函数中的解码过程与编码过程不同,因为我们需要在解码过程中构建编码字典。因此,我们使用了一个变量 `code` 来追踪下一个字典条目的编码值。 这是一个简单的 LZW 图像压缩编码实现,可以用于对图像进行无损压缩。需要注意的是,该实现仅支持 8 位灰度图像。如果要支持彩色图像,需要对每个颜色通道分别进行压缩编码
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风吹向我吧~

欢迎投喂!!❤

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值