C++實(shí)現(xiàn)圖像壓縮的示例代碼
一、問(wèn)題描述
一幅圖像由n*m個(gè)像素點(diǎn)組成,其中每個(gè)像素的灰度值范圍是0~255(即需要8bit來(lái)存儲(chǔ)像素的灰度值),由此可以得出存儲(chǔ)此圖像需要的存儲(chǔ)空間為n*m*8(bit)。
不難看出,直接采用上述的存儲(chǔ)方式是需要占用很多存儲(chǔ)空間的。此時(shí)可以采用圖像壓縮算法來(lái)節(jié)省存儲(chǔ)空間。
二、算法分析
1、算法思想
將像素序列分段,段內(nèi)的像素灰度值相似(可以用小于8bit的空間來(lái)存儲(chǔ)一個(gè)像素灰度值),一段內(nèi)的像素用相同的bit數(shù)來(lái)存儲(chǔ),只需要額外存儲(chǔ)每段的長(zhǎng)度和bit數(shù)即可,這樣可以節(jié)省很多空間
于是問(wèn)題的關(guān)鍵就在于如何分段,使得存儲(chǔ)空間的占用最少
2、算法實(shí)現(xiàn)
假設(shè)像素點(diǎn)的灰度集合為p[n],創(chuàng)建三個(gè)表 s[i]、l[i]、b[i],其中:
- s[i]來(lái)記錄前 i 個(gè)數(shù)字的最優(yōu)處理方式得到的最優(yōu)解。
- l[i]來(lái)記錄當(dāng)前第 i 個(gè)數(shù)所在組中有多少個(gè)數(shù)。
- b[i]中存放前 i 個(gè)像素點(diǎn)最后一段位數(shù)的最大值。
假設(shè)產(chǎn)生了m個(gè)段,則存儲(chǔ)第i段像素所需要的空間為 : l[i] * b[i] + 11(l[i] * b[i]表示這一段像素本身需要的信息, 11則表示這一段的長(zhǎng)度l[i]以及該段像素每一個(gè)都用幾位來(lái)表示b[i], 即3 + 8 = 11位)
總存儲(chǔ)空間為 11m+∑ l[i]*b[i]
此時(shí)只要找出最優(yōu)數(shù)組,即可得到最有效的壓縮方法。最優(yōu)數(shù)組含義是:s[i],1≤i≤n,是像素序列{p1,…,pi}的最優(yōu)分段所需的存儲(chǔ)位數(shù)。
遞推關(guān)系式:


三、代碼實(shí)現(xiàn)
#include<iostream>
using namespace std;
const int N = 10;
void show(int s[], int l[], int b[], int n)
{
//在輸出s[n]存儲(chǔ)位數(shù)后,s[]數(shù)組則被重新賦值,用來(lái)存儲(chǔ)分段的位置
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);
}運(yùn)行結(jié)果:

到此這篇關(guān)于C++實(shí)現(xiàn)圖像壓縮的示例代碼的文章就介紹到這了,更多相關(guān)C++圖像壓縮內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語(yǔ)言使用stdlib.h庫(kù)函數(shù)的二分查找和快速排序的實(shí)現(xiàn)代碼
以下是對(duì)C語(yǔ)言使用stdlib.h庫(kù)函數(shù)的二分查找和快速排序的實(shí)現(xiàn)代碼進(jìn)行了詳細(xì)的介紹,需要的朋友可以過(guò)來(lái)參考下。希望對(duì)大家有所幫助2013-10-10
基于Opencv實(shí)現(xiàn)顏色識(shí)別
這篇文章主要為大家詳細(xì)介紹了基于Opencv實(shí)現(xiàn)顏色識(shí)別,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-07-07
C語(yǔ)言實(shí)現(xiàn)逆序輸出詳細(xì)
這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)逆序輸出。主要實(shí)現(xiàn)C語(yǔ)言實(shí)現(xiàn)對(duì)數(shù)組元素依次賦值然后按照逆序輸出,下面文章小編將詳細(xì)解說(shuō),需要的朋友可以參考一下2021-10-10
如何通過(guò)wrap malloc定位C/C++的內(nèi)存泄漏問(wèn)題
用C/C++開(kāi)發(fā)的程序執(zhí)行效率很高,但卻經(jīng)常受到內(nèi)存泄漏的困擾。本文提供一種通過(guò)wrap malloc查找memory leak的思路。2021-05-05
C++ 中 const 和 static 關(guān)鍵字用法及定義
本文給大家介紹C++中const和static 關(guān)鍵字用法及定義,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2025-09-09
利用Qt+opencv實(shí)現(xiàn)視頻分解為圖片
這篇文章主要為大家詳細(xì)介紹了如何利用Qt和opencv實(shí)現(xiàn)視頻分解為圖片,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-12-12
ubuntu系統(tǒng)vscodeC++編譯環(huán)境配置與使用方式
這篇文章主要介紹了ubuntu系統(tǒng)vscodeC++編譯環(huán)境配置與使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12

