动态规划---图像压缩

  • 问题描述
  • 分析
  • 代码如下
  • 运行结果如下
    • 结果一
    • 结果二

在算法课上遇到这个图像压缩这个问题,可以用 动态规划来求解,之前没有遇到过这个问题,在网上查找相关的题解也比较少,就写一下自己的理解。

问题描述

 一幅图像的由很多个像素点构成,像素点越多分辨率越高,像素的灰度值范围为0~255,
也就是需要8bit来存储一个像素的灰度值信息。一幅由n*m像素点构成的图像,所需存储空间大小为:n*m*8bit=8nmbit(这是非常大的,直接传输很慢)然而,正常情况下,一幅图像的某一范围内像素点的灰度值是很接近的,表现为一幅图片某一区域颜色相近。例如,一个像素灰度值序列P={1,2,2,2,1,2,60,55,78}(传输过程中把图像像素点转成序列,
而不是直接传输矩阵),每个像素灰度值都用8bit来存储是非常消耗空间的,例如:
直接存储: 9*8bit=72bit,这是非常不划算的,我们想要无损压缩图片。即:将像素序列分段,段内的像素灰度值相似(可以用小于8bit的空间来存储一个像素灰度值),
一段内的像素用相同的bit数来存储,只需要额外存树每段的长度和bit数即可,这样可以节省很多空间。

b[i]:第i段中每个像素的位数,1<=b[i]<=8,需要3 bit
l[i];第i段中像素的个数,1<=l[i]<=255,需要8 bit
所以每一段需要额外的 3+8=11 bit来存储段内像素的信息

分析

如何分段?
若分为 m 段,则需要的存储总位数为 : ∑ i = 1 m b [ i ] ∗ l [ i ] + m ∗ 11 若分为m段,则需要的存储总位数为: \sum_{i=1}^{m}b[i]*l[i]+m*11 若分为m段,则需要的存储总位数为:i=1∑m​b[i]∗l[i]+m∗11
考虑用动态对规划来求解问题:
最优子结构 : p 1 , p 2 , p 3 , . . . . p m 考虑最后一个分段为 l [ m ] 个元素 p n − l [ m ] + 1 ∼ p [ n ] , 则子问题为 p 1 ∼ p [ l [ m ] ] 的分段 ( 前 m − 1 段 ) 子问题的最优解为 b [ i ] , l [ i ] , 1 < = i < = m − 1 最后一个分段最优和前 m − 1 个分段最优构成了原问题分段最优,最优子结构存在 在求解第 i 段过程中需要前 i − 1 段分法的信息,存在重复子问题可以用动态规划的思想来求解问题 最优子结构:\\ {p1,p2,p3,....pm}\\ 考虑最后一个分段为l[m]个元素\\ p_{n-l[m]+1}\sim p[n],\\ 则子问题为p_1\sim p[l[m]]的分段(前m-1段)\\ 子问题的最优解为b[i],l[i],1<=i<=m-1\\ 最后一个分段最优和前m-1个分段最优构成了原问题分段最优,最优子结构存在\\ 在求解第i段过程中需要前i-1段分法的信息,存在重复子问题 可以用动态规划的思想来求解问题 最优子结构:p1,p2,p3,....pm考虑最后一个分段为l[m]个元素pn−l[m]+1​∼p[n],则子问题为p1​∼p[l[m]]的分段(前m−1段)子问题的最优解为b[i],l[i],1<=i<=m−1最后一个分段最优和前m−1个分段最优构成了原问题分段最优,最优子结构存在在求解第i段过程中需要前i−1段分法的信息,存在重复子问题可以用动态规划的思想来求解问题

状态表示:
f[i]表示以A[i](包含)结尾的最优分段所需的bit数(最少)状态转移:
f[i] =A[i-k]+bitmax(i-k+1,i)+11 , 0<=k<=i
bitmax(i-k+1,i)为求i-k+1到i这个序列每个像素灰度值需要的的bit数
其中,k<=256(图像压缩的限制)
f[i] =A[i-k]+bitmax(i-k+1,i)+11 , 0<=k<=min(i,256)

时间复杂度分析:
遍历序列n,
遍历(i-k+1,i)
求bitmax(i-k+1,i)
时间复杂度看起来是O(n^3)
但是k<=256,所以时间复杂度为O(n) (n前常数会比较大)

