【AviUtl】getpixelとputpixelでYCbCrを扱うときの覚書【スクリプト作成者用】

20160614003554
(左側がYCbCrで躓いたもの、右側が元々の画像)

 

オブジェクトの色を取得するobj.getpixel、オブジェクトの色を置き換えるobj.putpixel。普段はobj.getpixelを使って『col,a』で取得して、加工した値をobj.putpixelに放り込む形で使っていたけど、『y,cb,cr,a』で使おうとしたら躓いたのでそのときの覚書。

 

ちなみにYCbCrとは……

YUVやYCbCrやYPbPrとは、輝度信号Yと、2つの色差信号を使って表現される色空間。

引用元:YUV - Wikipedia

Cbは信号B(青)から輝度Yを引き、定数をかけたもの。Crは信号R(赤)から輝度Yを引き、定数をかけたもの。

 

“col”以外のTypeで使用するときは指定が必要

20160614005707

『col』を取得するとき(成功)

col, a = obj.getpixel(x, y, “col”)
(ここで加工)
obj.putpixel(x, y, col, a)

 

『YCbCr』を取得するとき(失敗)

y, cb, cr, a = obj.getpixel(x0, y0, “yc”)
(ここで加工)
obj.putpixel(x0, y0, y, cb, cr, a)

 

『YCbCr』を取得するとき(成功)

y, cb, cr, a = obj.getpixel(x0, y0, “yc”)
(ここで加工)
obj.pixeloption(“type”, “yc”)
obj.putpixel(x0, y0, y, cb, cr, a)

 

 

違いは見ての通り、obj.pixeloptionでタイプの指定をしているか否か。標準仕様?の『col』で置き換える場合には必要なかったけれど、『col』以外で置き換える場合には必要になるっぽい。

指定しない場合は色情報が壊れた感じで出力されるので、基本的には……

 

obj.pixeloption(“type”, “yc”)
obj.putpixel(x0, y0, y, cb, cr, a)

 

これで1セットだと覚えておいたほうが良いということ。あるときは『col』で、あるときは『rgb』で、またあるときは『ycbcr』で……と書き出したいときなどは、obj.pixeloptionのタイプを適時、適切なものに切り替えてやる。

 

 

『rgb』を取得するとき(成功)

r, g, b, a = obj.getpixel(x, y, “rgb”)
(ここで加工)
obj.pixeloption(“type”, “rgb”)
obj.putpixel(x, y, r, g, b, a)

 

『YCbCr』のAviUtlでの値の範囲

20160614005221(左側がCrの値を下げたもの、右側がCbの値を下げたもの)

 

  • Yは0~4096までの整数。
  • CbとCrは-2048~2047までの整数。
  • A(透明度)は0~4096までの整数。

 

※ 念の為にobj.getpixel(x, y, “yc”)で取得したY,Cb,Cr,Aを確認したほうがいいかも……。

※ あくまでも、getpixelとputpixelでの範囲。

処理の軽重について

obj.pixeloptionによる指定でYCbCrも使えるようになるけれど、getpixelもputpixelも、スクリプト制御の中で使うと酷く処理が重いので、小さめのオブジェクトに使うか、Dllにして使用したほうが無難。

 

 

 

関連記事
スポンサーサイト

0 Comments

Post a comment