当前位置: 首页 > news >正文

实验04:图像压缩(DP算法)

1.实验目的

掌握动态规划算法的基本思想以及用它解决问题的一般技巧。运用所熟悉的编程工具,运用动态规划的思想来求解图像压缩问题。

2.实验内容

给定一幅图像,求解最佳压缩,使得压缩后的文件最小。

3.实验要求

实现lena512.raw(称为原文件)图像压缩并保存到文件(称为压缩文件)中。编写相应的解码器,对保存的文件解压出图像,并将解压图像存储为raw文件,通过图像浏览工具验证解压文件和原文件相同。分析压缩率(即 压缩文件大小 除以 原文件大小),分析算法的时间复杂度和空间复杂度。

□ \square 基础性实验 □ \square 综合性实验 ⊠ \boxtimes 设计性实验


实验报告正文

一、问题分析(模型、算法设计和正确性证明等)

设灰度图像共 n n n个像素值,灰度图像可以视作一个一维向量 P = { p 1 , p 2 , . . . . . . , p n } P=\{p_1, p_2, ...... , p_n\} P={p1,p2,......,pn},将n个像素分割成m个连续段 { S i } i = 1 m \{S_i\}_{i=1}^m {Si}i=1m.

其中,对第 i i i S i S_i Si有下列相关变量:

符号表示含义
l [ i ] l[i] l[i]段长,该段内包含像素个数
b [ i ] b[i] b[i]该段中各像素位宽, b [ i ] = ⌈ log ⁡ ( 1 + max ⁡ p k ∈ S i p k ) ⌉ b[i]=\lceil {\log{(1+\max_{p_k \in S_i}{p_k}})} \rceil b[i]=log(1+maxpkSipk)

约定每段长度 l [ i ] l[i] l[i]满足:$1\leq l[i] \leq 256 且 且 b[i]\geq 1$.

已知: 0 ≤ p k ≤ 255 0\leq p_k \leq 255 0pk255,故 1 ≤ b [ i ] ≤ 8 1\leq b[i]\leq 8 1b[i]8

S i S_i Si编码压缩如下:
l [ i ] − 1 b [ i ] − 1 { p i + 1 , p i + 2 . . . . . . , p i + l [ i ] } 8 b i t s 3 b i t s l [ i ] × b [ i ] b i t s \begin{matrix} l[i]-1 & b[i]-1 & \{p_{i+1}, p_{i+2}......, p_{i+l[i]}\}\\ 8bits & 3bits & l[i]\times b[i]bits \end{matrix} l[i]18bitsb[i]13bits{pi+1,pi+2......,pi+l[i]}l[i]×b[i]bits
压缩完成后,共占用空间: l [ i ] × b [ i ] + 11 l[i]\times b[i] + 11 l[i]×b[i]+11

f ( { S i } 1 m ) f(\{S_i\}_1^m) f({Si}1m)表示压缩为 m m m个连续子段集合 { S i } 1 m \{S_i\}_1^m {Si}1m占用空间,则递归表达如下:
f ( { S i } 1 m ) = f ( { S i } 1 m − 1 ) + 11 (1) f(\{S_i\}_1^m)=f(\{S_i\}_1^{m-1})+11\tag1 f({Si}1m)=f({Si}1m1)+11(1)
最优子结构性质

设最优分段为 { S i } i = 1 m \{S_i\}_{i=1}^m {Si}i=1m,其中第 m m m个分段 S m S_m Sm的长度为 l e n len len,则 { S i } i = 1 m − 1 \{S_i\}_{i=1}^{m-1} {Si}i=1m1是子问题 { p 1 , p 2 , . . . . . . , p n − l e n } \{p_1, p_2, ......, p_{n-len}\} {p1,p2,......,pnlen}的最优分段,递归表达如下:
f ( { S i } i = 1 m ) = f ( { S i } i = 1 m − 1 ) + f ( { S m } ) (2) f(\{S_i\}_{i=1}^m)=f(\{S_i\}_{i=1}^{m-1})+f(\{S_m\})\tag2 f({Si}i=1m)=f({Si}i=1m1)+f({Sm})(2)

