概述
图像压缩:
一:
对于图像像素点进行压缩:对于一组像素数组用二进制bit位表示,如果像素值从 0到255,最多用8位二进制表示。如果像素值为5,用8位二进制表示会浪费空间,所以通过压缩的方法进行存储。
例如: 23,17,28,23,27,29,30,18,28,27,39,48,129 ,139,178,220,23,9,183,133,19,299....
可以将 23,17,28,23,27,29,30,18,28,27看成一组 ,这一组都用5个bit位就可以存储,同时再另外用8个bit位记录这一组总共有多少个数据(这一组就是00001010),然后再用3个bit位记录这一组数据使用几个bit位存储(这一组就是 101);
算法要求:
将一组数据进行分组,使得最后占用的空间最少;
二:
定义数组dp[i] , dp[i]表示前 i 个数据的最佳分组;
对于第i个数据,假设前i-1个数据的最优解,因为第i个数据一定存在于最后一个分组,所以最后一个分组的长度可以是从最后一个数据i 向前的 j 个长度( j 最大为255 ,一个分组最多有个255数据);
dp[i] = dp[ i -j] + k*max_length + 11
max_length :这一组的k个数据的最大值需要的二进制bit位。
三:
#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#define MAX 100
using namespace std;
int length(int i){ //对于长度i返回它需要的二进制位数
int k = 1;
while(i=(i/2))k++;
return k;
}
int compress(int *picture,int n,int *l,int *b){
memset(b,0,sizeof b);
int HIGHT = 11;
int dp[MAX];
dp[0] = 0;
int LENGTH[MAX];
LENGTH[0] = 0;
for(int i = 1;i < n; i++){ //数据 1 到 n-1
LENGTH[i] = length(picture[i]);
int _MAX = LENGTH[i];
dp[i] = dp[i-1] + _MAX + 11;
l[i] = 1;
b[i] = _MAX;
for(int j = 2; j <= 256 && i-j >= 0;j++) {
if(LENGTH[i-j + 1] > _MAX) _MAX = LENGTH[i-j+1]; //记录一组中的最大位数
int MID = dp[i-j] + j*_MAX + 11;
if(MID < dp[i]){
dp[i] = MID;
l[i] = j;
b[i] = _MAX;
}
}
}
return dp[MAX-1];
}
void traceback(int n,int *l,int *b,int *picture){
if(n == 0)
return ;
else
traceback(n-l[n],l,b,picture); //用l[n]记录一组数据中的长度,b[n]记录这组的数据是用多少bit位表示的
cout<<"用"<<b[n]<<"个bit位:";
for(int i = n-l[n];i <= n;i++)
cout<<picture[i]<<" ";
cout<<endl;
}
int main(){
int b[MAX],l[MAX],picture[MAX];
srand((unsigned)time(NULL));
for(int i = 0;i < MAX;i++){
picture[i]= rand()%255; cout<<picture[i]<<" ";
}
cout<<endl;
cout<<"最短占用"<<compress(picture,MAX,l,b)<<"bit"<<endl;
traceback(MAX-1,l,b,picture);
return 0;
}
最后
以上就是调皮西牛为你收集整理的夜深人静写算法——图像压缩(动态规划)的全部内容,希望文章能够帮你解决夜深人静写算法——图像压缩(动态规划)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复