お知らせ: にーやんのブログ 2 に移転しました。こちらのブログは、2009 年末までに削除します。

スポンサード リンク

Project N: 010-Layer part3

次にop="add"を試してみます。

addは、その名の通り、base_clipにoverlay_clipを付け加える(add)します。
その際、level(0から255まで)で指定した値に応じて、base_clipとoverlay_clipを掛け合わせたものをaddします。


level=0


level=128


level=255

上から順に、それぞれlevel=0, 128, 255の3つの場合のサンプル画像です。

level=128は、op="fast"の場合と同じように、bgとimgが半分ずつブレンドされているようです。

level=255は、opを指定しなかった時、つまり、

Layer(bg, img)

と記述した時と同じです。

ところで、マニュアルを見ると、

in RGB32 the alpha-channel of the overlay_clip is multiplied with level, so the resulting alpha = (alpha_mask * level) / 256.
(RGB32では、overlay_clipのアルファチャンネルはlevelで掛け合わされ、最終的なalphaは(alpha_mask * level) / 256になる。)

とあります。

つまり、どの程度overlay_clipを加算するかは、levelの値だけではなく、アルファチャンネル(マスク)の値も関わってくるということになります。

(つづく)

Project N: 009-Layer part2

無事、背景と画像の合成に成功しました(とりあえず)。
さっさと次に進みたいところですが、一応、「スクリプト入門」的要素も兼ねているので、もう少しLayerについて話をしたいと思います。

こちらのエントリでLayerフィルタのパラメータを紹介しました。
このうち、opは合成方法を指定するものでした。

まず、fastの場合。

Layer(bg, img, "fast")

例えば、このように指定します。
すると・・・



背景と画像が半分ずつブレンド(平均化)されています。
これがfastです。

次にsubtractを試してみます。

Layer(bg, img, "subtract")



何だかすごいことになっていますが・・・overlay_clipの色が引かれ(subtract)て、反転(invert)しています。

これはInvertフィルタを使った場合の結果と似ています(ていうか一緒?)。

Layer(bg, img)
Invert()

ためしに、Invertフィルタを使ってみると・・・



似てます、似てます。
ただし、この場合、合成済みのクリップ全体にInvertがかかっているため、背景の黒色も反転して白くなっています。

Project N: 008-Convert(色空間の変換)

(前回までのおさらい)
画像ファイル(img)がRGB24、背景の黒ベタクリップ(bg)がRGB32だと判明。
Layerで合成するためにはカラーフォーマットを統一する必要があるとわかった、にーやん
さて、どうする?

というわけで、にーやんです。
オリンピックもそろそろ終わりなので、徐々にブログも再開していきます。

さて、前回の最後に書いたとおり、imgの方をRGB32に変換します。
これは、後々、紹介するフィルタがRGB32(とYUY2)に対応しているからでした。

色空間の変換には、Convertフィルタを使います。

Convertフィルタには、以下の6つがあります(AviSynth2.5.4)。

ConvertToRGB(clip clip [, string matrix] [, boolean interlaced])
ConvertToRGB24(clip clip [, string matrix] [, boolean interlaced])
ConvertToRGB32(clip clip [, string matrix] [, boolean interlaced])
ConvertToYUY2(clip clip [, boolean interlaced])
ConvertToYV12(clip clip [, boolean interlaced])
ConvertBackToYUY2(clip clip)

「ConvertTo*」の*の部分が、変換したい色空間のものを使います(※)。
ですから、ここでは、ConvertToRGB32フィルタを使えばいいことになります。

ConvertToRGB32(clip clip [, string matrix] [, boolean interlaced])

  • Convertフィルタの引数
  • matrix: HDTVソースをYUVからRGBへ変換する場合にのみ、「matrix = "rec709"」と指定します。
  • interlaced: trueでインターレース・クリップと、falseでプログレッシブ・クリップと仮定する。デフォルトはfalse。

オプションでmatrixとinterlacedの2つの引数を指定することもできますが、この場合、必要ないので省略します。

imgだけ変換すればいいので・・・

img = ConvertToRGB32(img)

の一行を追加すればOKです。

修正後のスクリプトは、次のようになりました。