简要证明过程如下:

假设 { S i } i = 1 m \{S_i\}_{i=1}^m {Si}i=1m为原问题最优分段,即 f ( { S i } i = 1 m ) f(\{S_i\}_{i=1}^m) f({Si}i=1m)值最小,但 { S i } i = 1 m − 1 \{S_i\}_{i=1}^{m-1} {Si}i=1m1不是子问题的最优解。

则将其分段策略调整为最优解后, f ( { S i } i = 1 m − 1 ) f(\{S_i\}_{i=1}^{m-1}) f({Si}i=1m1)值减少, f ( { S i } i = 1 m ) = f ( { S i } i = 1 m − 1 ) + f ( { S m } ) f(\{S_i\}_{i=1}^m)=f(\{S_i\}_{i=1}^{m-1})+f(\{S_m\}) f({Si}i=1m)=f({Si}i=1m1)+f({Sm})值减少,与假设矛盾。

令g(n)表示像素序列{p_1, p_2, …, p_n}的最优分段占用空间,则有递归公式如下:
g ( n ) = min ⁡ ( g ( n − k ) + k × b m a x + 11 ) , 1 ≤ k ≤ min ⁡ ( n , 256 ) (3) g(n)=\min(g(n-k)+k\times b_{max}+11), 1\leq k \leq \min{(n, 256)}\tag3 g(n)=min(g(nk)+k×bmax+11),1kmin(n,256)(3)

二、算法设计复杂度分析(伪代码,不要粘贴源码)

时间复杂度:
T ( n ) ∈ θ ( ∑ i = 1 n min ⁡ ( i , L m a x ) ) = θ ( L m a x × n ) = θ ( n ) T(n) \in \theta(\sum_{i=1}^{n}{\min{(i, Lmax)}})=\theta(Lmax\times n)=\theta(n) T(n)θ(i=1nmin(i,Lmax))=θ(Lmax×n)=θ(n)
空间复杂度:

该算法需要辅助空间储存段长、位宽及前 i i i个像素最优压缩占用空间大小, S ( n ) ∈ θ ( n ) S(n)\in \theta(n) S(n)θ(n).

三、实验结果记录和分析(测试向量上的测试结果、运行时间)

实验结果:

原图像大小压缩后大小
262114字节257550字节

压缩率: ( 1 − 257550 262114 ) × 100 % ≈ 1.75 % (1-\frac{257550}{262114} )\times 100\% \approx 1.75\% (1262114257550)×100%1.75%,详见RESULT文件夹

算法运行时间:267.847
在这里插入图片描述

在这里插入图片描述

结果验证:

在这里插入图片描述

文件大小一致,下使用c++库OpenCV将Decode_lena.raw转存为jpg格式文件,详见RESULT文件夹。

在这里插入图片描述

与原图像一致,详见RESULT文件夹。

四、总结(可描述出现的问题和解决方法、经验和反思等)

本实验中采用bin文件格式保存中间编码(压缩)文件以直观显示压缩完成后文件大小,本实验所有代码保存于CODE文件夹,所有结果保存于RESULT文件夹以便老师查阅。

本实验的压缩方式相对单一,压缩率较低,有较大提升空间,具体算法有:

  1. 将像素值均大于 2 7 = 128 2^7=128 27=128的分段进行取反操作,保存像素值与 256 256 256之差,段长最大值减一,需多加一位符号位表示是否取反,对于像素值较大的图像压缩率较大。
  2. 对于一段像素值用高斯分布等概率模型拟合,保存参数后解压时用概率分布函数生成像素值。

相关文章:

实验04:图像压缩(DP算法)

1.实验目的: 掌握动态规划算法的基本思想以及用它解决问题的一般技巧。运用所熟悉的编程工具,运用动态规划的思想来求解图像压缩问题。 2.实验内容: 给定一幅图像,求解最佳压缩,使得压缩后的文件最小。 3.实验要求…...

