c_cpp 【动态规划】图像压缩【3.7】
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp 【动态规划】图像压缩【3.7】相关的知识,希望对你有一定的参考价值。
//3d7 动态规划 图像压缩问题
#include "stdafx.h"
#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)
{
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;
}
}
以上是关于c_cpp 【动态规划】图像压缩【3.7】的主要内容,如果未能解决你的问题,请参考以下文章
动态规划之基于接缝裁剪的图像压缩
c_cpp 【动态规划】最长公共子串
c_cpp 动态规划 - 最长回文子串
c_cpp 【动态规划】流水作业调度【3.9】
c_cpp 【动态规划】多边形游戏【3.6】
c_cpp 【动态规划】最大子段和【】3.4