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

现在图像压缩问题是这样的:有一些像素序列{p1,p2,……,pn},当然每个像素值都是0到255之间的。要求对这样的像素序列进行分段,使得最后所需要的存储空间最小。比如有些连续的像素点用4位进行存储就可以,那么就可以将这些像素点分在一段中,就没有必要把这些像素点用8位来存储,这样不就节省了一些存储空间嘛。

可以将问题详细描述分析如下:如果最优的结果是将像素序列分成m段(0<=m<=n),假设每段有l[i]个像素点,我们限定0<=l[i]<=255,那么l[1]+l[2]+……+l[m]=n。所有段的像素点的数量加起来就等于总的像素数。第i段存储l[i]这个值需要8位(log(255)向上取整),每段每个像素的存储位数肯定是一样的(否则这些像素不可能分配在同一段中),用b[i]来表示,每段的存储位数一定是小于等于8的整数,因为灰度值的范围是[0,255],那么存储b[i]这个值呢?可想而知,一定是最多需要3位(log(8)向上取整)。

也就是每段不管有多少个像素点,最起码得存储l[i]和b[i]这两个值,也就是说每段最少需要8+3=11位。当然,每段中有l[i]个像素点,每个像素点的灰度值用b[i]位存储,所以需要l[i]*b[i]位存储每段的像素点的灰度值,再加上上面分析的11位,每段总共需要的存储空间就是l[i]*b[i]+11。对于m段呢?需要位的存储空间。

这是一个动态规划问题,满足最优子结构性质,也就是如果l[i],b[i](1<=i<=m)是{p1,p2,……,pn}的一个最优分段。显然,l[1],b[1]是{p1,p2,……,pl[1]}的一个最优分段,且l[i],b[i](2<=i<=m)是{pl[1]+1(l[1]+1是p的下标),...,pn}的一个最优分段。

设s[i]表示前i个像素点{p1,p2,...,pi}所需要的总的存储位数。由最优子结构的性质可以知道,后面的s[i+1]等是依赖于s[i]的。也可以得到这样的递推公式:

s[i]={s[i-k]+k*bmax(i-k+1,i)}+11,其中1<=k<=min{i,256},

bmax(i,j)就是pi和pj之间的最大像素值所需的存储位数。

程序代码可以见Compress.cpp

​​

若像素序列是{10,12,15,255,1,2},则执行结果如下:​

分析算法的空间复杂度和时间复杂度:Compress算法只需O(n)空间。由于compress()函数中j的循环次数不超过Lmax=256次,所以对于每一个i,都可以在O(1)的时间内找到最小的s[i],因此整个算法所需的计算时间为O(n)。

手动计算 {10,12,15,255,1,2}的最优存储位数:

i=1: 10是一个分段  需11+4=15位

后面需11+5*8=51位

总共需要15+51=66位

i=2:{10,12}作为一段,需要11+2*4=19位

{15,255,1,2}需要11+4*8=43位

总共需要19+43=62位

i=3:  ......

最优分段如下:{10,12,15},{255},{1,2}

(11+3*4)+(11+1*8)+(11+2*2)=57位。

