使用动态规划法求下面图像压缩问题的解. 若一图像各象素点灰度值为:85,87,95,22,18,19,20,24,25,27,29,30,24,2,3,4 求使用动态规划法求其最优解时的矩阵p,b,l,s的值,并给出最优解.
时间: 2023-10-06 10:12:05 浏览: 46
图像压缩-动态规划课件
这道题可以使用动态规划的思想,对于一段连续的像素点,我们可以选择将其合并或者不合并,合并的代价是两个像素点的灰度值之和,不合并的代价为0。我们需要求出将所有像素点合并为一段的最小代价。
我们可以定义一个二维数组p来表示合并i到j这一段像素点的最小代价,定义一个二维数组b来记录i到j这一段像素点中最后一次合并的位置,定义一个一维数组l来记录每段合并后的长度,定义一个一维数组s来记录每段的起始位置。
根据动态规划的思想,我们可以先从小段像素点开始计算,然后逐渐扩大范围,直到计算出最终的结果。
以下是具体的计算过程:
1. 当只有一个像素点时,其最小代价为0。
p[i][i] = 0 (i=1,2,...,16)
2. 当有两个像素点时,其最小代价为两个像素点的灰度值之和。
p[i][i+1] = a[i] + a[i+1] (i=1,2,...,15)
3. 当有三个或以上的像素点时,我们需要枚举合并的位置k,将i到k这一段像素点合并成一段,k+1到j这一段像素点合并成一段,然后加上这两段的最小代价,就是i到j这一段的最小代价。我们需要枚举所有可能的k,找出最小的代价。
p[i][j] = min{p[i][k] + p[k+1][j] + sum(i,j)} (i<=k<j)
其中sum(i,j)表示i到j这一段像素点的灰度值之和。
为了记录每一段的具体信息,我们还需要计算b,l,s数组的值。具体的计算方法如下:
b[i][j]表示i到j这一段像素点最后一次合并的位置。当i到j只有两个像素点时,其最后一次合并的位置为i。
b[i][i+1] = i (i=1,2,...,15)
当i到j有三个或以上的像素点时,我们需要枚举合并的位置k,找到代价最小的k,其最后一次合并的位置即为k。
p[i][j] = min{p[i][k] + p[k+1][j] + sum(i,j)} (i<=k<j)
for i=1 to 16
b[i][i] = i
l[i] = 1
s[i] = i
end for
for len=2 to 16
for i=1 to 16-len+1
j = i+len-1
p[i][j] = ∞
for k=i to j-1
q = p[i][k] + p[k+1][j] + sum(i,j)
if q < p[i][j] then
p[i][j] = q
b[i][j] = k
end if
end for
if i = b[i][j] then
l[i][j] = j-i+1
s[i][j] = i
else
l[i][j] = l[i][b[i][j]] + l[b[i][j]+1][j]
s[i][j] = s[i][b[i][j]]
end if
end for
end for
最终的最优解为p[1][16]=382。
需要注意的是,在实际应用中,由于像素点的数量可能非常大,我们需要采用一些优化方法,如分块、近似算法等,来加速计算。
阅读全文