4.19--面试系列之真题版本--redis出现大key怎么解决?Redis 大 Key 对持久化有什么影响?

对于redis出现大key的情况,可以通过以下几种方式来解决: 1.分布式存储:将大key拆分成多个小的key,分别存储在不同的节点上。 2.数据过期:对于大key中不经常使用的数据,可以使用redis自带的过期特性&#xf…...

新手在家做自媒体要如何起步?

不少人都想做自媒体来增加自己的收入或者创业,但没有人带领,自己像是无头苍蝇一样,不知道往哪里走。 今天这期内容大周就来给粉丝们分享一点干货,如果对你有所帮助,记得点赞支持一下大周。 1、注册账号 如果你连一个…...

易基因:禾本科植物群落的病毒组丰度/组成与人为管理/植物多样性变化的相关性 | 宏病毒组

大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。 现代农业通过简化生态系统、引入新宿主物种和减少作物遗传多样性来影响植物病毒的出现。因此,更好理解农业生态中种植和未种植群落中的病毒分布,以及它们之间的病…...

华为OD机试——对称美学(通过率只有8.51%???)

用java写的这道题,两个样例都可以通过,但是提交之后最终的通过率只有8.51%???自己搞了半天一直都是这个通过率,然后用网上说的100%通过率的代码也是一样的结果,最后时间到了还是没有拿到满分&am…...

【三十天精通Vue 3】第十六天 Vue 3 的虚拟 DOM 原理详解

引言 Vue 3 的虚拟 DOM 是一种用于优化 Vue 应用程序性能的技术。它通过将组件实例转换为虚拟 DOM,并在组件更新时递归地更新虚拟 DOM,以达到高效的渲染性能。在 Vue 3 中,虚拟 DOM 树由 VNode 组成,VNode 是虚拟 DOM 的基本单元…...

Arduino ESP8266通过udp获取时间以及同步本地时间方法

Arduino ESP8266通过udp获取时间以及同步本地时间 ✨通过udp获取NTP服务器上的时间戳,然后经过转换,得到当前具体的时间。转换相对复杂,对于获取时间还是相对比较准确。📝通过udp获取时间实现代码 #include <ESP8266WiFi.h> #include <WiFiUdp.h>//填写 WiFi…...

c/c++:char*定义常量字符串,strcmp()函数,strcpy()函数,寻找指定字符,字符串去空格

c/c&#xff1a;char*定义常量字符串&#xff0c;strcmp()函数&#xff0c;strcpy()函数&#xff0c;寻找指定字符&#xff0c;字符串去空格 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;此时学会c的话&#xff0c; 我所…...

2023年6月DAMA-CDGA/CDGP数据治理认证考试可报名地区公布

2023年4月23日&#xff0c;据DAMA中国官方信息&#xff0c;目前6月DAMA-CDGA/CDGP数据治理认证考试开放报名地区有&#xff1a;北京、上海、广州、深圳、长沙、呼和浩特。目前南京、济南、西安、杭州等地区还在接近开考人数中&#xff0c;打算6月考试的朋友们可以抓紧时间报名啦…...

UDS的0x19服务介绍

什么是 UDS&#xff1f; UEI (Unified Diagnostic Services&#xff0c;统一诊断服务) 是一种在车辆电子控制单元 (ECU) 之间交换诊断信息的标准通信协议&#xff0c;它是OBD-II的某些扩展。利用 UDS 协议&#xff0c;诊断工程师可以访问车辆的各种功能&#xff0c;如读取故障…...

QinQ技术与Portal技术

QinQ 802.1Q-in-802.1Q&#xff0c;是一种扩展VLAN标签技术。在城域网中&#xff0c;需要大量的VLAN来隔离区分不同的用户&#xff0c;但是原有的802.1Q只有12个比特&#xff0c;仅能标识4096个VLANQinQ即在802.1Q的基础上&#xff0c;再增加一层外层标签。使得可以标识4096*40…...

Vue-自定义表单验证(rule,value,callback)详细使用

