資料壓縮作業三2020 03 24

2021-10-04 08:15:27 字數 3223 閱讀 8127

提示:(用c或c++實現時),程式的流程為

開闢3個width*height的unsigned char型陣列;開啟要讀出的rgb檔案(以「rb」方式開啟),開啟3個要輸出的資料統計檔案(以「w」方式開啟,可命名為r_sat.txt等);將rgb資料從rgb檔案中讀出,並分別儲存到3個陣列中,期間計算資料的概率分布和熵,並將這些資料寫入3個資料統計txt檔案中。txt檔案的寫入方式如下所示(每行的兩個資料用tab分開)。在excel裡將這3個txt檔案開啟即可生成統計圖。

#include

using

namespace std;

int height =

256;

int width =

256;

intmain()

;unsigned

char g[

65536]=

;unsigned

char b[

65536]=

;//開闢三個width*height的unsigned char型陣列

file *file;

file=

fopen

("down.rgb"

,"rb");

if(file==

null

)else

unsigned

char buffer[

196608];

fread

(buffer,1,

196608

, file)

;//讀出檔案的畫素

int b=0;

int g=0;

int r=0;

for(

int i=

0;i<

196608

;i++

)else

if(i%3==

1)else

}//rgb儲存各自陣列

double fr[

256]=;

double fg[

256]=;

double fb[

256]=;

for(

int i =

0; i <

256; i++)}

fr[i]

=double

(x)/

double

(width)

/double

(height);}

for(

int i =

0; i <

256; i++)}

fg[i]

=double

(y)/

double

(width)

/double

(height);}

for(

int i =

0; i <

256; i++)}

fb[i]

=double

(z)/

double

(width)

/double

(height);}

//算出rgb的概率分布

double sr =0;

double sg =0;

double sb =0;

for(

int i =

0; i <

256; i++)}

for(

int i =

0; i <

256; i++)}

for(

int i =

0; i <

256; i++)}

cout <<

"r的熵"

<< sr << endl;

cout <<

"g的熵"

<< sg << endl;

cout <<

"b的熵"

<< sb << endl;

//計算熵

file* r_sat;

file* g_sat;

file* b_sat;

r_sat=

fopen

("r_sat.txt"

,"w");

g_sat=

fopen

("g_sat.txt"

,"w");

b_sat=

fopen

("b_sat.txt"

,"w");

fprintf

(r_sat,

"symol\t freq\n");

for(

int i =

0; i <

256; i++

)fprintf

(g_sat,

"symol\t freq\n");

for(

int i =

0; i <

256; i++

)fprintf

(b_sat,

"symol\t freq\n");

for(

int i =

0; i <

256; i++

)//輸出三個txt

fclose

(file)

;fclose

(r_sat)

;fclose

(g_sat)

;fclose

(b_sat)

;return0;

}

結果

遇到的問題:

1.讀出寫入函式的使用不熟練,對rgb不理解,不知道為什麼取值0-255

2.設定的中間引數太多,思路不太清楚

rgb儲存各自陣列的部分,後來看同學**發現可以不設rgb,迴圈時i=i+3,g[i]=buffuer[i],b[i]=buffuer[i+1],r[i]=buffuer[i+2]就可以

3.迴圈考慮不周全

算出rgb的概率分布部分,用於計數的xyz一開始在迴圈外定義,統計完乙個灰度之後沒有歸零,導致計算出的熵在60-70。

資料壓縮任務三

作業3 讀入乙個24bitrgb檔案 以down.rgb為例,其解析度為256 256 輸出該資料檔案中r g b三個分量 各8bit表示 的概率分布示意圖 類似下圖 和熵。include include const int n 65536 using namespace std pragma wa...

資料壓縮第三次作業

作業3 讀入乙個24bitrgb檔案 以down.rgb為例,其解析度為256 256 輸出該資料檔案中r g b三個分量 各8bit表示 的概率分布示意圖 類似下圖 和熵。matlab clc close all clear all file1 fopen down.rgb x fread fil...

資料壓縮 作業三(讀取RGB檔案)

1 乙個24bit的rgb檔案,每個畫素點可分為r g b三個分量,則這個檔案可分為3個8bit的檔案。2 解析度為256 256,則乙個r g b檔案資料量為256 256,設為常量size 而乙個24bit的rgb檔案資料量為256 256 3,設為常量buffsize。3 根據不同檔案的資料量...