次の式を使用して、RGBマトリックスをYUVマトリックスに変換しました。
Y = (0.257 * R) + (0.504 * G) + (0.098 * B) + 16
Cr = V = (0.439 * R) - (0.368 * G) - (0.071 * B) + 128
Cb = U = -(0.148 * R) - (0.291 * G) + (0.439 * B) + 128
次に、マトリックスで4:2:0クロマサブサンプルを実行しました。私はこれを正しく行ったと思います。YUVマトリックスから2x2の部分行列を取得し、値を最小から最大の順に並べ、中央の2つの値の平均を取得しました。
次に、ウィキペディアの次の式を使用して、Y、U、およびV平面にアクセスしました。
size.total = size.width * size.height;
y = yuv[position.y * size.width + position.x];
u = yuv[(position.y / 2) * (size.width / 2) + (position.x / 2) + size.total];
v = yuv[(position.y / 2) * (size.width / 2) + (position.x / 2) + size.total + (size.total / 4)];
私はOpenCVを使用しているので、これを可能な限り解釈しようとしました。
y = src.data[(i*channels)+(j*step)];
u = src.data[(j%4)*step + ((i%2)*channels+1) + max];
v = src.data[(j%4)*step + ((i%2)*channels+2) + max + (max%4)];
srcはYUVサブサンプリングされた行列です。私はその式を正しく解釈しましたか?
これが私が色をRGBに戻す方法です:
bgr.data[(i*channels)+(j*step)] = (1.164 * (y - 16)) + (2.018 * (u - 128)); // B
bgr.data[(i*channels+1)+(j*step)] = (1.164 * (y - 16)) - (0.813 * (v - 128)) - (0.391 * (u - 128)); // G
bgr.data[(i*channels+2)+(j*step)] = (1.164 * (y - 16)) + (1.596 * (v - 128)); // R
問題は、私の画像が元の色に戻らないことです。
参考用の画像は次のとおりです。http: //i.stack.imgur.com/vQkpT.jpg(サブサンプル) http://i.stack.imgur.com/Oucc5.jpg(出力)
YUV444からRGBに変換する必要があるようですが、Wikiで見つけたサンプルでクリップ関数が何をするのかよくわかりません。
C = Y' − 16
D = U − 128
E = V − 128
R = clip(( 298 * C + 409 * E + 128) >> 8)
G = clip(( 298 * C - 100 * D - 208 * E + 128) >> 8)
B = clip(( 298 * C + 516 * D + 128) >> 8)
>>は、ビットをシフトする必要があることを意味しますか?
ヘルプ/コメントをいただければ幸いです。ありがとう
アップデート
YUV444変換を試みましたが、画像が緑の色合いで表示されました。
y = src.data[(i*channels)+(j*step)];
u = src.data[(j%4)*step + ((i%2)*channels+1) + max];
v = src.data[(j%4)*step + ((i%2)*channels+2) + max + (max%4)];
c = y - 16;
d = u - 128;
e = v - 128;
bgr.data[(i*channels+2)+(j*step)] = clip((298*c + 409*e + 128)/256);
bgr.data[(i*channels+1)+(j*step)] = clip((298*c - 100*d - 208*e + 128)/256);
bgr.data[(i*channels)+(j*step)] = clip((298*c + 516*d + 128)/256);
そして私のクリップ関数:int clip(double value){return(value> 255)?255 :(値<0)?0:値; }