我是靠谱客的博主 贤惠服饰,最近开发中收集的这篇文章主要介绍【动态规划】图像压缩问题,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

这里写图片描述这里写图片描述

//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;
	}
}

 

最后

以上就是贤惠服饰为你收集整理的【动态规划】图像压缩问题的全部内容,希望文章能够帮你解决【动态规划】图像压缩问题所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(39)

评论列表共有 0 条评论

立即
投稿
返回
顶部