前言 最近在实际开发中遇到需要验证合同编号是否在数据库已经存在&#xff0c;自定义表单验证。 的表单验证大家都知道form绑定rules&#xff0c;prop绑定值与form.值一样&#xff0c;必填&#xff0c;失去焦点触发 提示信息。 今天我们讲一讲自定义验证规则具体使用场景和它…...

港联证券|TMT板块全线退潮,这些个股获主力逆市抢筹

计算机、电子、传媒、通讯职业流出规模居前。 今天沪深两市主力资金净流出709.92亿元&#xff0c;其中创业板净流出218.36亿元&#xff0c;沪深300成份股净流出187.92亿元。 资金流向上&#xff0c;今天申万一级职业普跌&#xff0c;除了国防军工职业小幅上涨&#xff0c;获主…...

WPF学习

一、了解WPF的框架结构 &#xff08;第一小节随便看下就可以&#xff0c;简单练习就行&#xff09; 1、新建WPF项目 xmlns&#xff1a;XML的命名空间 Margin外边距&#xff1a;左上右下 HorizontalAlignment&#xff1a;水平位置 VerticalAlignment&#xff1a;垂直位置 2…...

C#使用WebDriver模拟浏览器操作WEB页面

有时候需要模拟访问页面触发某个功能&#xff0c;可以使用WebDriver来实现这一功能&#xff0c;驱动打开浏览器&#xff0c;并对页面重定向以及对页面写入脚本等操作。 安装Selenium.Chrome&#xff0c;Selenium.Support.UI&#xff0c;Selenium 引入 using OpenQA.Selenium.…...

正则表达式 - 简单模式匹配

目录 一、测试数据 二、简单模式匹配 1. 匹配字面值 2. 匹配数字和非数字字符 3. 匹配单词与非单词字符 4. 匹配空白字符 5. 匹配任意字符 6. 匹配单词边界 7. 匹配零个或多个字符 8. 单行模式与多行模式 一、测试数据 这里所用文本是《学习正则表达式》这本书带的&a…...

银行数字化转型导师坚鹏:银行数字化转型培训方案

目录 一、银行数字化转型培训背景 二、银行数字化转型模型 三、银行数字化转型课程设计思路 四、 银行数字化转型课程基本介绍 五、 银行数字化转型课程设置 六、银行数字化转型课程大纲 七、培训方案实施流程 一、银行数字化转型培训背景 2020年1月3日&#xff…...

多维时序 | MATLAB实现BO-CNN-LSTM贝叶斯优化卷积神经网络-长短期记忆网络多变量时间序列预测

多维时序 | MATLAB实现BO-CNN-LSTM贝叶斯优化卷积神经网络-长短期记忆网络多变量时间序列预测 目录 多维时序 | MATLAB实现BO-CNN-LSTM贝叶斯优化卷积神经网络-长短期记忆网络多变量时间序列预测效果一览基本介绍模型搭建程序设计参考资料 效果一览 基本介绍 MATLAB实现BO-CNN-…...

Shell知识点(一)

1.echo 命令 echo命令的作用是在屏幕输入一行文本&#xff0c;可以降该命令的参数原样输出。 $ echo hello world hello world 如果想要输出的是多行文本&#xff0c;包含换行符&#xff0c;这时就需要把多行文本放在引号里面 $ echo "<HTML><HEAD><TITLE…...

mysql 索引失效、联合索引失效场景和举例

索引失效 假设有一张user 表&#xff0c;表中包含索引 (id); (name); (birthday); (name,age); 对索引字段进行函数操作 select name from user where year(birthday) 2000;使用模糊查询&#xff0c;查询中使用通配符 select name from user where name like %益达%;使用i…...

终极指南:三阶加速法让BT下载速度提升300%的完整方案

终极指南&#xff1a;三阶加速法让BT下载速度提升300%的完整方案 【免费下载链接】trackerslist Updated list of public BitTorrent trackers 项目地址: https://gitcode.com/GitHub_Trending/tr/trackerslist 你是否曾面对BT下载时缓慢如蜗牛、连接时断时续的困境&…...

