2018/09

PeloReaper Extensionの情報やダウンロードはこちらからどうぞ。
PeloReaper Extension for REAPER is here.
ReaperBanner01_w250 AudioSoftBanner01_w250

REAPERで動画編集 (9) : VideoProcessor : 画像処理(輪郭線再び)

前回に続き、VideoProcessorによる画像処理を取り上げます。
輪郭線抽出の方法の1つはすでに標準のプリセット[Edge detection (vertical)]を紹介しましたが、これは横方向の差分から縦線を優先的に抽出する方法でした。

今回は上下左右の4近傍ピクセルを使ったラプラシアンフィルタを実装してみたいところですが、これには注目ピクセルの近傍(3x3)にアクセス出来る必要があります。gfx_evalrect()ではこの範囲のピクセルを直接参照することが難しいため、これで実装するのは結構面倒なことになりそうな気がします。

フィルタリングの実装

無理矢理なんとかする方法はいくつかありそうですが、ここではgfx_blit()とブレンドモードを使って処理する方法を紹介します。

作成したスクリプトはこちら。※重いので画像サイズの大きい動画にはご遠慮くださいw

ラプラシアンの4近傍カーネルは
| 0  1 0 |
| 1 -4 1 |
| 0  1 0 |
なので、普通はピクセル毎に畳み込みを行っていくのですが、今回の方法はこれをgfx_blit()で重ねて描画することで実現します。手順はだいたい以下のような感じ。
  1. 背景を黒で塗りつぶす
  2. カーネルの1のところを4回重ねたいので、画像の値を1/4に潰す(α=1/4)
    (重ねる画像バッファの各チャンネルは8bitなので、そこに収まるように1/4スケールで計算)
  3. BlendMode=1(加算)にする
  4. 注目ピクセル位置に、カーネルに対応した1ピクセルずれた位置が重なるように描画(4近傍分)
  5. 注目ピクセルを最後に重ねるため、α=-4にして描画
画像の階調を1/4に圧縮して重ねる計算なので精度が落ちますが、はっきりとした境界の部分を検出するくらいには使えそうです。8近傍で重ねるように実装すれば結構いろいろなフィルタカーネルが使えるようになりますが、更に精度が悪くなります(精度が悪すぎるので色が破綻するかも)。
あと、これだけだと画像の端1ピクセル分のところがおかしくなったり、値の範囲チェックなども省略してるのでもろもろ雑だったりします。まぁ効果を見る程度のものということで。

で、実際に処理してみた結果がこちら。
VP_Lap01-0
 ↓ 効果を適用
VP_Lap01

VP_Lap02-0
 ↓ 効果を適用
VP_Lap02

この手法もどこで覚えたのか忘れてしまいましたが、現在のようなピクセルシェーダなんてものがなかった頃のGPUでこういったフィルタを作る時に、重ねてポリゴン描画するだけで高速に処理する方法だったような違うような・・・?
まぁこんなところで役に立つとは思いもしませんでした。

もはや自分はDAWで一体何をやっているんだ?という気分になってきましたが、まぁ楽しめているのでいいかな。

REAPERで動画編集 (8) : VideoProcessor : 画像処理(色変換)

VideoProcessor(以下VP)のAPIには描画した画像に対して色変換を行えるものがあります。
とはいえドキュメントを読んでもよく分からないところだらけなのですが、おそらくこうなんじゃないかと分かった(つもり)の部分だけでも書いておこうと思います。

チャンネルカラーテーブルによる色変換

使用するAPIは gfx_procrect() です。
色のチャンネル毎に256個の値のテーブルで3チャンネル分、つまり256 x 3 = 768 個の値(0.0~1.0)を用意して、描画済みの色の値(0~255)をチャンネル毎のインデックスとしてこの配列を参照し変換を行うようです。
各チャンネルは現在のcolorspaceに対応したものを使用(RGBAならR・G・B)。
テーブル内の色の配置は、R0, R1, ... R255, G0, G1, ... G255, B0, B1, ... B255 という感じでしょうか。

下図の例はRGBで色を変えないテーブルを作って使用しているものです。
VP_Procrect01

各色の値の値域は[0, 1]なので、RGBテーブルにvをセットしているところをそれぞれ1-vにしてやると、色が反転します。
VP_Procrect02
これが、
VP_Procrect03
こうなる感じ。

スクリプト適用による色変換

テーブルによる色変換では出来ないような色の変化、例えばフィルタなどの画像処理的なことをやりたい場合もあるかと思いますが、これもある程度は出来るようになっています。
使うAPIは gfx_evalrect() で、これには各画素単位(厳密にはピクセルフォーマットで扱える単位でのアクセスになる)で処理するスクリプトテキストを渡すというものになっています。
なんとなく雰囲気はピクセルシェーダーみたいな感じですね。

ただし隣接ピクセルへのアクセス方法がないようで、シーケンシャルに前に処理したピクセルを保存しておくことで代用するしかないようです(つまり現在の注目位置より先にあるピクセルは読みだせない)。
また、ドキュメントを見るとマルチスレッドで動きそうな切り替えフラグがあるのですが、切り替えても何も変わらないので動作はシングルスレッド固定の模様。

