YUV 格式與 RGB 格式的相互轉換公式

2021-08-19 05:41:07 字數 4133 閱讀 4226

cr

=vcb

=u==

=0.257r+

0.504g+

0.098b+

160.439r−

0.368g−

0.071b+

128−

0.148r−

0.291g+

0.439b+

128y=0.257r+0.504g+0.098b+16cr=v=0.439r−0.368g−0.071b+128cb=u=−0.148r−0.291g+0.439b+128gr

===1.164(y

−16)+

2.018(u

−128

)1.164(y

−16)−

0.813(v

−128)−

0.391(u

−128

)1.164(y

−16)+

1.596(v

−128

)b=1.164(y−16)+2.018(u−128)g=1.164(y−16)−0.813(v−128)−0.391(u−128)r=1.164(y−16)+1.596(v−128)0,

255]

[0,255]

,y 的範圍是 [16,

235]

[16,235]

,uv 的範圍是 [16,

239]

[16,239]

。 如果計算結果超出這個範圍就截斷處理。cr

=vcb

=u==

=0.299r+

0.587g+

0.114

b0.713(r

−y)=

0.500r−

0.419g−

0.081

b0.564(b

−y)=

−0.169r−

0.331g+

0.500

by=0.299r+0.587g+0.114bcr=v=0.713(r−y)=0.500r−0.419g−0.081bcb=u=0.564(b−y)=−0.169r−0.331g+0.500bgb

===y

+1.403vy

−0.344u−

0.714vy

+1.770

ur=y+1.403vg=y−0.344u−0.714vb=y+1.770u0,

1][0,1]

。 y 的範圍是 [0,

1][0,1]

, cr 和 cb 的範圍是 [

−0.5

,0.5

][−0.5,0.5]。0

,255

][0,255]

,那麼常用的轉換公式是這樣的。 gb

===y

+1.403×(

v−128)y–

0.343×(

u–128)

–0.714×(

v–128)y+

1.770×(

u–128)

r=y+1.403×(v−128)g=y–0.343×(u–128)–0.714×(v–128)b=y+1.770×(u–128)cr

=vcb

=u==

=0.299r+

0.587g+

0.114

b0.500r−

0.419g−

0.081b+

128−

0.169r−

0.331g+

0.500b+

128y=0.299r+0.587g+0.114bcr=v=0.500r−0.419g−0.081b+128cb=u=−0.169r−0.331g+0.500b+128

u = u - 128; 

v = v - 128;

r = qround(0, y + v + (v * 103) >> 8, 255);

g = qround(0, y – (u * 88) >> 8 – (v * 183) >> 8, 255);

b = qround(0, y + u + (u * 198) >> 8, 255);

0

,255

][0,255]

/**

*@brief yuv2rgb

*@param y [0, 255]

*@param u [0, 255]

*@param v [0, 255]

*@return #abgr

*/inline qrgb yuv2rgb(uint8_t y, uint8_t u, uint8_t v)

/** *@brief rgb2yuv

*@param rgb [0, 255]

*@param y [0, 255]

*@param u [0, 255]

*@param v [0, 255]

*/inline void rgb2yuv(qrgb rgb, uint8_t &y, uint8_t &u, uint8_t &v)

inline qrgb yuv2rgb_fast(uint8_t y, uint8_t u, uint8_t v)

gb

===y

+1.403×(

v−128)y–

0.343×(

u–128)

–0.714×(

v–128)y+

1.770×(

u–128)

r=y+1.403×(v−128)g=y–0.343×(u–128)–0.714×(v–128)b=y+1.770×(u–128)

∗256

256∗256

的**中。b 也類似,只需要 y 和 u 的資訊,也可以儲存在乙個 256

∗256

256∗256

的**中。

0.343×(

u–128)

–0.714×(

v–128)

–0.343×(u–128)–0.714×(v–128)

的計算結果可以存在乙個 256

∗256

256∗256

的**中。這個**中存放的數從 -135 到 134, 共有 270 個。因此,可以再用乙個 256

∗270

256∗270

的**來儲存 y

y 和這個值的和。因此,g 的計算需要兩層查表。即使這樣,也比移位運算快得多。

class yuv2rgbconverter

;inline qrgb yuv2rgbconverter::yuv2rgb(uint8_t y, uint8_t u, uint8_t v)

bool yuv2rgbconverter::m_table_init = false;

uint8_t yuv2rgbconverter::ryv[256][256];

uint8_t yuv2rgbconverter::byu[256][256];

uint16_t yuv2rgbconverter::tuv[256][256];

uint8_t yuv2rgbconverter::gyt[256][270];

yuv2rgbconverter::yuv2rgbconverter()

}for(int u = 0; u < 256; u++)

}for(int y = 0; y < 256; y++)

}m_table_init = true;

}}void yuv2rgbconverter::yuy2(const uint8_t *yuy2, qrgb * rgb, size_t size)

while(i < size);

}void yuv2rgbconverter::vyuy(const uint8_t * yuy2, qrgb * rgb, size_t size)

while(i < size);

}void yuv2rgbconverter::yuv422(const uint8_t * yuv_y,

const uint8_t * yuv_u,

const uint8_t * yuv_v,

qrgb * rgb,

size_t size)

while(i < size);

}

RGB與YUV格式 四

一 rgb rgb24一幀的大小size width heigth 3 byte,rgb32的size width heigth 4byte.1.rgb為紅綠藍三原色 yuv,rgb是色彩空間模型,而bmp,png,jpeg,gif是影象的檔案儲存格式。影象的每個畫素的三個分量為r g b,每個顏色...

YUV格式到RGB格式的轉換

yuyv格式到rgb格式的轉換 yuyv格式如下 y0u0y1v0 y2u1y3v1.說明 乙個y代表乙個畫素,而乙個y和uv組合起來構成乙個畫素,所以第0個畫素y0和第乙個畫素y1都是共用第0個畫素的u0和v0。而每個分量y,u,v都是占用乙個位元組的儲存空間。所以y0u0y1v0相當於兩個畫素,...

YUV 與RGB互轉的函式

yuv 與rgb互轉的函式 標頭檔案 ifndef colorconvert h define colorconvert h 1 void initconvttbl void i420 to rgb24 unsigned char src,unsigned char dst,int width,in...