计算机算法分析与设计(8)---图像压缩动态规划算法(含C++代码)

news2024/11/16 21:50:19

文章目录

  • 一、知识概述
    • 1.1 问题描述
    • 1.2 算法思想
    • 1.3 算法设计
    • 1.4 例题分析
  • 二、代码


一、知识概述

1.1 问题描述

 1. 一幅图像的由很多个像素点构成,像素点越多分辨率越高,像素的灰度值范围为0~255,也就是需要8bit来存储一个像素的灰度值信息。

注意:在灰度图像中,全0表示黑色,全1表示白色。

 2. 一幅由n×m像素点构成的图像,所需存储空间大小为:n×m×8bit=8nmbit(这是非常大的,直接传输很慢)。这个时候大家应该有了一些小的疑问:我能不能用更少的位数来表示灰度值?(因为有的灰度值并没有达到255这么大)所以我们引入了图像压缩算法来解决这个问题。

1.2 算法思想

 1. 图像压缩:将像素序列分段,段内的像素灰度值相似(可以用小于8bit的空间来存储一个像素灰度值),一段内的像素用相同的bit数来存储,只需要额外存储每段的长度和bit数即可,这样可以节省很多空间。

 2. 但是分组会带来一个新的问题:我如何表示当前组中像素的个数和像素的位数呢?
 这里我们引入两个固定位数的值来表示:①我们用3位数字来表示当前组的每一位像素的的bit位数。②我们引入8位数字来表示当前组中像素点的个数。
 因为我们在这里规定了一组中最多存储0~255个( 2 8 2^8 28)数字,而一个灰度值最多有8位( 2 3 2^3 23),所以我们可以用即3位数字来表示当前组的像素位数(注意这里都是二进制)。

1.3 算法设计

 1. {6, 5, 7, 5, 245, 180, 28, 28, 19, 22, 25, 20}这是一组灰度值序列。我们按照默认的存储方法来看,一共12个数字,所以12×8=96位来表示。

 2. 而下面我们将其进行分组:第一组4个数,最大是7所以用3位表示;第二组2个数,最大是245所以用8位表示;第三组6个数,最大是28所以用5位表示。这个时候,我们最后得到了最后的位数结果为:4×3+2×8+6×5+11×3=91。

在这里插入图片描述
 3. 压缩过程中的数组存储:

  • s [ i ] s[i] s[i]来记录前 i 个数字的最优处理方式得到的最优解。
  • l [ i ] l[i] l[i]中来记录当前第 i 个数所在组中有多少个数。
  • b [ i ] b[i] b[i]中存放前 i 个像素点最后一段位数的最大值。

 4. 递推关系式:

在这里插入图片描述
在这里插入图片描述

1.4 例题分析

在这里插入图片描述

二、代码

#include <iostream>   
using namespace std;   
  
const int N = 7;  
  
int length(int i);  
void Compress(int n,int p[],int s[],int l[],int b[]);  
void Tracebace(int n,int& i,int s[],int l[]);  
void Output(int s[],int l[],int b[],int n);  
  
int main()  
{  
    int p[] = {0,10,12,15,255,1,2};//图像灰度数组 下标从1开始计数  
    int s[N],l[N],b[N];  
  
    cout<<"图像的灰度序列为:"<<endl;  
  
    for(int i=1;i<N;i++) //输出原灰度序列 
    {  
        cout<<p[i]<<" ";  
    }  
    cout<<endl;  
  
    Compress(N-1,p,s,l,b);  
    Output(s,l,b,N-1);  
    return 0;  
}  
  
void Compress(int n,int p[],int s[],int l[],int b[])  
{  
    int Lmax = 256,header = 11;  
    s[0] = 0;  
    for(int i=1; i<=n; i++)  
    {  
        b[i] = length(p[i]); //计算像素点p需要的存储位数  
        int bmax = b[i];  
        s[i] = s[i-1] + bmax;  
        l[i] = 1;  
  
        for(int j=2; j<=i && j<=Lmax;j++)  
        {  
            if(bmax<b[i-j+1])  
            {  
                bmax = b[i-j+1];  
            }  
  
            if(s[i]>s[i-j]+j*bmax)  
            {  
                s[i] = s[i-j] + j*bmax;  
                l[i] = j;  
            }  
        }  
        s[i] += header;  
    }  
}  
  
