概要:
yuv格式類別:
打包(packed)格式:將每個畫素點的y,u,v分量交叉排列並以畫素點為單元連續的存放在同一陣列中,通常幾個相鄰的畫素組成乙個巨集畫素(macro-pixel)
平面(planar)格式:使用三個陣列分開連續的存放y,u,v三個分量,即y,u,v分別存放在各自的陣列中。
yuv取樣表示法:
yuv採用a:b:c表示法來描述y,u,v取樣頻率比例,下圖中黑點表示取樣畫素點y分量, 空心圓表示取樣畫素點的uv分量。
4:4:4 表示色度頻道沒有下取樣,即乙個y分量對應著乙個u分量和乙個v分量。
4:2:2 表示 2:1 的水平下取樣,沒有垂直下取樣,即每兩個y分量共用乙個u分量和乙個v分量。
4:2:0 表示 2:1 的水平下取樣,2:1 的垂直下取樣,即每四個y分量共用乙個u分量和乙個v分量。
4:1:1 表示 4:1 的水平下取樣,沒有垂直下取樣。即每四個y分量共用乙個u分量或乙個v分量,與其他格式相比,4:1:1 取樣不太常用。
yuv資料儲存:
下面以每個分量資料儲存在乙個char(或byte)中為例描述yuv的資料儲存方式, 圖中每個方格表示乙個chat。
(1). 4:4:4格式,每畫素32位
推薦乙個 4:4:4 格式,fourcc 碼為 ayuv。這是乙個打包格式,其中每個畫素都被編碼為四個連續位元組,其組織順序如下所示,其中a標示了alpha通道。
(2). 4:2:2格式,每畫素16位
支援兩個 4:2:2 格式,fourcc 碼如為 yuy2 和 uyvy。兩個都是打包格式,其中每個巨畫素都是編碼為四個連續位元組的兩個畫素。這樣會使得色度水平下取樣乘以係數 2。
yuy2
在 yuy2 格式中,資料可被視為乙個不帶正負號的 char 值組成的陣列,其中第乙個位元組儲存第乙個 y 樣例,第二個位元組儲存第乙個 u (cb) 樣例,第三個位元組儲存第二個 y 樣例,第四個位元組儲存第乙個 v (cr) 樣例,如下圖。
如果該影象被看作由兩個 little-endian word 值組成的陣列,則第乙個 word 在最低有效位(lsb) 中包含 y0,在最高有效位 (msb) 中包含 u0。第二個 word 在 lsb 中包含 y1,在 msb 中包含 v0。
uyvy
此格式與 yuy2 相同,只是位元組順序是與之相反的。
如果該影象被看作由兩個 little-endian word 值組成的陣列,則第乙個 word 在 lsb 中包含 u0,在 msb 中包含 y0,第二個 word 在 lsb 中包含 v0,在 msb 中包含 y1。
(3). 4:2:0格式,每畫素16位
imc1
所有 y 樣例都會作為不帶正負號的 char 值組成的陣列首先儲存在記憶體中。後面跟著儲存所有 v (cr) 樣例,然後是所有 u (cb) 樣例。v 和 u 平面與 y 平面具有相同的跨距(即儲存陣列的寬度),從而遺留了如下圖所示的未使用的記憶體區域。
imc3
此格式與 imc1 相同,只是 u 和 v 平面進行了交換。
(4). 4:2:0格式,每畫素12位
推薦四個 4:2:0 每畫素 12 位格式,fourcc 碼:imc2, imc4, yv12, nv12。在所有這些格式中,色度頻道在水平方向和垂直方向上都要以係數 2 來進行再次取樣。
imc2
此格式與 imc1 相同,只是 v (cr) 和 u (cb) 行在半跨距邊界處進行了交錯。換句話說,就是色度區域中的每個完整跨距行都以一行 v 樣例開始,然後是一行在下乙個半跨距邊界處開始的 u 樣例。
此布局與 imc1 相比,imc2能夠更加高效地利用儲存空間。它的色度儲存空間縮小了一半,因此整體儲存空間縮小了 25%。在各個 4:2:0 格式中,imc2 是第二首選格式,排在 nv12 之後。
imc4
此格式與 imc2 相同,只是 u (cb) 和 v (cr) 行進行了交換。
yv12(yu12格式和yv12儲存格式基本相同,只是uv儲存位置互換)
所有 y 樣例都會作為不帶正負號的 char 值組成的陣列首先儲存在記憶體中。此陣列後面緊接著儲存所有 v (cr) 樣例。v 平面的跨距為 y 平面跨距的一半,v 平面包含的行為 y 平面包含行的一半。v 平面後面緊接著儲存所有 u (cb) 樣例,它的跨距和行數與 v 平面相同。
nv12(nv21格式和nv12儲存格式基本相同,只是uv儲存位置互換)
所有 y 樣例都會作為由不帶正負號的 char 值組成的陣列首先儲存在記憶體中,並且行數為偶數。y 平面後面緊接著乙個由不帶正負號的 char 值組成的陣列,其中包含了打包的 u (cb) 和 v (cr) 樣例。
當組合的 u-v 陣列被視為乙個由 little-endian word 值組成的陣列時,lsb 包含 u 值,msb包含 v 值。nv12 是用於 directx va 的首選 4:2:0 畫素格式。
yuv資料轉換:
(1).4:2:2 -> 4:2:0的有失真壓縮轉換
y儲存資料不變,對u和v分量在行垂直下取樣進行隔行抽樣。
(2).4:2:0 -> 4:2:2的補足轉換
y儲存資料不變,對u和v分量在行垂直下取樣進行隔行拷貝補足下一行色度資料。
在yuv中,乙個畫素點對應乙個y分量,同一影象無論是4:4:4, 4:2:2, 4:2:0, 4:1:1的格式,其中y分量資料都是完全相同的。yuv420sp和yuv420p的資料儲存格式區別在於uv分量排列的順序不同,yuv420p是先儲存完u分量後再儲存v分量,也就是說uv分量各自都是連續的,而yuv420sp則交叉儲存uv分量,因此乙個yuv420的儲存空間為:
y分量 = width * hight
u分量 = y / 4
v分量 = y / 4
yuv420影象儲存空間 = width * hight * 3 / 2
例如一張解析度為8x4的yuv420影象,資料儲存格式如下圖:
yuv420sp格式
yuv420p格式
yuv影象旋轉演算法:
下面以yuv420sp格式影象為例給出旋轉90的演算法。
public void rotateyuv420sp(byte src, byte des, int width, int height) {
int length = width * height;
int k = 0;
for(int i = 0; i < width; i++) {
for(int j = 0; j < height; j++) {
des[k] = src[width * j + i];
k++;
for(int i = 0; i < width; i + =2) {
for(int j = 0; j < height / 2; j++) {
des[k] = src[length + width * j + i];
des[k + 1] = src[length + width * j + i + 1];
k += 2;
yuv格式轉換是那個組織定義的 YUV格式詳解
yuv格式通常有兩大類 打包 packed 格式和平面 planar 格式。前者將yuv分量存放在同乙個陣列中,通常是幾個相鄰的畫素組成乙個巨集畫素 macro pixel 而後者使用三個陣列分開存放yuv三個分量,就像是乙個三維平面一樣。表2.3中的yuy2到y211都是打包格式,而if09到yv...
YUV格式到RGB格式的轉換
yuyv格式到rgb格式的轉換 yuyv格式如下 y0u0y1v0 y2u1y3v1.說明 乙個y代表乙個畫素,而乙個y和uv組合起來構成乙個畫素,所以第0個畫素y0和第乙個畫素y1都是共用第0個畫素的u0和v0。而每個分量y,u,v都是占用乙個位元組的儲存空間。所以y0u0y1v0相當於兩個畫素,...
YUV 格式與 RGB 格式的相互轉換公式
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.2...