C++实现图像压缩的示例代码

 更新时间:2023年12月26日 10:54:29   作者:可以帮我找找钥匙吗.  
这篇文章主要为大家详细介绍了如何使用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++图像压缩内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言使用stdlib.h库函数的二分查找和快速排序的实现代码

    C语言使用stdlib.h库函数的二分查找和快速排序的实现代码

    以下是对C语言使用stdlib.h库函数的二分查找和快速排序的实现代码进行了详细的介绍,需要的朋友可以过来参考下。希望对大家有所帮助
    2013-10-10
  • C++实现通讯录管理系统

    C++实现通讯录管理系统

    这篇文章主要为大家详细介绍了C++实现通讯录管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12
  • 基于Opencv实现颜色识别

    基于Opencv实现颜色识别

    这篇文章主要为大家详细介绍了基于Opencv实现颜色识别,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-07-07
  • C语言实现逆序输出详细

    C语言实现逆序输出详细

    这篇文章主要介绍了C语言实现逆序输出。主要实现C语言实现对数组元素依次赋值然后按照逆序输出,下面文章小编将详细解说,需要的朋友可以参考一下
    2021-10-10
  • 如何通过wrap malloc定位C/C++的内存泄漏问题

    如何通过wrap malloc定位C/C++的内存泄漏问题

    用C/C++开发的程序执行效率很高,但却经常受到内存泄漏的困扰。本文提供一种通过wrap malloc查找memory leak的思路。
    2021-05-05
  • Linux 软件看门狗 watchdog使用介绍

    Linux 软件看门狗 watchdog使用介绍

    这篇文章主要介绍了Linux 软件看门狗 watchdog使用介绍,需要的朋友可以参考下
    2016-10-10
  • C++ 中 operator() 重载与最佳实践

    C++ 中 operator() 重载与最佳实践

    本文详细介绍了C++中operator()重载的概念和应用,包括函数对象的定义、状态保持、比较器、算法库中的应用、函数对象容器、高级应用场景以及性能考虑与最佳实践,感兴趣的朋友跟随小编一起看看吧
    2026-01-01
  • C++ 中 const 和 static 关键字用法及定义

    C++ 中 const 和 static 关键字用法及定义

    本文给大家介绍C++中const和static 关键字用法及定义,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2025-09-09
  • 利用Qt+opencv实现视频分解为图片

    利用Qt+opencv实现视频分解为图片

    这篇文章主要为大家详细介绍了如何利用Qt和opencv实现视频分解为图片,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-12-12
  • ubuntu系统vscodeC++编译环境配置与使用方式

    ubuntu系统vscodeC++编译环境配置与使用方式

    这篇文章主要介绍了ubuntu系统vscodeC++编译环境配置与使用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12

最新评论