int length(int i) //i表示p数组中元素的值 
{  
    int k=1;  
    i = i/2;  
    while(i>0)  
    {  
        k++;  
        i=i/2;  
    }  
    return k;  
}  
  
void Traceback(int n,int& i,int s[],int l[])  
{  
    if(n==0)  
        return;  
    Traceback(n-l[n],i,s,l);  
    s[i++]=n-l[n];//重新为s[]数组赋值,用来存储分段位置  
}  
  
void Output(int s[],int l[],int b[],int n)  
{  
    //在输出s[n]存储位数后,s[]数组则被重新赋值,用来存储分段的位置  
    cout<<"图像压缩后的最小空间为:"<<s[n]<<endl;  
    int m = 0;  
    Traceback(n,m,s,l);  
    s[m] = n;  
    cout<<"将原灰度序列分成"<<m<<"段序列段"<<endl;  
    for(int j=1; j<=m; j++)  
    {  
        l[j] = l[s[j]];  
        b[j] = b[s[j]];  
    }  
    for(int j=1; j<=m; j++)  
    {  
        cout<<"段长度:"<<l[j]<<",所需存储位数:"<<b[j]<<endl;  
    }  
}  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1078051.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MS2401隔离式调制器可pin对pin兼容AD7401/AMC1305

MS2401是一款二阶Σ-Δ调制器&#xff0c;集成片上数字隔离器&#xff0c;能将模拟输入信号转换为高速1位码流。可pin对pin兼容AD7401/AMC1305&#xff0c;可兼容AD7701/AMC1306。调制器对输入信号连续采样&#xff0c;无需外部采样保持电路。模拟信号输入满量程为320mV&#x…

win10通过导入注册表快速添加小鹤双拼

