所給rgb檔案是按照b,g,r順序排列的且去掉了包含檔案屬性的檔案頭,檔案解析度為256
×256
256\times256
256×25
6。該段**可以實現如下功能:
由於c++作圖不方便,於是圖表均為excel完成。
#include
#include
#include
#include
using
namespace std;
const
char
* inpath =
"d:\\clionprojects\\algorithm\\cmake-build-debug-mingw\\down.rgb"
;const
char
* outpath =
"d:\\clionprojects\\algorithm\\cmake-build-debug-mingw\\data.csv"
;const
char
* outfile =
"d:\\clionprojects\\algorithm\\cmake-build-debug-mingw\\data.cif"
;//這裡建議使用絕對路徑
//使用相對路徑時需要放到ide預設的路徑或手動設定
int num[6]
[256
], len =0;
double entropy[6]
;vector<
unsigned
char
> yuv[3]
;int
main()
while
(!in.
eof())
)*i = in.
get();
//計算y,u,v分量
y =((
66* r +
129* g +
25* b +
128)
>>8)
+16; u =((
-38* r -
74* g +
112* b +
128)
>>8)
+128
; v =((
112* r -
94* g -
18* b +
128)
>>8)
+128
;//統計數值出現次數
for(
auto i :
) num[pos++
][i]++;
pos =
0; len++
;//儲存y,u,v的值
for(
auto i :
) yuv[pos++].
push_back
(i);
} in.
close()
;//建立**
ofstream out
(outpath, ios::binary);if
(!out.
is_open()
)//輸出**內容
out <<
"value,r,g,b,y,u,v"
<< endl;
for(
int j =
0; j <
256;
++j)
} out << endl <<
" ,r,g,b,y,u,v"
<< endl <<
"entropy,"
;for
(int i =
0; i <6;
++i) out << entropy[i]
<<
(i ==5?
"\n"
:",");
; out.
close()
;//建立cif檔案
out.
open
(outfile, ios::binary);if
(!out.
is_open()
)//輸出內容
for(
auto
& i : yuv)
for(
auto j : i) out << j;
out.
close()
;}
生成的**如下:
各個分量的熵:
r,g,b和y,u,v取值的頻率圖:
可見yuv格式中各個分量出現的比較集中。
各個分量的熵:
可見yuv格式各個分量的熵相較於rgb較小,根據夏農第一定律可以壓縮的比率也更大。
讀取分析RGB檔案
作業3 讀入乙個24bitrgb檔案 以down.rgb為例,其解析度為256 256 輸出該資料檔案中r g b三個分量 各8bit表示 的概率分布示意圖 類似下圖 和熵。開闢3個width height的unsigned char型陣列 開啟要讀出的rgb檔案 以 rb 方式開啟 開啟3個要輸出...
常見的RGB和YUV格式分析
rgb1 rgb4 rgb8都是調色盤型別的rgb格式,在描述這些 型別的格式細節時,通常會在bitmapinfoheader資料結構後面跟著乙個調色盤 定義一系列顏色 它們的影象資料並不是真正的顏色值,而是當前畫素顏色值在調色盤中的索引。以rgb1 2色位圖 為例,比如它的調色盤中定義的兩種顏色值...
YUV 與RGB之間的變換
大多數的計算機圖形工作者熟悉 rgb,而大多數的具有影象背景的則熟悉 yuv。rgb可以認為是三個分別表示紅,綠,藍顏色的灰度影象。把它們組合在一起就可以產生各種各樣的顏色。yuv 使用rgb的資訊,但它從全彩色影象中產生乙個黑白影象,然後提取出三個主要的顏色變成兩個額外的訊號來描述顏色。把這三個訊...