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...