img = ImageReader("C:\My Documents\nyatrix\img\nyatrix.png", 0, 0, 24, false)
img = ConvertToRGB32(img)
bg = BlankClip()
Layer(bg, img)

Layerフィルタを、再び、有効にしています。



VirtualDubModで開くと、ちゃんと合成できました。


※ConvertToRGBは、クリップがRGB24でない場合にRGB32に変換します。ConvertBackToYUY2は、YUY2->RGB変換の後にYUY2に戻す場合に使うと、変換誤差を少なくすることができます。

Project N: 007-Info(ファイル情報の表示)

ImageReaderで読み込んだ画像(img)については、こちらでVirtualDub(Mod)の[File]->[File Information]からファイル情報を確認していました。


[File Information]のスクリーンショットが、これです。

imgの色空間は、
Uncompressed RGB24
となっています。
非圧縮RGB24です。

では、BlankClipで作成したクリップ(bg)の方は、どうでしょうか。
今回は、Infoフィルタを使って調べてみましょう。

Infoフィルタは、AviSynth 2.5から登場したフィルタです。
その名の通り、クリップのInfo(情報)を表示します。

img = ImageReader("C:\My Documents\nyatrix\img\nyatrix.png", 0, 0, 24, false)
bg = BlankClip()
#Layer(bg, img)
Info(bg)

前回のスクリプトを少しいじってみました。
Layerの先頭に#を付けてコメントアウトし、Infoフィルタの引数にbgを指定して使っています。

もっと簡単に
BlankClip()
Info()
としても構いません。


このスクリプトをVirtualDubModで開いたところです。

2行目を見てください。

ColorSpace: RGB32
となっています。

imgがRGB24、bgがRGB32だとわかりました。
あとは、どちらか一方、もしくは両方の色空間を変換して、同じ色空間にすればいいということになります。

ただし、Layerフィルタが対応している色空間は、RGB32とYUY2だけです。

ここでは、imgの色空間を変換して、RGB32にすることにします。
あとで登場するColorKeyMaskというフィルタがRGB32にしか対応していないからです。

Project N: 006-Layer(1)

ImageReader(ImageSource)で読み込んだ画像のクリップと、BlankClipで作成したべた塗りの背景クリップの2つができました。

今度は、これを合成してみましょう。背景の上に、画像を重ねます。

ここでは、Layerフィルタを使って、2つのクリップを合成します。
Overlayというフィルタでも合成することはできますが、こちらは2.5.4から導入された比較的新しいフィルタということで、今回はLayerを使うことにします。

Layerの書式は、次の通りです。

Layer(clip base_clip, clip overlay_clip, string op, int level, int x, int y, int threshold, bool use_chroma)

  • base_clip: 背景のクリップ
  • overlay_clip: base_clipの上に重ねるクリップ
  • op: 合成方法("add", "subtract", "fast", "lighten", "darken", "mul")
  • level: opのレベル(0: 背景そのまま, 255: 最高レベル)
  • x, y: overlay_clipの位置
  • threshold: "lighten"と"darken"のしきい値
  • use_chroma: overlay_clipの色差を使うかどうかの選択

何だか、よくわからない引数もありますが(汗)、base_clipに背景、overlay_clipに画像という感じで、何とかなりそうな予感がします。

とりあえず、次のように書いてみました。

img = ImageReader("C:\My Documents\nyatrix\img\nyatrix.png", 0, 0, 24, false)
bg = BlankClip()
Layer(bg, img)

画像をimg、背景をbg、それぞれ変数に代入しています。
変数を使わないで、スクリプトを書くと・・・

Layer(ImageReader("C:\My Documents\nyatrix\img\nyatrix.png", 0, 0, 24, false), BlankClip())

と、ちょっとごちゃごちゃしてて見づらいので、変数を使うことにしました。

このスクリプトを、VirtualDubModで読み込んでみます。



エラーが出ちゃいました。

image formats don't match

エラーメッセージを訳すと、「画像のフォーマットが合致しません」。

そういえば、画像クリップのファイル情報については確認していましたが、背景クリップについてはチェックしていませんでした。

少し遠回りになりますが、Layerフィルタの話はいったん置いておいて、2つのクリップの情報を確認することにしましょう。

Page 4 of 5: « 1 2 3 4 5