Viveのメディアデコーダーの修理および式導出

問題を修復するために、昨日アイスはViveのメディアデコーダーのMP4画像の色が間違って解決して、ブログを書きました。

https://gameoldboy.com/488/

 

ビットを読んで、私はその妥当性を判断するために再び番号を付けなければ好きなので、いくつかの追加の説明が、あります。

 

これらの式の主な内容

全範囲に再マップYCbCrの0〜255 
Y =(255 /(235 - 16))*(Y- 16 
CB =(255 /(240 - 16))*(CB- 16 
のCr =(255 / (240 - 16))*(CR- 16 

:uとvの範囲に係るYUV(整数)のYCbCrにマッピングされる
Y = Yの
U = 0.872 *(CB- 128 
、V = 1.230 *(CR- 128を

行列の外積のアプリケーションが展開:
R&LT = Y +1.28033 * V 
G = Y- 0.21482 * U- 0.38059 * V 
B = Y + 2.12798 * Uの

積分式:
R&LT =(255 /(235 - 16))*(Y- 16)+(255 /(240 - 16)) * 1.28033 *(1.230 *(CB- 128 ))
G =(255 /(235 - 16))*(Y- 16) - (255 /(240 - 16))*0.21482 *(0.872 *(CR- 128)) - (255 /(240 - 16))* 0.38059 *(1.230 *(CB- 128 ))
、B =(255 /(235 - 16))*(Y- 16) +(255 /(240 - 16))* 2.12798 *(0.872 *(CR- 128))

これらの式に対応しており、RGB888形式です

Y = Y 
、U = 0.872 *(CB- 128 
、V = 1.230 *(CR- 128

この要因の原点はここにあります

https://en.wikipedia.org/wiki/YUV#Numerical_approximations

 

 

即ち

UMAX = 0.436 
VMAX = 0.615 
、Y = [ 01 ] 
U = [ - UMAX、UMAX] 
V = [ - VMAX、VMAX] 
rangeY = 1 - 0 = 1 
rangeU = UMAX - (-umax)= 2 * UMAX = 0.872 
rangeV = VMAX - (-Vmax)= 2 * VMAX = 1.230

 

YUVターンRGB、アプリケーションBT.709行列

マトリックスクロス積のアプリケーションが展開:
R&LT = Y + 1.28033 * V 
G = Y- 0.21482 * U- 0.38059 * V 
B = Y + 2.12798 * U

 

 

R = 1つの * yを+ 0 * U + 1.28033 *のV 
G = 1 * yを- 0.21482 * Uは- 0.38059 * のV 
B = 1 *のY + 2.12798 * U + 0 *のV

 

そして、単純な算術拡大と統合があります

r=(255/(235-16))*(y-16)+(255/(240-16))*1.28033*(1.230*(cb-128))
g=(255/(235-16))*(y-16)-(255/(240-16))*0.21482*(0.872*(cr-128))-(255/(240-16))*0.38059*(1.230*(cb-128))
b=(255/(235-16))*(y-16)+(255/(240-16))*2.12798*(0.872*(cr-128))

定义个变量简化一下

float facY = (255/(235-16)) = 1.1643835616438356164383561643836
float facCBCR = (255/(240-16)) = 1.1383928571428571428571428571429

于是上式可以写为

r = facY * (y-16) + facCBCR * 1.28033 * (1.230*(cb-128))
g = facY * (y-16) - facCBCR * 0.21482 * (0.872*(cr-128)) - facCBCR * 0.38059 * (1.230*(cb-128))
b = facY * (y-16) + facCBCR*  2.12798 * (0.872*(cr-128))

 

因为目前是RGB888,范围是[0-255],变成Shader范围是[0,1],所以

y-16要变成y-0.0627451

cb-128要变成cb-0.5019608

因为

16/255 = 0.062745098039215686274509803921569 约 0.0627451
128/255 = 0.50196078431372549019607843137255 约 0.5019608
 

接着替换

r = facY * (y-0.0627451) + facCBCR * 1.28033 * (1.230*(cb-0.5019608))
g = facY * (y-0.0627451) - facCBCR * 0.21482 * (0.872*(cr-0.5019608)) - facCBCR * 0.38059 * (1.230*(cb-0.5019608))
b = facY * (y-0.0627451) + facCBCR * 2.12798 * (0.872*(cr-0.5019608))

合并常量

facCBCR * 1.28033 * 1.230 = 1.792748
facCBCR * 0.21482 * 0.872 = 0.2132472
facCBCR * 0.38059 * 1.230 = 0.5329109
facCBCR*  2.12798 * 0.872 = 2.1124

 

最后rgb结果近似为

r = 1.164384 * (y-0.0627451) + 1.792748 * (cb-0.5019608)
g = 1.164384 * (y-0.0627451) - 0.2132472 * (cr-0.5019608) - 0.5329109 * (cb-0.5019608)
b = 1.164384 * (y-0.0627451) + 2.1124 * (cr-0.5019608)

 

おすすめ

転載: www.cnblogs.com/kileyi/p/10991897.html