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+maxpk∈Sipk)⌉ |
约定每段长度 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 0≤pk≤255,故 1 ≤ b [ i ] ≤ 8 1\leq b[i]\leq 8 1≤b[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}1m−1)+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=1m−1是子问题
{
p
1
,
p
2
,
.
.
.
.
.
.
,
p
n
−
l
e
n
}
\{p_1, p_2, ......, p_{n-len}\}
{p1,p2,......,pn−len}的最优分段,递归表达如下:
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=1m−1)+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=1m−1不是子问题的最优解。
则将其分段策略调整为最优解后, f ( { S i } i = 1 m − 1 ) f(\{S_i\}_{i=1}^{m-1}) f({Si}i=1m−1)值减少, 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=1m−1)+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(n−k)+k×bmax+11),1≤k≤min(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=1∑nmin(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\% (1−262114257550)×100%≈1.75%,详见RESULT文件夹
算法运行时间:267.847
结果验证:
文件大小一致,下使用c++库OpenCV将Decode_lena.raw转存为jpg格式文件,详见RESULT文件夹。
与原图像一致,详见RESULT文件夹。
四、总结(可描述出现的问题和解决方法、经验和反思等)
本实验中采用bin文件格式保存中间编码(压缩)文件以直观显示压缩完成后文件大小,本实验所有代码保存于CODE文件夹,所有结果保存于RESULT文件夹以便老师查阅。
本实验的压缩方式相对单一,压缩率较低,有较大提升空间,具体算法有:
- 将像素值均大于 2 7 = 128 2^7=128 27=128的分段进行取反操作,保存像素值与 256 256 256之差,段长最大值减一,需多加一位符号位表示是否取反,对于像素值较大的图像压缩率较大。
- 对于一段像素值用高斯分布等概率模型拟合,保存参数后解压时用概率分布函数生成像素值。