概述
p = [10,12,15,255,1,2] #像素点灰度值数组
def length(value): #计算像素点灰度值的存储位数(相当于log取整)
i = 0
while value != 0:
i += 1
value = (int)(value / 2)
return i
def Compress(p,header): #动态规划计算出最优分段(即分段后图像存储花费内存空间最小)
LMax = 256 #规定的最大段长
P = p[:] #像素点灰度值的克隆(规范操作)
P.insert(0,0) #为了后续算法实现的方便,使索引从1开始
n = len(p) #像素点个数
b = [0] #像素点位数数组,在首位置插入0是索引从1开始
s = [0] * (n+1) #记录存储空间的动态规划最优分段数组s
l = [0] * (n+1) #记录分段长度的动态规划最优分段数组l
for i in range(1,n+1): #动态规划开始
b.insert(i,length(P[i]))
bmax = b[i]
s[i] = s[i-1] + bmax #初始化s[i]与l[i]
l[i] = 1
for j in range(2,i+1): #从第i个元素开始依次向前将p[i-j+1,i]合并为一段,通过j的累加,比较并选择出最优的划分
if j > LMax:
break
if b[i-j+1] > bmax: #以本段元素中最大的位数为本段每个元素的存储位数
bmax = b[i-j+1]
temp = s[i-j] + bmax * j
if temp < s[i]: #记录最优值和段长
s[i] = temp
l[i] = j
s[i] += header #段头信息所消耗的存储空间
print('记录存储空间的动态规划最优分段数组s:',s)
print('记录分段长度的动态规划最优分段数组l:',l)
print('最优的存储空间大小为:',s[n])
return s,l,b
def trace(b,l): #倒序追踪分段信息
back = []
t = len(b) - 1
while t != 0:
back.append((l[t],b[t]))
t -= l[t]
k = 1 #段的编号
for i in range(len(back)-1,-1,-1):
print('第',k,'段的元素个数为:',back[i][0],',存储单元的位数为:',back[i][1])
k += 1
print('像素点灰度值数组:',p)
s,l,b = Compress(p,11)
trace(b,l)
输出:
像素点灰度值数组: [10, 12, 15, 255, 1, 2]
记录存储空间的动态规划最优分段数组s: [0, 15, 19, 23, 42, 50, 57]
记录分段长度的动态规划最优分段数组l: [0, 1, 2, 3, 1, 2, 2]
最优的存储空间大小为: 57
第 1 段的元素个数为: 3 ,存储单元的位数为: 4
第 2 段的元素个数为: 1 ,存储单元的位数为: 8
第 3 段的元素个数为: 2 ,存储单元的位数为: 2
最后
以上就是魁梧海燕为你收集整理的小黑算法成长日记9:基于动态规划灰度值分段存储的图像压缩算法的全部内容,希望文章能够帮你解决小黑算法成长日记9:基于动态规划灰度值分段存储的图像压缩算法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复