C++实现图像压缩的示例代码
作者:可以帮我找找钥匙吗.
这篇文章主要为大家详细介绍了如何使用C++实现图像压缩的功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
一、问题描述
一幅图像由n*m个像素点组成,其中每个像素的灰度值范围是0~255(即需要8bit来存储像素的灰度值),由此可以得出存储此图像需要的存储空间为n*m*8(bit)。
不难看出,直接采用上述的存储方式是需要占用很多存储空间的。此时可以采用图像压缩算法来节省存储空间。
二、算法分析
1、算法思想
将像素序列分段,段内的像素灰度值相似(可以用小于8bit的空间来存储一个像素灰度值),一段内的像素用相同的bit数来存储,只需要额外存储每段的长度和bit数即可,这样可以节省很多空间
于是问题的关键就在于如何分段,使得存储空间的占用最少
2、算法实现
假设像素点的灰度集合为p[n],创建三个表 s[i]、l[i]、b[i],其中:
- s[i]来记录前 i 个数字的最优处理方式得到的最优解。
- l[i]来记录当前第 i 个数所在组中有多少个数。
- b[i]中存放前 i 个像素点最后一段位数的最大值。
假设产生了m个段,则存储第i段像素所需要的空间为 : l[i] * b[i] + 11(l[i] * b[i]表示这一段像素本身需要的信息, 11则表示这一段的长度l[i]以及该段像素每一个都用几位来表示b[i], 即3 + 8 = 11位)
总存储空间为 11m+∑ l[i]*b[i]
此时只要找出最优数组,即可得到最有效的压缩方法。最优数组含义是:s[i],1≤i≤n,是像素序列{p1,…,pi}的最优分段所需的存储位数。
递推关系式:
三、代码实现
#include<iostream> using namespace std; const int N = 10; void show(int s[], int l[], int b[], int n) { //在输出s[n]存储位数后,s[]数组则被重新赋值,用来存储分段的位置 cout << "图像压缩后的最小空间为:" << s[n] << endl; } int length(int x) { int count = 1; x = x / 2; while (x > 0) { count++; x = x / 2; } return count; } void compress(int n,int p[N], int s[N], int l[N], int b[N]) { int lmax = 256,bmax; int header = 11; s[0] = 0; for (int i = 1; i <= n; i++) { b[i] = length(p[i]); 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 main() { int data[N] = { 10,12,11,9,145,238,2,3,5,1 }; cout << "图像的灰度值序列:"; for (int i = 0; i < N; i++) { cout << data[i]<<" "; } cout << endl; int s[N],l[N], b[N]; compress(N - 1, data, s, b, l); show(s,l,b,N - 1); }
运行结果:
到此这篇关于C++实现图像压缩的示例代码的文章就介绍到这了,更多相关C++图像压缩内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!