代码如下

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int N=1e5+10;
const int inf=0x3f3f3f3f;int f[N];
int A[N];
int l[N],b[N];
int maxbit(int x){//求某个数存储需要的bit位数if(x==0) return 1;int res=0;while(x){x/=2;res++;}return res;
}
int get_maxbit(int l,int r){//求某一区间(区间最大值)需要的bit位数int res=0;for(int i=l;i<=r;i++) res=max(res,A[i]);return maxbit(res);
}int main(){int n;cin>>n;for(int i=1;i<=n;i++) scanf("%d",&A[i]);for(int i=1;i<=n;i++){f[i]=f[i-1]+maxbit(A[i])+11;//假设A[i]单独构成一段,作为初始情况b[i]=maxbit(A[i]);l[i]=1;for(int j=2;j<=min(i,256);j++){//从i-1到j+1遍历取min(f[i])int bit_j=get_maxbit(i-j+1,i);int t=f[i-j]+bit_j*j+11;if(f[i]>t){f[i]=t;b[i]=bit_j;//记录该段需要的bit位l[i]=j;//记录该段的长度}}}int t=n;vector<int>v;while(t){v.push_back(l[t]);//将长度信息用vector存储t=t-l[t];}reverse(v.begin(),v.end());//倒置printf("最少需要:%dbit\n",f[n]);for(int i=0,t=1;i<v.size();i++){//输出分段信息for(int j=0;j<v[i];j++)printf("%d ",A[t++]);printf("长%d,每个像素需要%dbit\n",l[t-1],b[t-1]);}return 0;
}
/*
12
10 12 15 255 1 2 1 1 2 2 1 1
#69
/*
/*
6
10 12 15 255 1 2
#57
*/

运行结果如下

结果一

结果二


感觉这道题讲的重心错了,应该重点讲解动态规划的,比较少见的动态规划题

动态规划---图像压缩相关推荐

  1. 动态规划--图像压缩

    <算法设计与分析> --王晓东 题目描述和解析参照:http://blog.csdn.net/liufeng_king/article/details/8648195  他在那里分析得非常 ...

  2. 动态规划经典题目-数据压缩之图像压缩

    文章目录 一.题目描述 二.解题思路 1. 定义状态 2. 定义状态转移方程 3. 初始化 4. 计算方式 三.代码实现 四.执行结果 五.思考 一.题目描述 ​ 计算机中的图像由一系列像点构成,每个 ...

  3. 图像压缩 动态规划C语言实现

    问题描述   图像的变位压缩存储格式将所给的像素点序列{p1,p2,-,pn},0≤pi≤255分割成m个连续段S1,S2,-,Sm.第i个像素段Si中(1≤i≤m),有l[i]个像素,且该段中每个像 ...

  4. 动态规划之图像压缩问题

    问题描述: 在计算机中,常用像素点的灰度值序列{p1,p1,--pn}表示图像.其中整数pi,1<=i<=n,表示像素点i的灰度值.通常灰度值的范围是0~255.因此最多需要8位表示一个像 ...

  5. 【动态规划】图像压缩问题

    目录 问题描述 递归策略 算法设计 解题步骤 例题 问题描述 数字化图像是n×n的像素阵列,假定每个像素有一个0-255的灰度值,即存储一个像素需8位.为了减少存储空间,采用变长模式,即不同的像素用不 ...

  6. 图像压缩算法动态规划c语言,图像压缩算法  动态规划

    图片在计算机存储的是图片中的一个一个像素,也就是像素的灰度值.灰度值的范围是0~255.有灰白图像和彩色图像,它们每个像素的通道数量不同.灰白图像是单通道的,而彩色图像是3个通道的(BGR),也就是彩 ...

  7. CVPR 2019 CLIC 图像压缩挑战赛冠军方案解读

    点击我爱计算机视觉标星,更快获取CVML新技术 导读:图像视频压缩是传统多媒体技术的核心,也是一项牵动整个多媒体信息产业的基础技术.深度学习在该领域的成功运用,已经引起了不少IT巨头的关注.图鸭科技是 ...

  8. 动态规划(DP)算法介绍

    动态规划 一,动态规划三要素:阶段,状态,决策. 如果把动态规划的求解过程看成一个工厂的生产线,阶段就是生产某个商品的不同的环节,状态就是工件当前的形态,决策就是对工件的操作.显然不同阶段是对产品的一 ...

  9. 【笔记】《算法设计与分析(第三版)》-王晓东著-第3章-动态规划

    第3章 动态规划 动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解. 与分治法不同的是,适合于用动态规划法求解的问题,经分解得到 ...

最新文章

  1. opencv 运动目标检测
  2. dataframe第二列 r语言_R语言-数据框
  3. solr7.4 centos7安装
  4. centos mysql 设置_CentOS下MySQL安装后配置和设置-阿里云开发者社区
  5. ftp文件服务器杀毒,FTP远程查杀网页木马方法
  6. zigbee无线通信数码管实验、usbDongle抓包、发字符串
  7. mysql 使用select建表_mysql create创建表、insert into插入数据、select查询数据实例
  8. (4)vue.js 基础语法
  9. ImageIO 合并图片工具
  10. php数组排序不要用函数,PHP数组排序函数使用方法
  11. mysql数据库恢复
  12. 命令登陆mysql数据库_命令操作Mysql数据库
  13. Node.js连接数据库
  14. 第 11 章 Harddisk
  15. 华硕主板如何用u盘启动计算机,最新华硕主板bios设置u盘启动教程
  16. CentOS7+VMware 14的安装教程
  17. FFMPEG,vlc介绍和视频直播,obs(zz)
  18. Spliterator
  19. ERP-企业资源计划
  20. 【nginx 扩容及常用模块扩展】

热门文章

  1. IPguard外发查看器的设置步骤
  2. etf跟普通基金有什么不同?etf和普通基金的区别
  3. 利用画布canvas,实现图片编辑马赛克效果。canvas.putImageData()实现不一样的马赛克
  4. 北京视觉ui设计培训内容介绍
  5. Java实现opendir的api_linux文件操作API
  6. Word2010不能打中文,只出英文?切换输入法也没有用问题
  7. 尔宾团队角色(Belbin Team Roles),亦被称为贝尔宾团队角色表(Belbin Team Inventory)...
  8. Cocos Creator TypeScript 实现自定义数字图片组件NumberSpriteComponent
  9. 小苏的Shell编程笔记之四--条件测试
  10. 使用CSS3+JQuery打造自定义视频播放器