資料壓縮實驗之彩色空間轉換

2021-10-22 18:41:16 字數 3080 閱讀 1919

學會從計算和程式的角度分析問題通過完成本實驗,理解計算思維,即從問題出發,通過逐步分析和分解,把原問題轉化為可用程式方式解決的問題。在此過程中設計出乙個解決方案。

進一步理解彩色空間的概念並掌握不同彩色空間轉換的基本方程。

通過逐步設計程式,掌握程式設計細節:如查詢表的設計,記憶體分配,對 u 和 v 訊號進行下取樣,檔案讀寫過程等。掌握程式除錯的基本方法。

xcode、yuvviewerplus

儲存方式:

rgb的儲存方式:rgb三個分量按照b、g、r的順序儲存。(4:4:4)

yuv的儲存方式:先存y再存uv分量。(4:2:0)

轉換公式:

y = 0.298r + 0.612g + 0.117b

u = -0.1684r - 0.3316g + 0.5b + 128

v = 0.5r - 0.4187g - 0.0813b + 128

r = y + 1.402 * (v-128)

g = y - 0.3441 * (u-128) - 0.7139 * (v-128)

b = y + 1.7718 * (u-128) - 0.0013 * (v-128)

1.計算uv分量時+128是因為uv分量有負值,加上128可以將變化範圍調整為0—255。

2.由於rgb值有可能出現超出0-255的範圍,已知unsigned char型資料佔1位元組,超出0-255的數值會出現溢位現象,發生彩色顯示錯誤。所以我們可以利用float型中間變數(rf/bf/gf)來暫存由彩色轉換公式計算得來的rgb值,經過大於255則賦值為255,小於0則賦值為0的判斷以後,再給unsigned char型的r/g/b進行賦值,在0-255範圍內的數值則進行強制型別轉換。

初始化程式:開啟兩個檔案、定義變數和緩衝區等等;

讀取rgb檔案,將其資料寫入緩衝區;

呼叫rgb2yuv的函式實現rgb到yuv資料的轉換;

在轉換函式中對uv分量進行下取樣

寫yuv檔案

程式收尾工作(關閉檔案,釋放緩衝區)

main.cpp

#include

#include

#include

#include

#include

"rgb2yuv.hpp"

using

namespace std;

intmain

(int argc,

const

char

* ar**)

rgb2yuv.cpp

#include

"rgb2yuv.hpp"

#include

#include

#include

#include

using

namespace std;

intrgb2yuv

(int x_dim,

int y_dim,

unsigned

char

* bmp,

unsigned

char

* y_out,

unsigned

char

* u_out,

unsigned

char

* v_out)

}// subsample uv 下取樣

for(

int j =

0; j < y_dim/

2; j ++)}

free

(u_buffer)

;free

(v_buffer)

;return0;

}

main.cpp

#include

#include

#include

#include

#include

"yuv2rgb.hpp"

using

namespace std;

intmain

(int argc,

const

char

* ar**)

yuv2rgb.cpp

#include

"yuv2rgb.hpp"

#include

#include

#include

#include

using

namespace std;

intyuv2rgb

(int x_dim,

int y_dim,

unsigned

char

* rgb_out,

unsigned

char

* y_in,

unsigned

char

* u_in,

unsigned

char

* v_in)

} y = y_buffer;

u = sub_u_buf;

v = sub_v_buf;

b = rgb_buffer;

for(

int j=

0; j < y_dim; j++)}

if(sub_u_buf !=

null

)free

(sub_u_buf);if

(sub_v_buf !=

null

)free

(sub_v_buf)

;free

(u_buffer)

;free

(v_buffer)

;return0;

}

採用了中間變數,但依然出現彩色溢位的情況,也許是因為計算係數精度、強制型別轉換等帶來的誤差。

實驗一 彩色空間轉換實驗

rgb計色系統是基於三基色原理的顏色計算系統,由紅光分量r 綠光分量g 藍光分量b可以混合出任意彩色光。在rgb檔案中,單個畫素的儲存形式為bgr順序。yuv色彩空間通過乙個亮度訊號y和兩個色差訊號u v來表示影象。yuv檔案通常是先儲存所有畫素的y分量,再儲存u分量 v分量。在4 2 0取樣格式中...

資料壓縮實驗二bmp to yuv

bmp 全稱bitmap 是windows作業系統中標準影象檔案格式 裝置相關位圖 ddb 和裝置無關位圖 dib 使用非常廣。它採用位對映儲存格式,除了影象深度可選以外,在絕大多數應用中不採用其他任何壓縮。bmp當中資料的色彩空間是rgb。典型的bmp影象由以下四部分組成 1.位圖標頭檔案資料結構...

Hadoop之資料壓縮

壓縮技術能夠有效的減少底層儲存系統 hdfs 讀寫位元組數。壓縮提高了網路頻寬和磁碟空間的效率。在執行mr程式時,i o操作 網路資料傳輸 shuffle和merge要花大量時間,有其是資料規模很大和工作負載密集的情況下,因此,使用資料壓縮顯得非常重要。可以在mapreduce的任意階段啟用壓縮。不...