我正在玩弄一些不同的圖像格式,並遇到了我發現奇怪的東西。當從RGB轉換到YCbCr然後再轉換到RGB時,結果與我開始的結果非常相似(像素值的差值幾乎總是小於4)。但是,當我從YCbCr轉換爲RGB,然後再轉換回YCbCr時,我經常會得到截然不同的值。有時候數值會超過40個。正在將YCbCr轉換爲RGB可逆?
我不確定這是爲什麼。我的印象是,可以通過YCbCr表達的顏色是RGB中的顏色的一部分,但看起來這是完全錯誤的。 YCbCr中是否有一些已知的顏色子集可以轉換爲RGB然後回到原始值?
我使用的是要轉換的代碼(基於this site):
def yuv2rgb(yuv):
ret = []
for rows in yuv:
row = []
for y, u, v in rows:
c = y - 16
d = u - 128
e = v - 128
r = clamp(1.164*c + 1.596*e, 16, 235)
g = clamp(1.164*c - 0.392*d - 0.813*e, 16, 240)
b = clamp(1.164*c + 2.017*d , 16, 240)
row.append([r, g, b])
ret.append(row)
return ret
def rgb2yuv(rgb):
ret = []
for rows in rgb:
row = []
for r, g, b in rows:
y = int(0.257*r + 0.504*g + 0.098*b + 16)
u = int(-0.148*r - 0.291*g + 0.439*b + 128)
v = int(0.439*r - 0.368*g - 0.071*b + 128)
row.append([y, u, v])
ret.append(row)
return ret
編輯:
我創造了這個問題的一個基本的3D圖形。所有的點都是小於10的點。它形成了一個非常有趣的形狀。 X是CB,Y是Cr和Z是Y.
你已經在你的'yuv2rgb'計算中使用'y'而不是'C'。我沒有測試過,所以我不知道這是否是問題的嚴重程度。 – beaker