实验04:图像压缩(DP算法)

1.实验目的

掌握动态规划算法的基本思想以及用它解决问题的一般技巧。运用所熟悉的编程工具,运用动态规划的思想来求解图像压缩问题。

2.实验内容

给定一幅图像,求解最佳压缩,使得压缩后的文件最小。

3.实验要求

实现lena512.raw(称为原文件)图像压缩并保存到文件(称为压缩文件)中。编写相应的解码器,对保存的文件解压出图像,并将解压图像存储为raw文件,通过图像浏览工具验证解压文件和原文件相同。分析压缩率(即 压缩文件大小 除以 原文件大小),分析算法的时间复杂度和空间复杂度。

□ \square 基础性实验 □ \square 综合性实验 ⊠ \boxtimes 设计性实验


实验报告正文

一、问题分析(模型、算法设计和正确性证明等)

设灰度图像共 n n n个像素值,灰度图像可以视作一个一维向量 P = { p 1 , p 2 , . . . . . . , p n } P=\{p_1, p_2, ...... , p_n\} P={p1,p2,......,pn},将n个像素分割成m个连续段 { S i } i = 1 m \{S_i\}_{i=1}^m {Si}i=1m.

其中,对第 i i i S i S_i Si有下列相关变量:

符号表示含义
l [ i ] l[i] l[i]段长,该段内包含像素个数
b [ i ] b[i] b[i]该段中各像素位宽, b [ i ] = ⌈ log ⁡ ( 1 + max ⁡ p k ∈ S i p k ) ⌉ b[i]=\lceil {\log{(1+\max_{p_k \in S_i}{p_k}})} \rceil b[i]=log(1+maxpkSipk)

约定每段长度 l [ i ] l[i] l[i]满足:$1\leq l[i] \leq 256 且 且 b[i]\geq 1$.

已知: 0 ≤ p k ≤ 255 0\leq p_k \leq 255 0pk255,故 1 ≤ b [ i ] ≤ 8 1\leq b[i]\leq 8 1b[i]8

S i S_i Si编码压缩如下:
l [ i ] − 1 b [ i ] − 1 { p i + 1 , p i + 2 . . . . . . , p i + l [ i ] } 8 b i t s 3 b i t s l [ i ] × b [ i ] b i t s \begin{matrix} l[i]-1 & b[i]-1 & \{p_{i+1}, p_{i+2}......, p_{i+l[i]}\}\\ 8bits & 3bits & l[i]\times b[i]bits \end{matrix} l[i]18bitsb[i]13bits{pi+1,pi+2......,pi+l[i]}l[i]×b[i]bits
压缩完成后,共占用空间: l [ i ] × b [ i ] + 11 l[i]\times b[i] + 11 l[i]×b[i]+11

f ( { S i } 1 m ) f(\{S_i\}_1^m) f({Si}1m)表示压缩为 m m m个连续子段集合 { S i } 1 m \{S_i\}_1^m {Si}1m占用空间,则递归表达如下:
f ( { S i } 1 m ) = f ( { S i } 1 m − 1 ) + 11 (1) f(\{S_i\}_1^m)=f(\{S_i\}_1^{m-1})+11\tag1 f({Si}1m)=f({Si}1m1)+11(1)
最优子结构性质

设最优分段为 { S i } i = 1 m \{S_i\}_{i=1}^m {Si}i=1m,其中第 m m m个分段 S m S_m Sm的长度为 l e n len len,则 { S i } i = 1 m − 1 \{S_i\}_{i=1}^{m-1} {Si}i=1m1是子问题 { p 1 , p 2 , . . . . . . , p n − l e n } \{p_1, p_2, ......, p_{n-len}\} {p1,p2,......,pnlen}的最优分段,递归表达如下:
f ( { S i } i = 1 m ) = f ( { S i } i = 1 m − 1 ) + f ( { S m } ) (2) f(\{S_i\}_{i=1}^m)=f(\{S_i\}_{i=1}^{m-1})+f(\{S_m\})\tag2 f({Si}i=1m)=f({Si}i=1m1)+f({Sm})(2)

简要证明过程如下:

假设 { S i } i = 1 m \{S_i\}_{i=1}^m {Si}i=1m为原问题最优分段,即 f ( { S i } i = 1 m ) f(\{S_i\}_{i=1}^m) f({Si}i=1m)值最小,但 { S i } i = 1 m − 1 \{S_i\}_{i=1}^{m-1} {Si}i=1m1不是子问题的最优解。

则将其分段策略调整为最优解后, f ( { S i } i = 1 m − 1 ) f(\{S_i\}_{i=1}^{m-1}) f({Si}i=1m1)值减少, f ( { S i } i = 1 m ) = f ( { S i } i = 1 m − 1 ) + f ( { S m } ) f(\{S_i\}_{i=1}^m)=f(\{S_i\}_{i=1}^{m-1})+f(\{S_m\}) f({Si}i=1m)=f({Si}i=1m1)+f({Sm})值减少,与假设矛盾。

令g(n)表示像素序列{p_1, p_2, …, p_n}的最优分段占用空间,则有递归公式如下:
g ( n ) = min ⁡ ( g ( n − k ) + k × b m a x + 11 ) , 1 ≤ k ≤ min ⁡ ( n , 256 ) (3) g(n)=\min(g(n-k)+k\times b_{max}+11), 1\leq k \leq \min{(n, 256)}\tag3 g(n)=min(g(nk)+k×bmax+11),1kmin(n,256)(3)

二、算法设计复杂度分析(伪代码,不要粘贴源码)

时间复杂度:
T ( n ) ∈ θ ( ∑ i = 1 n min ⁡ ( i , L m a x ) ) = θ ( L m a x × n ) = θ ( n ) T(n) \in \theta(\sum_{i=1}^{n}{\min{(i, Lmax)}})=\theta(Lmax\times n)=\theta(n) T(n)θ(i=1nmin(i,Lmax))=θ(Lmax×n)=θ(n)
空间复杂度:

该算法需要辅助空间储存段长、位宽及前 i i i个像素最优压缩占用空间大小, S ( n ) ∈ θ ( n ) S(n)\in \theta(n) S(n)θ(n).

三、实验结果记录和分析(测试向量上的测试结果、运行时间)

实验结果:

原图像大小压缩后大小
262114字节257550字节

压缩率: ( 1 − 257550 262114 ) × 100 % ≈ 1.75 % (1-\frac{257550}{262114} )\times 100\% \approx 1.75\% (1262114257550)×100%1.75%,详见RESULT文件夹

算法运行时间:267.847
在这里插入图片描述

在这里插入图片描述

结果验证:

在这里插入图片描述

文件大小一致,下使用c++库OpenCV将Decode_lena.raw转存为jpg格式文件,详见RESULT文件夹。

在这里插入图片描述

与原图像一致,详见RESULT文件夹。

四、总结(可描述出现的问题和解决方法、经验和反思等)

本实验中采用bin文件格式保存中间编码(压缩)文件以直观显示压缩完成后文件大小,本实验所有代码保存于CODE文件夹,所有结果保存于RESULT文件夹以便老师查阅。

本实验的压缩方式相对单一,压缩率较低,有较大提升空间,具体算法有:

  1. 将像素值均大于 2 7 = 128 2^7=128 27=128的分段进行取反操作,保存像素值与 256 256 256之差,段长最大值减一,需多加一位符号位表示是否取反,对于像素值较大的图像压缩率较大。
  2. 对于一段像素值用高斯分布等概率模型拟合,保存参数后解压时用概率分布函数生成像素值。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值