YUV420sp 形式の画像のサイズを変更 (縮小) しようとしています。RGBに変換せずに、YUV420spピクセル配列を直接操作して、そのような画像のサイズ変更を行うことは可能ですか? そのようなアルゴリズムはどこにありますか?
ありがとう
YUV420sp 形式の画像のサイズを変更 (縮小) しようとしています。RGBに変換せずに、YUV420spピクセル配列を直接操作して、そのような画像のサイズ変更を行うことは可能ですか? そのようなアルゴリズムはどこにありますか?
ありがとう
YUV 4:2:0 平面は次のようになります。
----------------------
| Y | Cb|Cr |
----------------------
どこ:
Y = width x height pixels
Cb = Y / 4 pixels
Cr = Y / 4 pixels
Total num pixels (bytes) = width * height * 3 / 2
サブサンプリングは次のように使用されます。
これは、各クロマ ピクセル値が 4 つのルマ ピクセル間で共有されることを意味します。
1 つのアプローチは、対応する Y-Cb-Cr 関係が保持/再計算されるように、ピクセルを削除することです。
Nearest-neighbor 補間に近いものですが、逆になっています。
もう 1 つの方法は、最初に 4:2:0 サブサンプリングを 4:4:4 に変換することです。
ここでは、輝度データと彩度データが 1 対 1 でマッピングされています。
これは、4:2:0 と 4:2:2 の間で彩度を補間する正しい方法です (輝度は既に正しい解像度になっています) Python のコード、c-dito の html-link に従ってください。コードはあまり Pythonic ではなく、C バージョンを直接翻訳しただけです。
def __conv420to422(self, src, dst):
"""
420 to 422 - vertical 1:2 interpolation filter
Bit-exact with
http://www.mpeg.org/MPEG/video/mssg-free-mpeg-software.html
"""
w = self.width >> 1
h = self.height >> 1
for i in xrange(w):
for j in xrange(h):
j2 = j << 1
jm3 = 0 if (j<3) else j-3
jm2 = 0 if (j<2) else j-2
jm1 = 0 if (j<1) else j-1
jp1 = j+1 if (j<h-1) else h-1
jp2 = j+2 if (j<h-2) else h-1
jp3 = j+3 if (j<h-3) else h-1
pel = (3*src[i+w*jm3]
-16*src[i+w*jm2]
+67*src[i+w*jm1]
+227*src[i+w*j]
-32*src[i+w*jp1]
+7*src[i+w*jp2]+128)>>8
dst[i+w*j2] = pel if pel > 0 else 0
dst[i+w*j2] = pel if pel < 255 else 255
pel = (3*src[i+w*jp3]
-16*src[i+w*jp2]
+67*src[i+w*jp1]
+227*src[i+w*j]
-32*src[i+w*jm1]
+7*src[i+w*jm2]+128)>>8
dst[i+w*(j2+1)] = pel if pel > 0 else 0
dst[i+w*(j2+1)] = pel if pel < 255 else 255
return dst
これを 2 回実行すると、4:4:4 になります。次に、行と列を削除するだけです。
または、クロマ ピクセルを 4 倍にして 4:2:0 から 4:4:4 に変更し、行と列を削除してから、4 つの Cb/Cr 値を 1 に平均して、再び 4:2:0 に戻すことができます。すべては、どれだけ厳密にする必要があるかによって異なります:-)
YUV420sp では、1 つのプレーンに Y があり、別のプレーンに U&V があります。U&V を別々のプレーンに分割すると、最初に 4:2:0 -> 4:4:4 に移動することなく、3 つのプレーンのそれぞれで同じスケーリング操作を順番に実行できます。
libyuv のソース コードを見てください。平面をスケーリングするだけです: https://code.google.com/p/libyuv/source/browse/trunk/source/scale.cc