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を指定しなかった時、つまり、
と記述した時と同じです。
ところで、マニュアルを見ると、
とあります。
つまり、どの程度overlay_clipを加算するかは、levelの値だけではなく、アルファチャンネル(マスク)の値も関わってくるということになります。
(つづく)
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の場合。
例えば、このように指定します。
すると・・・

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

何だかすごいことになっていますが・・・overlay_clipの色が引かれ(subtract)て、反転(invert)しています。
これはInvertフィルタを使った場合の結果と似ています(ていうか一緒?)。
ためしに、Invertフィルタを使ってみると・・・

似てます、似てます。
ただし、この場合、合成済みのクリップ全体にInvertがかかっているため、背景の黒色も反転して白くなっています。
さっさと次に進みたいところですが、一応、「スクリプト入門」的要素も兼ねているので、もう少し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の色空間は、
非圧縮RGB24です。
では、BlankClipで作成したクリップ(bg)の方は、どうでしょうか。
今回は、Infoフィルタを使って調べてみましょう。
Infoフィルタは、AviSynth 2.5から登場したフィルタです。
その名の通り、クリップのInfo(情報)を表示します。
前回のスクリプトを少しいじってみました。
Layerの先頭に#を付けてコメントアウトし、Infoフィルタの引数にbgを指定して使っています。
もっと簡単に

このスクリプトをVirtualDubModで開いたところです。
2行目を見てください。
imgがRGB24、bgがRGB32だとわかりました。
あとは、どちらか一方、もしくは両方の色空間を変換して、同じ色空間にすればいいということになります。
ただし、Layerフィルタが対応している色空間は、RGB32とYUY2だけです。
ここでは、imgの色空間を変換して、RGB32にすることにします。
あとで登場するColorKeyMaskというフィルタがRGB32にしか対応していないからです。

[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の書式は、次の通りです。
何だか、よくわからない引数もありますが(汗)、base_clipに背景、overlay_clipに画像という感じで、何とかなりそうな予感がします。
とりあえず、次のように書いてみました。
画像をimg、背景をbg、それぞれ変数に代入しています。
変数を使わないで、スクリプトを書くと・・・
と、ちょっとごちゃごちゃしてて見づらいので、変数を使うことにしました。
このスクリプトを、VirtualDubModで読み込んでみます。

エラーが出ちゃいました。
エラーメッセージを訳すと、「画像のフォーマットが合致しません」。
そういえば、画像クリップのファイル情報については確認していましたが、背景クリップについてはチェックしていませんでした。
少し遠回りになりますが、Layerフィルタの話はいったん置いておいて、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つのクリップの情報を確認することにしましょう。