环境:win10 win10通过导入注册表快速添加小鹤双拼 fly.reg win10导入附件中的注册表,系统将会自动添加小鹤双拼方案,并将小鹤双拼方案设置为默认。 将下面的代码复制并保存到reg文件中 Windows Registry Editor Version 5.00[HKEY_CURRENT_USER\Software\Microsoft\InputMe…

mysql作业-牛客

1 这个题已经为咱创建了表&#xff0c;所以直接输出就行。 select * from user_profile;2 查询多列&#xff0c;在select 后加上对应的列名即可 select device_id,gender,age,university from user_profile;3. 查询结果要求去重&#xff0c;在select 后加上distinct 再加上对…

2024年元旦怎么放假?元旦放假时间安排表记录到待办APP

结束了为其8天的中秋国庆长假&#xff0c;已经有不少网友开始期待下一个重要节日的到来了&#xff0c;它就是2024年的元旦。那么2024年元旦怎么放假&#xff1f;元旦放假时间安排表你知道吗&#xff1f;其实2024年1月1日是星期一&#xff0c;所以元旦放假时间是2023年12月30日—…

首批成员单位 | 聚铭网络受邀加入中国人工智能产业发展联盟数据委员会

近日&#xff0c;中国人工智能产业发展联盟(简称AIIA&#xff09;成立“数据委员会”&#xff0c;**聚铭网络受邀加入&#xff0c;成为首批成员单位&#xff0c;**与其他成员单位协同推动人工智能产业发展。 中国人工智能产业发展联盟是在国家发展和改革委员会、科学技术部、工…

【网络基础必看】计算机网络 Web与HTTP详解:中科大郑烇老师笔记 (三)

目录 0 引言1 基本概念2 HTTP2.1 HTTP概况2.1.1 HTTP的主要特点2.1.2 持久HTTP和非持久HTTP2.1.3 HTTP请求报文2.1.4 HTTP响应报文 2.2 用户-服务器状态&#xff1a;Cookies2.3 请求-响应模型2.4 Web缓存&#xff08;代理服务器&#xff09; &#x1f64b;‍♂️ 作者&#xff…

spring:详解控制反转IOC和AOP

文章目录 IOC工厂模式实例基于xml管理Bean基于注解管理Bean常用注解&#xff1a;用于创建对象的常用注解&#xff1a;用于注入数据的常用注解&#xff1a;和生命周期相关的(了解)常用注解&#xff1a;新注解 IOC IOC (Inversion of Control)是Spring的核心概念之一。它是指控制…

【SoC FPGA】HPS启动过程

SoC HPS启动流程 Boot ROMPreloaderBoot Loader HPS的启动是一个多阶段的过程&#xff0c;每一个阶段都会完成对应的工作并且将下一个阶段的执行代码引导起来。每个阶段均负责加载下一个阶段。第一个软件阶段是引导 ROM&#xff0c;引导 ROM 代码查找并且执行称为预加载器的第 …

TCP协议总结

一、TCP协议概念。 TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;是一种面向连接的、可靠的传输层协议。它主要用于在计算机网络中&#xff0c;通过建立可靠的通信连接来进行数据传输。 TCP协议的特点如下&#xff1a; 可靠性&#xf…

【Linux C】Linux如何执行一个程序(程序存储空间、系统调用、内核调用)

文章目录 一、程序存储空间1.1 C语言程序存储空间1.2 用户空间和内核空间1.3 用户模式和内核模式 二、内核调用-系统调用-C语言库函数2.1 系统调用和内核调用2.2 C语言库函数 三、Linux如何执行一个程序 一、程序存储空间 本节说的空间主要是指内存空间&#xff0c;即程序如何分…

【STM32 中断】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 STM32中断 前言一、STM32的中断如何&#xff1f;如何管理这么复杂的中断&#xff1f;实际优先级如下怎么使用呢&#xff1f; 二、使用步骤1.引入库函数先分组&#xff0c;怎么…

Gin 文件上传操作(单/多文件操作)

参考地址: 单文件 | Gin Web Framework (gin-gonic.com)https://gin-gonic.com/zh-cn/docs/examples/upload-file/single-file/ 单文件 官方案例: func main() {router := gin.Default()// 为 multipart forms 设置较低的内存限制 (默认是 32 MiB)router.MaxMultipartMem…

IP协议总结

一、定义。 IP全称为Internet Protocol&#xff0c;是TCP/IP协议族中的一员&#xff0c;负责实现数据在网络上的传输。它是一种无连接、不可靠的数据报协议。 IP协议常用于Internet网络和局域网中&#xff0c;它通过将数据包进行分组并进行逐跳转发来实现数据在网络中的传输。…

Android App备案获取公钥、签名MD5值

1.生成签名文件 keytool -genkey -alias 别名XXX -keypass 密码XXX -keyalg RSA -keysize 2048 -validity 36500 -keystore D:\XXX.keystore -storepass 密码XXX2.查看签名MD5值 keytool -list -v -keystore D:\XXX.keystore3.查看公钥 导出证书XXX.cer keytool -export -a…

小程序分销商城有哪些功能?

越来越多的企业&#xff0c;开始打造商城小程序&#xff0c;想要利用商城小程序功能来进行转型升级&#xff0c;那么商城小程序功能有哪些&#xff0c;[可R]下面就来分享一下商城小程序功能有哪些&#xff1f;常用小程序商城功能介绍&#xff1b; 1.产品展示功能&#xff1a;产…

DataGrip导出和导入文件

导出文件后用excel打开 发现乱码。解决办法&#xff1a; DataGrip导出CSV文件中文乱码 | 一个博客 (imguan.com) 再次导入进行测试

java - 设计模式 - 状态模式

文章目录 前言java - 设计模式 - 状态模式1. 概述2. 作用3. 示例 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差&#xff0c;实在白嫖的话&#xf…

CDGA数据治理工程师考试心得

2023年8月初&#xff0c;准备备考CDGA。当时也是很迷茫&#xff0c;啥时候考试都不知道&#xff0c;也不知道该怎么做。写这篇文章的目的也只是记录一下。 1.什么是CDGA? CDGA就是数据治理工程师&#xff08;Certified Data Governance Associate&#xff09;&#xff0c;“D…

【安鸾靶场】cmseasy内网渗透 (500分)

文章目录 题目一、渗透开始后台执行rce漏洞内网横向 题目 一、渗透开始 上burp后没有报漏洞&#xff1a; /admin存在后台&#xff1a; 爆破一下&#xff1a; admin admin123 后台执行rce漏洞 POC&#xff1a; 1111111111";}<?php phpinfo()?> 触发漏洞&#xf…

公众号运营重要策略-公众号排名优化

排名优化一直以来都是公众号运营的重要策略之一。公众号作为连接用户和商家的桥梁&#xff0c;其排名的高低直接影响着曝光量和用户关注度&#xff0c;因此公众号排名优化是每个运营者必须掌握的技能之一。本文将从以下几个方面&#xff0c;为大家深入剖析公众号排名优化的技术…