さらに、自分の環境だとcolorspace='RGBA'にして処理しようとすると、動画の大きさによってはかなりCPUを食ってしまい、プレビュー再生時に処理が間に合わないくらいになってしまいました。YV12→RGBA→YV12の全ピクセル変換が入ってしまうからなんですかね? ということで、このAPIを使う時はYV12のまま処理するのがいいかと思います。
(ちなみに動画ファイルにレンダリングすれば、処理負荷ぶっちぎっていようが問題なく画像処理された結果が出るようなので、プレビュー時は諦めてOFFにしておいてレンダリングにだけ使うという逃げ方もなくはないです。面倒ですが。)

YV12の際は、色の保持が2x2ピクセルのブロック単位となるため、1回のスクリプト処理ではこの4ピクセルを処理する必要があります。画像の情報は4ピクセル分の輝度値(y1, y2, y3, y4)と色(u, v)に現在の値が渡されてくるので、これらを新しい値で書き替えてやれば実際の色が変わるという仕組みです。

とりあえず簡単な使い方を示したコード例がこちら。
ピクセル毎に実行するスクリプトが code 変数(文字列)です。
※このcodeという名前である必要はありません
VP_EvalRect06
実行結果がこんな感じ
(やってること:1ピクセル行毎に黒線、グレースケール)
VP_EvalRect05

あまり解説することもないのですが、y1~y4、u,vのどの値を変えるとどうなるか見てみると分かりやすそうなので、後で自分で実際に簡単な処理を作ってみると理解が深まるのではないかと思います。ここではいくつか例を示しておきますね。

例えば、y1=y2=0かy3=y4=0 にしてやると、1行毎に黒い線が入ります。
VP_EvalRect01

同様に y1=y3=0 にすると縦線が入ります。
VP_EvalRect02

y1=y4=0 にすると網状に。
VP_EvalRect03

色相についても例えば u=v=128 固定にしてやるとグレースケールに変えるといったこともできます。
VP_EvalRect04

このようにYV12であれば2x2の4ピクセルにアクセスできるので、例えば簡単なフィルタを実装することが可能になってきます。VPのプリセットにある[Edge detection (vertical)]がまさしくこの用途のいいサンプルプログラムになっているので、参考にしてみて下さい。
VP_Preset14
 ↑ Edge detection (vertical) 適用例


今回はピクセル単位で色をコントロールする方法について紹介しました。
gfx_evalrect() はピクセル単位でスクリプトを実行するため、かなり重くなる傾向があるので多用は禁物ですが、思い通りのことをやるための最終手段として覚えておくといいかもしれません。
まぁピクセル単位にスクリプトってのがそもそも処理速度的に無茶なんで、そのうちVPがOpenFXとかに対応になったらいいなー。

REAPERで動画編集 (7) : VideoProcessor : テキスト表示を改造してみる

ここからはVideoProcessor(以下VP)のプリセットを改造したり独自に作ったりしていきたいと思います。VPのプログラミングに関する内容も少しずつ出てきます。

テキスト表示の改良版

VPのプリセットにあった[Title text overlay]を改良して、いくつか機能を追加してみました。
  • テキスト色、背景矩形色指定(RGBA)
  • テキストの後ろに影表示
  • 背景矩形を右側ほど薄くする
VP_TextEx02

プリセットのソースコードはこちらに置いてあります。後述のプリセット登録方法を参考にして、ご自分のREAPERのVPに登録して使ってみて下さい。

VP_TextEx03-2
元の[Title text overlay]と違うのは色指定がRGBAになったのと、[bg fade], [text shadow]あたりの切替スイッチ(0,1しか値をとらない)が追加されている部分です。

プリセットの登録方法

自分用にプリセットを新しく登録する方法を書いておきます。どこかでVPのスクリプトソースをゲットしたらこの方法でプリセット登録しておけば、後で呼び出すことが出来るようになります。
  1. 新規でVideoProcessorをトラックなどに挿す
  2. スクリプトエディタは空になっているはずなので、そこにスクリプトソースを貼り付ける
  3. エディタ上でCtrl+S(スクリプト適用。ノブなどが表示される)
  4. FXウィンドウのプリセットの右側にある[+]ボタンで[Save preset...]
  5. 任意の名前を付けてOKボタンでプリセットが保存されます
実際に登録してみると、プリセットのリストに追加されます(User Presets以下のところ)。
VP_TextEx04

プログラムに関してのメモ書き

テキストなどを描画する前に一時的にcolorspaceを'RGBA'に変更していますが、これはデフォルトの'YV12'のままだとテキストの色によってガタつきが激しくなる問題の対策として行っています。でもこの方法が本当に「VPのAPIが想定しているやり方」なのかどうかは不明。
VP_TextEx05


ということで、今回は既存のプリセットを改造してみました。
このVPの良いところは、VPのAPIが許す範囲で何でも自分で作ってしまえるという自由度の高さです。誰かが作ったスクリプトがありさえすれば、それをコピペするだけで使えるというのも便利ですね。

このブログについて
ぺろりがREAPERで遊びたいというだけのブログかもしれない

必ずこちらをお読みください

twitter: @pelori

管理人用
  • ライブドアブログ