矩陣
在先講顏色編碼之前主籍,先回顧一下高數(shù)中的矩陣的基本知識(shí)《線性代數(shù)》:
- 什么是矩陣
矩陣是指縱橫排列的二維數(shù)據(jù)表格贸铜,比如以下表示方式:
圖1.jpg
- 矩陣的加法和減法
相同數(shù)字的位置相加或相減
圖2.png
- 矩陣乘法
第一個(gè)矩陣第一行的每個(gè)數(shù)字(2和1)蠕嫁,各自乘以第二個(gè)矩陣第一列對(duì)應(yīng)位置的數(shù)字(1和1)悍抑,然后將乘積相加( 2 x 1 + 1 x 1)记罚,得到結(jié)果矩陣左上角的那個(gè)值3变秦。
圖3png.png
也就是說,結(jié)果矩陣第m行與第n列交叉位置的那個(gè)值席爽,等于第一個(gè)矩陣第m行與第二個(gè)矩陣第n列意荤,對(duì)應(yīng)位置的每個(gè)值的乘積之和。
- 矩陣乘法怎么來的只锻?
矩陣的本質(zhì)就是線性方程式玖像,兩者是一一對(duì)應(yīng)關(guān)系。如果從線性方程式的角度齐饮,理解矩陣乘法就毫無難度捐寥。
有三組未知數(shù) x、y 和 t祖驱,其中 x 和 y 的關(guān)系如下:
圖4.png
x 和 t 的關(guān)系如下:
圖5.png
有了這兩組方程式握恳,就可以求 y 和 t 的關(guān)系。從矩陣來看捺僻,很顯然乡洼,只要把第二個(gè)矩陣代入第一個(gè)矩陣即可:
圖6.png
從方程式來看,也可以把第二個(gè)方程組代入第一個(gè)方程組:
圖7.png
上面的方程組可以整理成下面的形式:
圖8.png
最后那個(gè)矩陣等式匕坯,與前面的矩陣等式一對(duì)照束昵,就會(huì)得到下面的關(guān)系:
圖9.png
矩陣乘法的計(jì)算規(guī)則,從而得到證明醒颖。
希望看完這點(diǎn)妻怎,能夠喚起大學(xué)你高數(shù)的那么一點(diǎn)點(diǎn)的回憶。
RGBA
- RGBA是什么
RGB色彩模式是工業(yè)界的一種顏色標(biāo)準(zhǔn)泞歉,是通過對(duì)紅(R)逼侦、綠(G)匿辩、藍(lán)(B)三個(gè)顏色通道的變化以及它們相互之間的疊加來得到各式各樣的顏色的,RGB即是代表紅榛丢、綠铲球、藍(lán)三個(gè)通道的顏色,這個(gè)標(biāo)準(zhǔn)幾乎包括了人類視力所能感知的所有顏色晰赞,是目前運(yùn)用最廣的顏色系統(tǒng)之一稼病。其中A代表alpha通道一般用作不透明度參數(shù)。如果一個(gè)像素的alpha通道數(shù)值為0%掖鱼,那它就是完全透明的(也就是看不見的)然走,而數(shù)值為100%則意味著一個(gè)完全不透明的像素(傳統(tǒng)的數(shù)字圖像)。在0%和100%之間的值則使得像素可以透過背景顯示出來戏挡,就像透過玻璃(半透明性)芍瑞,這種效果是簡(jiǎn)單的二元透明性(透明或不透明)做不到的。它使數(shù)碼合成變得容易褐墅。alpha通道值可以用百分比拆檬、整數(shù)或者像RGB參數(shù)那樣用0到1的實(shí)數(shù)表示alpha通道一般用作不透明度參數(shù)。如果一個(gè)像素的alpha通道數(shù)值為0%妥凳,那它就是完全透明的(也就是看不見的)竟贯,而數(shù)值為100%則意味著一個(gè)完全不透明的像素(傳統(tǒng)的數(shù)字圖像)。在0%和100%之間的值則使得像素可以透過背景顯示出來逝钥,就像透過玻璃(半透明性)屑那,這種效果是簡(jiǎn)單的二元透明性(透明或不透明)做不到的。它使數(shù)碼合成變得容易晌缘。alpha通道值可以用百分比齐莲、整數(shù)或者像RGB參數(shù)那樣用0到1的實(shí)數(shù)表示。
- 要點(diǎn)
RGB555 用16位存儲(chǔ)磷箕,三個(gè)分量都用5位表示,剩下一位不用阵难。
RGB565用16位存儲(chǔ)岳枷,R和B5位,G6位呜叫。
RGB24用24位存儲(chǔ)空繁,每種分配8位。其中分量的排列順序?yàn)锽GRBGRBGR...朱庆。
RGB32用32為存儲(chǔ)盛泡,每種8位,并新增8位用于表示alpha通道或者不使用娱颊。分量存儲(chǔ)順序?yàn)锽GRA,BGRA,BGRA...
與ARGB的區(qū)別:
ARGB是一種色彩模式傲诵,而RGBA是代表Red(紅色) Green(綠色) Blue(藍(lán)色)和 Alpha的色彩空間凯砍。
YUV
- YUV是什么
YUV,分為三個(gè)分量拴竹,“Y”表示明亮度(Luminance或Luma)悟衩,也就是灰度值;而“U”和“V” 表示的則是色度(Chrominance或Chroma)栓拜,作用是描述影像色彩及飽和度座泳,用于指定像素的顏色。
- YUV的由來
與我們熟知的RGB類似幕与,YUV也是一種顏色編碼方法挑势,主要用于電視系統(tǒng)以及模擬視頻領(lǐng)域,它將亮度信息(Y)與色彩信息(UV)分離啦鸣,沒有UV信息一樣可以顯示完整的圖像潮饱,只不過是黑白的,這樣的設(shè)計(jì)很好地解決了彩色電視機(jī)與黑白電視的兼容問題赏陵。并且饼齿,YUV不像RGB那樣要求三個(gè)獨(dú)立的視頻信號(hào)同時(shí)傳輸,所以用YUV方式傳送占用極少的頻寬蝙搔。
- YUV存儲(chǔ)格式
YUV 4:4:4采樣缕溉,每一個(gè)Y對(duì)應(yīng)一組UV分量8+8+8 = 24bits,3個(gè)字節(jié)。
下面的四個(gè)像素為: [Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3]
存放的碼流為: Y0 U0 V0 Y1 U1 V1 Y2 U2 V2 Y3 U3 V3
內(nèi)存大谐孕汀:表示色度值(UV)沒有減少采樣证鸥。即Y,U,V各占一個(gè)字節(jié),加上Alpha通道一個(gè)字節(jié)勤晚,總共占4字節(jié).這個(gè)格式其實(shí)就是24bpp的RGB格式了
YUV 4:2:2采樣枉层,每?jī)蓚€(gè)Y共用一組UV分量,一個(gè)YUV占8+4+4 = 16bits 2個(gè)字節(jié)。
下面的四個(gè)像素為: [Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3]
存放的碼流為: Y0 U0 Y1 V1 Y2 U2 Y3 V3
映射出像素點(diǎn)為:[Y0 U0 V1] [Y1 U0 V1] [Y2 U2 V3] [Y3 U2 V3]
內(nèi)存大写托础:w * h * 2
YUV 4:2:0采樣鸟蜡,每四個(gè)Y共用一組UV分量一個(gè)YUV占8+2+2 = 12bits 1.5個(gè)字節(jié)。
下面八個(gè)像素為:[Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3]
[Y5 U5 V5] [Y6 U6 V6] [Y7U7 V7] [Y8 U8 V8]
存放的碼流為:Y0 U0 Y1 Y2 U2 Y3
Y5 V5 Y6 Y7 V7 Y8
映射出的像素點(diǎn)為:[Y0 U0 V5] [Y1 U0 V5] [Y2 U2 V7] [Y3 U2 V7]
[Y5 U0 V5] [Y6 U0 V5] [Y7U2 V7] [Y8 U2 V7]
內(nèi)存則是:yyyyyyyyuuvv
需要占用的內(nèi)存:w * h * 3 / 2
YUV 4:1:1采樣:是在水平方向上對(duì)色度進(jìn)行4:1抽樣挺邀。對(duì)于低端用戶和消費(fèi)類產(chǎn)品這仍然是可以接受的揉忘。對(duì)非壓縮的8比特量化的視頻來說,每個(gè)由4個(gè)水平方向相鄰的像素組成的宏像素需要占用6字節(jié)內(nèi)存
下面的四個(gè)像素為: [Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3]
存放的碼流為: Y0 U0 Y1 Y2 V2 Y3
映射出像素點(diǎn)為:[Y0 U0 V2] [Y1 U0 V2] [Y2 U0 V2] [Y3 U0 V2]
內(nèi)存大卸祟酢:可以參考4:2:2分量泣矛,是進(jìn)一步壓縮,每隔四個(gè)點(diǎn)才采一次U和V分量禾蚕。一般是第1點(diǎn)采Y,U,第2點(diǎn)采Y,第3點(diǎn)采YV,第4點(diǎn)采Y,依次類推您朽。
除了4:4:4采樣,其余采樣后信號(hào)重新還原顯示后,會(huì)丟失部分UV數(shù)據(jù)换淆,只能用相臨的數(shù)據(jù)補(bǔ)齊哗总,但人眼對(duì)UV不敏感几颜,因此總體感覺損失不大。
YUV轉(zhuǎn)RGB的方法:
這里的轉(zhuǎn)換就需要用到前面說的矩陣的加法了,公式如下:
UV(256 級(jí)別) 可以從8位 RGB 直接計(jì)算:
Y = 0.299 R + 0.587 G + 0.114 B
U = - 0.1687 R - 0.3313 G + 0.5 B + 128
V = 0.5 R - 0.4187 G - 0.0813 B + 128
反過來魂奥,RGB 也可以直接從YUV (256級(jí)別) 計(jì)算:
R = Y + 1.402 (Cr-128)
G = Y - 0.34414 (Cb-128) - 0.71414 (Cr-128)
B = Y + 1.772 (Cb-128)
代碼的話菠剩,有一個(gè)C代碼庫(libyuv),這個(gè)庫完整的實(shí)現(xiàn)了所有轉(zhuǎn)換耻煤。
libyuv for android
- YUV的分類
YUV格式有兩大類:planar和packed具壮。
planar:YUV的存儲(chǔ)中與RGB格式最大不同在于,RGB格式每個(gè)點(diǎn)的數(shù)據(jù)是連繼保存在一起的哈蝇。即R棺妓,G,B是前后不間隔的保存在2-4byte空間中炮赦。而YUV的數(shù)據(jù)中為了節(jié)約空間怜跑,U,V分量空間會(huì)減小吠勘。每一個(gè)點(diǎn)的Y分量獨(dú)立保存性芬,但連續(xù)幾個(gè)點(diǎn)的U,V分量是保存在一起的.這幾個(gè)點(diǎn)合起來稱為macro-pixel剧防, 這種存儲(chǔ)格式稱為Packed(打包)格式植锉。對(duì)于planar的YUV格式,先連續(xù)存儲(chǔ)所有像素點(diǎn)的Y峭拘,緊接著存儲(chǔ)所有像素點(diǎn)的U俊庇,隨后是所有像素點(diǎn)的V。
packed:對(duì)于packed的YUV格式鸡挠,每個(gè)像素點(diǎn)的Y,U,V是連續(xù)交*存儲(chǔ)的
YUV420p:又叫planer平面模式辉饱,Y ,U拣展,V分別再不同平面彭沼,也就是有三個(gè)平面。
I420:又叫YU12备埃,安卓的模式溜腐。存儲(chǔ)順序是先存Y,再存U瓜喇,最后存V。YYYYUUUVVV
YV12:存儲(chǔ)順序是先存Y歉糜,再存V乘寒,最后存U。YYYVVVUUU
YUV420sp:又叫bi-planer或two-planer雙平面匪补,Y一個(gè)平面伞辛,UV在同一個(gè)平面交叉存儲(chǔ)
NV12:IOS只有這一種模式烂翰。存儲(chǔ)順序是先存Y,再UV交替存儲(chǔ)蚤氏。YYYYUVUVUV
NV21:安卓的模式甘耿。存儲(chǔ)順序是先存Y,再存U竿滨,再VU交替存儲(chǔ)佳恬。YYYYVUVUVU
YCbCr :
YCbCr 則是在世界數(shù)字組織視頻標(biāo)準(zhǔn)研制過程中作為ITU - R BT.601 建議的一部分,其實(shí)是YUV經(jīng)過縮放和偏移的翻版于游。其中Y與YUV 中的Y含義一致,Cb,Cr 同樣都指色彩毁葱,只是在表示方法上不同而已。在YUV 家族中贰剥,YCbCr 是在計(jì)算機(jī)系統(tǒng)中應(yīng)用最多的成員倾剿,其應(yīng)用領(lǐng)域很廣泛,YCbCr 有許多取樣格式,如4∶4∶4,4∶2∶2,4∶1∶1 和4∶2∶0蚌成。
可以參考如下表格:
yuv.png
最后我們經(jīng)城岸唬看到的Android或者IOS攝像頭采集到的NV12或者NV21數(shù)據(jù),其實(shí)本質(zhì)上是YUV担忧,只不過是由Intel創(chuàng)造的格式芹缔,與RGB轉(zhuǎn)換是類似的。
總結(jié):因?yàn)轭伾梢酝ㄟ^不同方式來拆解涵妥,所以出現(xiàn)了不同的顏色編碼方式乖菱。RGB通過R,G,B三個(gè)分量來分解,YUV通過Y和UV三個(gè)分量來分解蓬网。RGB來自于顏色發(fā)光原理窒所,而YUV主要用于優(yōu)化顏色視頻信號(hào)的傳輸,優(yōu)點(diǎn)在于占用寬帶少以及更符合人類視覺系統(tǒng)觀感