动态规划之图像压缩算法
来源:互联网 发布:小额网络个人基金产品 编辑:程序博客网 时间:2024/05/29 16:29
1、问题描述:
在计算机中,常用像素点的灰度值序列{p1,p1,……pn}表示图像。其中整数pi,1<=i<=n,表示像素点i的灰度值。通常灰度值的范围是0~255。因此最多需要8位表示一个像素。
压缩的原理就是把序列{p1,p1,……pn}进行设断点,将其分割成一段一段的。分段的过程就是要找出断点,让一段里面的像素的最大灰度值比较小,那么这一段像素(本来需要8位)就可以用较少的位(比如7位)来表示,从而减少存储空间。
b代表bits,l代表length,分段是,b[i]表示每段一个像素点需要的最少存储空间(少于8位才有意义),l[i]表示每段里面有多少个像素点,s[i]表示从0到i压缩为一共占多少存储空间。
如果限制l[i]<=255,则需要8位来表示l[i]。而b[i]<=8,需要3位表示b[i]。所以每段所需的存储空间为l[i]*b[i]+11位。假设将原图像分成m段,那么需要位的存储空间。
图像压缩问题就是要确定像素序列{p1,p1,……pn}的最优分段,使得依此分段所需的存储空间最小。
2、最优子结构性质
设l[i],b[i],1<=i<=m是{p1,p1,……pn}的一个最优分段,则l[1],b[1]是{p1,……,pl[1]}的一个最优分段,且l[i],b[i],2<=i<=m是{pl[1]+1,……,pn}的一个最优分段。即图像压缩问题满足最优子结构性质。
3、递推关系
设s[i],1<=i<=n是像素序列{p1,p1,……pi}的最优分段所需的存储位数,则s[i]为前i-k个的存储位数加上后k个的存储空间。由最优子结构性质可得:
,式中
4、构造最优解
数组l[i],b[i]记录了最优分段所需的信息最优分段的最后一段的段长度和像素位数分别存储在l[n]和b[n]中,其前一段的段长度和像素位数存储于l[n-l[n]]和b[n-l[n]]中,依此类推,可在O(n)时间内构造最优解。
算法具体实现代码如下:
算法Compress只需O(n)空间。由于在算法Compress中j的循环次数不超过256,故对每一个确定的i可在O(1)时间内完成。因此整个算法的时间复杂度为O(n)。算法Compress的执行过程可以下图表示:
方法Output中,在输出s[n]的最小存储空间后,s[]数组被重新赋值,用来存储分段的位置,一边回溯构造最优解。程序运行结果如下:
- 动态规划之图像压缩算法
- 动态规划之--图像压缩
- 算法_动态规划_图像压缩
- 动态规划 --压缩算法
- 0016算法笔记——【动态规划】图像压缩问题
- 0016算法笔记——【动态规划】图像压缩问题
- 0016算法笔记——【动态规划】图像压缩问题
- 【动态规划】图像压缩问题
- 动态规划-图像压缩问题
- 动态规划-图像压缩问题
- 动态规划之基于接缝裁剪的图像压缩
- 图片压缩算法--动态规划
- 动态规划——图像压缩
- 动态规划之状态压缩
- 动态规划之状态压缩
- 动态规划专题:算法合集之《基于连通性状态压缩动态规划问题》
- 算法篇-4-动态规划-凸多边形最优三角剖分&图像压缩最优分段&电路布线
- 算法之动态规划
- poj2528 Mayor's posters 线段树+离散化(经典)
- 01 邂逅Opencv
- Android与MVC设计模式
- oj_10 蚯蚓
- 关于几个主流语音SDK的接入问题
- 动态规划之图像压缩算法
- nyoj-过河问题
- C++中动态存储分配的基础知识
- java 的JVM内存详解和内存溢出异常
- [LintCode]Dices Sum
- 【Sikuli】Sikuli安装过程
- OpenGL渲染流程
- 基于Slim微型框架实现强大的API—— Slim入门篇
- 【JZOJ 3749】【Srm590】Fox And City