图像压缩算法动态规划c语言,图像压缩算法  动态规划相关推荐

  1. 0-1背包问题 动态规划c语言,详解动态规划01背包问题--JavaScript实现

    一开始在接触动态规划的时候,可能会云里雾里,似乎能理解思路,但是又无法准确地表述或者把代码写出来.本篇将一步一步通过作图的方式帮助初次接触动态规划的同学来理解问题.这一篇将以经典的 01背包 问题为例 ...

  2. 图像篡改检测C语言,图像篡改检测和定位(二)

    在之前的文章中( 图像篡改检测和定位(一) ),我们谈到图像篡改检测的几种方法,在这里我们主要讨论整个体系的框架里面不同的算法各自的优势,以及存在的问题. 我们可以根据经验大致把图像篡改检测一般性方法 ...

  3. 图像旋转源程序c语言,图像旋转 - 红尘潇洒,独自前行,但尽人事,莫问前程 - OSCHINA - 中文开源技术交流社区...

    效果 Matlab代码 clc clear all close all I=imread('lena.jpg'); [W,H,chanel]=size(I); dst_data=zeros([W,H, ...

  4. c语言图像压缩编码,基于C语言的图像压缩算法

    摘要:该文借鉴静态图像压缩标准JPEG的理论研究成果,将其与DCT快速变换相结合,采用霍夫曼编码方法,用C语言编程实现灰度图像的压缩.最后,计算了基于DCT快速变换的图像压缩算法的压缩比.同时,分析了 ...

  5. R语言使用magick包的image_animate函数和image_morph函数创建一个由n个图像组成的序列,逐渐将一个图像转换成另一个图像(sequence of image morph by)

    R语言使用magick包的image_animate函数和image_morph函数创建一个由n个图像组成的序列,逐渐将一个图像转换成另一个图像(Creates a sequence of n ima ...

  6. c语言 二进制压缩算法_使用C ++解释的二进制搜索算法

    c语言 二进制压缩算法 by Pablo E. Cortez 由Pablo E.Cortez 使用C ++解释的二进制搜索算法 (Binary Search Algorithms Explained ...

  7. python动态规划算法最大k乘积_C语言使用DP动态规划思想解最大K乘积与乘积最大问题...

    最大K乘积问题设I是一个n位十进制整数.如果将I划分为k段,则可得到k个整数.这k个整数的乘积称为I的一个k乘积.试设计一个算法,对于给定的I和k,求出I的最大k乘积. 编程任务: 对于给定的I 和k ...

  8. html标记语言图像标记_为什么我喜欢这些标记语言

    html标记语言图像标记 去年大约这个时候,我为本专栏文章简要介绍了各种标记语言 . 语言选择的话题最近出现了好几次,所以我认为现在该是时候以我的偏见来重新讨论这个话题了. 我在这里解释为什么我更喜欢 ...

  9. 基于c语言图像灰度拉伸算法实现,c语言实现图像灰度均衡化

    通过对灰度直方图进行修正的理论.建模.算法和程序的论述说明如何实现图象的灰度直方图均衡化,达到图象增强的目的. 廛围抖蕉 c语 言实现图像灰度均衡化 郭韶斌 (北京交通大学,北京市 100044) ' ...

最新文章

  1. JavaScript内存泄漏
  2. opencv学习笔记(二):基于肤色的人手检测
  3. python pip-python之pip的使用
  4. Mybatis学习记录(二)----mybatis开发dao的方法
  5. IIS6.0官方技术必读
  6. Oracle集合查询
  7. MATLAB FOR PROE
  8. 中电海康建车联网透明路 探索新型智慧城市商机
  9. Linux学习笔记--终端命令
  10. cordova-plugin-alipay-v2使用篇(更新至20170725)(亲测可用)
  11. 去携程面试,问HR待遇如何,HR说我太看重钱,不录取我
  12. 『MongoDB』MongoDB的数据存储格式Bson比Json有哪些优势?
  13. 短信验证码被盗刷了怎么办?
  14. 初试401 英语86分上岸苏州大学经验分享
  15. CHAPTER 2 目录及文件
  16. PHP开发环境的搭建
  17. 根据树状数据渲染树状下拉选项
  18. 利用autossh反向代理实现内网穿透
  19. 使用PS快速抠图:(磁锁套抠图,快速工具,)
  20. 如何面试Java中级开发(16k)试题讲解和Java学习

热门文章

  1. 集结阿里云数据库最强阵容 DTCC 2019 八大亮点抢先看
  2. 如何使用 Druid 和 Kafka 构造 Kappa 架构完成流量分析
  3. Excel常用英文字母快捷键:
  4. #JS:this的指向及函数调用对this的影响
  5. angularjs学习第八天笔记(指令作用域研究)
  6. 七 递归与二分法、匿名函数、内置函数
  7. graylog - collecting Failed and Accepted logins for your SSH
  8. qml demo分析(threading-线程任务)
  9. Power Designer使用技巧
  10. 菜鸟必读 Linux系统的字型设定方法