SQLite Viewer:3分钟学会在线查看SQLite数据库的终极方案

SQLite Viewer&#xff1a;3分钟学会在线查看SQLite数据库的终极方案 【免费下载链接】sqlite-viewer View SQLite file online 项目地址: https://gitcode.com/gh_mirrors/sq/sqlite-viewer 想象一下&#xff0c;你收到一个SQLite数据库文件&#xff0c;需要立即查看其…...

NHSE终极指南:掌握动物森友会存档编辑的5大核心技术

NHSE终极指南&#xff1a;掌握动物森友会存档编辑的5大核心技术 【免费下载链接】NHSE Animal Crossing: New Horizons save editor 项目地址: https://gitcode.com/gh_mirrors/nh/NHSE NHSE&#xff08;New Horizons Save Editor&#xff09;作为《集合啦&#xff01;动…...

UE5 BaseHardware.ini硬件兼容性判决机制深度解析

1. 这不是配置文件&#xff0c;而是UE5硬件适配的“宪法性文档”很多人第一次在Unreal Engine 5项目里翻到BaseHardware.ini&#xff0c;下意识就把它当成普通ini配置——改几个数值、调个开关、重启编辑器完事。我刚接手一个跨平台渲染优化项目时也这么干过&#xff1a;把bUse…...

STM32 SysTick配置详解:从原理到实践,打造精准系统时基

1. 项目概述&#xff1a;为什么SysTick配置是STM32开发的“心跳”起点在STM32的嵌入式开发世界里&#xff0c;SysTick定时器就像整个系统的心脏&#xff0c;它规律地跳动&#xff0c;为操作系统、延时函数、任务调度提供着最基础的时间基准。很多新手拿到开发板&#xff0c;跑完…...

python 内存管理 内存泄漏及排查方案 内存友好的python代码

Python 内存管理 一、一句话总结 Python 的内存管理就是三件事&#xff1a; 自动分配内存&#xff08;你不用管变量存在哪&#xff09;自动回收垃圾&#xff08;不用的对象自动删掉&#xff09;靠引用计数 分代垃圾回收实现二、核心机制 1&#xff1a;引用计数&#xff08;最基…...

Rust技术周刊 2026年第16周

阅读原文: https://mp.weixin.qq.com/s/9en-gxsNB544aG6hgkwJVQ 本周 Rust 生态亮点&#xff1a;GPU 计算突破&#xff08;KAIO 达 cuBLAS 92.5%、flodl 多 GPU 训练&#xff09;&#xff0c;Tokio 异步优化实战频出&#xff0c;扩展标准库路线图发布&#xff0c;Rust 进入 Pix…...

从MySQL分区到OceanBase分区:迁移老手教你平滑过渡与性能调优

从MySQL分区到OceanBase分区&#xff1a;迁移老手教你平滑过渡与性能调优 当MySQL分区表遇上OceanBase分布式架构&#xff0c;传统设计思维往往成为性能瓶颈的源头。本文将揭示两种数据库分区机制的本质差异&#xff0c;并提供一套经过生产验证的迁移方法论&#xff0c;帮助您避…...

S7-1200通讯选型指南:RS485、Profinet还是开放式TCP?看完这篇不再纠结

S7-1200通讯选型指南&#xff1a;RS485、Profinet还是开放式TCP&#xff1f;看完这篇不再纠结 在工业自动化项目中&#xff0c;PLC通讯方案的选择往往让工程师们陷入两难——既要考虑当下设备的兼容性&#xff0c;又要为未来升级预留空间。作为西门子S7-1200系列PLC的用户&…...

KaTrain围棋AI:如何用数据可视化与智能分析重塑围棋学习体验

KaTrain围棋AI&#xff1a;如何用数据可视化与智能分析重塑围棋学习体验 【免费下载链接】katrain Improve your Baduk skills by training with KataGo! 项目地址: https://gitcode.com/gh_mirrors/ka/katrain 围棋作为一项拥有数千年历史的智力运动&#xff0c;其学习…...