提示:(用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 根據不同檔案的資料量...