うえぽんSW局

古いタイプの日記ブログです。気まぐれに更新してます。

カテゴリ: AviUtl関連

 「虫眼鏡プラグイン」をr8に更新しました。

 AviUtl プラグイン フィルタ by うえぽん

 メインウインドウをクリック(正確にはマウスダウン)したときの動作に手を加えました。
 今まではメインウインドウのどこをクリックしても座標を取得していましたが、今回の更新では、動画内をクリックしたときだけ座標を取得するようにしました。
 ちなみにオーディオ波形部分をクリックしたときについては、オーディオ波形の下に動画が隠れているのなら座標が取得されます。

 このたび寄せられた要望では、オーディオ波形部分をクリックしたとき座標を取得しないようにできないかとのことでしたが、オーディオ波形部分をクリックしたことをプラグイン側で知る方法がないようなので、今回のような形での対応になりました。
このエントリーをはてなブックマークに追加

 更新しました。久々の更新なのでいっそのことver1.0.0ということにしました。

 AviUtl プラグイン フィルタ by うえぽん


 主な更新内容は
 ・事前に鮮鋭化(シャープ化)することで色褪せを軽減できるようにした
 ・Lanczos以外にBlackmanSincも使えるようにした
 ・ボカすことでFlashPlayerにおけるジャギ軽減ができないかと試してみた
 の3点です。


◆鮮鋭化
 事前にアンシャープマスク(シャープ化する)のようなものをかけ、色が褪せやすい部分を強調することで、色褪せ軽減します。

 まず元画像。
 UVダウンサンプリング サンプル1UVダウンサンプリング サンプル2

 従来のUVダウンサンプリング。
 UVダウンサンプリング_従来1UVダウンサンプリング_従来2
 元画像と比べると色が褪せてます。

 今回ののUVダウンサンプリングで、CbおよびCrの鮮鋭を16。
 UVダウンサンプリング_今回1UVダウンサンプリング_今回2
 色褪せが軽減できているかと思います。


◆cutoff
 Flash Playerでは色差の補間処理をやっていないとのことで、そのせいでジャギが目立つらしいです。
 そこでボカすことでジャギの軽減を試みるようにしてみました。
 cutoffが2だと1/2相当の縮小と同じボケ、3だと1/3相当、4だと1/4相当となっています。

 左から元画像、通常のUVダウンサンプリング、cutoffを4にしたUVダウンサンプリングです。

 UVダウンサンプリング_比較画像

 ジャギは目立たなくなりますが、ボケるのであまり綺麗な画質とはいえません。
このエントリーをはてなブックマークに追加

 「虫眼鏡プラグイン」をr7に更新しました。

 AviUtl プラグイン フィルタ by うえぽん

◆ルーラー&グリッド線
 要望がありましたので、下のスクリーンショットのようにルーラーとグリッド線を表示できるようにしました。
 虫眼鏡r7

◆ドラッグ中はマウスカーソルが変わる
 地味ですが、ドラッグ中はマウスカーソルの表示が変わるようにしました。

◆マウスホイールの向きを反転する
 r6で隠し機能として付けていた機能ですが、メニューで設定できるようにしました。
 マウスホイールによる拡大・縮小は、ソフトによって向きがマチマチだったりします。人によって好みが別れると思うので、設定できるようにしています。
 (ビデオゲームでもLRボタンの設定ができると嬉しい)

◆メニューバーは消せる
 このバージョンからメニューバーを付けましたが、いらない場合は消せます。
 aviutl.iniの[虫眼鏡]の項目に、menu=0という行を加えて下さい。
このエントリーをはてなブックマークに追加

 「JPEG 3点セット」を ver 0.2.0 に更新しました。

 AviUtl プラグイン フィルタ by うえぽん

 バージョンを0.1.6にするか0.2.0にするか迷いましたが、AviUtl本体が0.99k2で「YC48も色変換する」という大きな変化があったので、それを考慮しているということで0.2.0にしました。

●「JPEGワンクリック保存」を複製したとき設定が別個になるようにした
 ショートカットキーごとに設定を別けたいという要望がありましたので、jpeg_print.aufを別名で複製したとき、設定が共有されない(設定が別個になる)ようにしました。
 具体的には、aviutl.iniが[フィルタ名]で設定を管理しているので、[フィルタ名(ファイル名)]になるようにしました。

●恥ずかしい誤字修正ついでに表記変更
 「JPEGワンクリック保存」の設定一番下の表記を下のようにしました。

 JPEG1クリック設定

 AviUtl本体が0.99k2で「YC48も色変換する」となりましたが、「JPEGワンクリック保存」はYC48で処理しているものの、本体の色変換をスルーします(以前と全く変わらない動作です)。
 その辺が分かりやすそうな表記にしてみました。

●「JPEG File Reader」と「連番JPEG出力」は0.99k2の影響を受ける
 こういうのは早く書くべきでしたが、「JPEG File Reader」と「連番JPEG出力」はYC48で入出力しているために、AviUtlの0.99k2以降では本体側で色変換されてしまいます。
 JPEGはBT.601なので、「JPEG File Reader」「連番JPEG出力」で入出力する際は、色変換を「BT.601」に設定してください。
 動画と同じ扱いです。


【DCTよもやま話】
 DCTは波の組み合わせで様々な波形を表現できるらしいですが、どうして波で矩形を表現できるのか不思議です。
 試しにグラフにしてみたら、こうなりました。
 DCT矩形
 離散データなので、点だけを繋げればちゃんと矩形になります。
 このバランスが崩れるとモスキートノイズが出るのが何となく分かります
このエントリーをはてなブックマークに追加

 「60fpsフリッカ軽減」の0.2.0が一部のウイルス対策ソフトで誤検出されるらしいので、0.2.1に更新してみました。

 AviUtl プラグイン フィルタ by うえぽん

 この更新で機能や性能はあまり変わって無いと思います。
 「簡易NR」のデフォルト値を0から18にしたぐらいです。

 なぜ誤検出されたのかはよく分かりません。
 使っているコンパイラーは http://komisar.gin.by/ のMingwで、バージョンgcc-4.6.2です。
 とりあえずプログラムの無駄を削ったり、コンパイルオプションを変更したりして、バイナリを別物にしすることで対応してみました。
このエントリーをはてなブックマークに追加

 色変換プラグインの「補間なし平均」をver0.3.0に更新しました。
 いつもの置き場所にあります。

 AviUtl プラグイン フィルタ by うえぽん

 更新内容は
 ・AviUtlのver0.99k2でYC48の色変換もするようになったので、それにならってYC48に対応
 ・メモリ速度がボトルネックになるようなのでスレッド数を半分にして並行する他の処理へリソースを回すようにした
 の2点です。

 AviUtl内部と入出力の色空間が、異なるなら変換、同じなら無変換、という感じになってます。


 以下は覚え書き。

【bt.601とbt.709の相互変換の覚え書き】
(Y0, U0, V0)を別規格の(Y1, U1, V1)へ変換する式

(a, b, c): 変換元、RGBから輝度Yを求める際の各係数 ※a+b+c=1.0
(p, q, r): 変換先。RGBから輝度Yを求める際の各係数 ※p+q+r=1.0
とすると

Y1 = Y0 +        (r-q*c/b)*(1.0-c)*2.0 * U0 +         (p-q*a/b)*(1.0-a)*2.0 * V0
U1 = (1.0-r+q*c/b)*(1.0-c)/(1.0-r) * U0 + (-p+q*a/b)*(1.0-a)/(1.0-r) * V0
V1 = (-r+q*c/b)*(1.0-c)/(1.0-p) * U0 + (1.0-p+q*a/b)*(1.0-a)/(1.0-p) * V0

例えば、変換元がBT.709で変換先がBT.601なら
(a, b, c) = (0.2126, 0.7152, 0.0722)
(p, q, r) = (0.29891, 0.58661, 0.11448)
を代入する

 で、YC48の色変換をMMXやSSE2の整数演算で行えるようにしたら次のようになりました。
●BT.709→BT.601
yy = Y + ((-15640*U - 27905*V + 65536) >> 17);
uu = U + (( 2456*U + 15038*V + 65536) >> 17);
vv = V + (( 9931*U + 3352*V + 65536) >> 17);

●BT.601→BT.709
yy = Y + ((13441*U + 25705*V + 65536) >> 17);
uu = U + ((-1331*U - 14514*V + 65536) >> 17);
vv = V + ((-9585*U - 2196*V + 65536) >> 17);

 BT.709 → BT.601 → BT.709という計算をYC48の値の範囲(約12bit)で総当りで調べたところ、最大誤差が±1、誤差の割合が約11.624%でした。
 誤差±1ということは幅は3(-1、0、+1の3つの値になるという意味)なので、約12bit→10bitという丸めによって幅は1/4になり、理論上は10bit精度時の誤差は±0になるはずです(※入出力プラグインが行う変換との相性次第)。

 もっと精度にこだわるなら、内部と入出力の色空間を揃えれて無変換にしてください。
このエントリーをはてなブックマークに追加

 「60fpsフリッカ軽減」を0.2.0に更新しました。

 AviUtl プラグイン フィルタ by うえぽん

 主な更新内容は
 ・簡易NRを付加
 ・フレームのキャッシュ方法を改善して速度アップ
 の2つです。

◆簡易NR
 略さないと「簡易ノイズリダクション(時間軸)」です。
 メインのフリッカ軽減の処理速度をこれ以上上げるのは難しそうなので、他のフィルタ機能を付加することでトータルの処理時間を短くすることを考えてみました。
 フリッカ軽減でアダマール変換をしているので、そのついでに閾値処理をやっています。
 AviUtl標準の「ノイズ除去(時間軸)」と似たような効果があると思います。

◆時間軸プラグインを作る際のメモ
 時間軸フィルタでは前後のフレームを参照するわけですが、フレーム参照のたびに同じフィルタリング処理をやるのは無駄です。なのでAviUtlではキャッシュすることでその無駄を減らすことが出来ます。
 で、set_ycp_filtering_cache_size()でキャッシュフレーム数を設定しget_ycp_filtering_cache_ex()で前後のフレームを取得するわけですが、このとき前後のフレームだけでなく現在のフレーム分もキャッシュフレーム数に含めることを忘れないように注意。現在のフレームが次のフレームでは前のフレームということになるので、キャッシュされていないと再びフィルタリング処理すことになってしまいます。
 それとフィルタフラグにFILTER_FLAG_NO_INIT_DATAを指定するとfunc_proc()の初期画像データを作成しないようになるので、これを指定しておいて、現在のフレームもget_ycp_filtering_cache_ex()で取得すると良いかもしれないです。
このエントリーをはてなブックマークに追加

 AviUtlの60fps読み込み(Bob化)で発生するフリッカ(ちらつき)を軽減するプラグインフィルタを作ってみました。
 いつものところにアップしてあります。

 AviUtl プラグイン フィルタ by うえぽん

 仕組みは、時間軸方向にアダマール変換をし、高周波成分が突出していたら調整するということをやってます。
 こうすればフリッカが消えるだろうという予想はずいぶん前からしていましたが、実際に作ってみたら思ったよりも綺麗に消えました。

 ちなみに、これを作った後に「3次元プログレッシブ化フィルタ」の存在を知りました。
 ただ、サイトが消えており、webアーカイブを見てもファイルが見つからず、どういうものだったのか知りません。
 同じことをやっていのではないか気になります……。

[追記:2011/11/26]
 「3次元プログレッシブ化フィルタ」をメールで送っていただきました。
 ありがとうございます。
このエントリーをはてなブックマークに追加

 AviUtlプラグインの「JPEG 3点セット」をバージョンアップしました。いつものところにあります。

 AviUtl プラグイン フィルタ by うえぽん

◆修正
 JPEGワンクリック保存の設定ダイアログを開いたままの状態で、AviUtl本体を終了させようとするとフリーズしていたのを修正しました。

◆ダウンサンプリングの種類を追加
 少しでもファイルサイズを縮めようと8:1:1(4x2や2x4)のダウンサンプリングを追加してみました。
 しかし、4:1:1で100KBのjpegを8:1:1にしてみたところ、サイズは1KB程度しか縮みませんでした。
 グレースケールで保存しても10KBしか縮まない(つまり色差情報は全体の1割しかない)ので、色差を削る方法ではこれ以上サイズを縮めるのは難しいようです。

◆プログレッシブJPEGに「カスタム版」を追加
 「JPEGワンクリック保存」のみですが、プログレッシブJPEGの分割方法をカスタマイズしてみました。
 これにより少しだけサイズが縮むようになりました。平均して0.3%程度しか縮みませんが、相性が良いと3%ぐらい縮みます。

 それと、普通のプログレッシブJPEGはネット上で閲覧するとき、おもむろにジワーと表示されますが、これではロードに失敗して途中で止まってしまったときに、元々そういう荒い画像だったのか、それともロードに失敗したのか分かりにくいです。
 そこで、カスタム版では最初はグレースケールで表示し、最後に色がつくようにしてみました。このブログを見るような人に分かりやすく説明すると、8bitゲーム時代の「ライン&ペイント」っぽくなります。

カスタム版プログレッシブJPEG


 ただし、一部のソフトでこのカスタム版プログレッシブJPEGを読めないものがあるようです。今のところ分かっているのは、susieプラグインのifjpeg.spiですが、これはifjpegx.spiにすることで解決します。
このエントリーをはてなブックマークに追加

 いまどきJPEGの量子化テーブルをカスタマイズするのは自分以外いないかもしれないですが、もしかしたらもあるので公開しておきます。
 作成した量子化テーブルが、0-100で表される圧縮品質のどれぐらいに相当するか計算します。

●8x8の量子化テーブルを入力(区切りはカンマ以外でも可。小数点も可)


ここに結果が表示されます


◆計算方法の解説
 JPEGのエンコードではDCT後の値を量子化テーブルの値で除算(割り算)するわけですが、このとき12bitの範囲(-2048から2047)を持つ値を16で割ったとしたら、8bitの範囲(-128から127)に収まるようになり、4bit分のデータを削減できたことになります。
 8で割ったなら3bit削減、32で割ったなら5bit削減、2の累乗以外では log2(a) を計算すれば削減されるbit数は求まります(例えば10で割るなら約3.32bit削減)。
 それならばと、量子化テーブルの各値の log2(a) を求め、それを合計したのが「量子化で削減されるであろう情報量」となります。この数値が近いもの同士は最終的な圧縮サイズも近くなる傾向があると気づき、上のようなものを作ってみました。

 あとは、「平均スケール」(平均削減ビット長から求めた量子化テーブルの平均値)を計算。圧縮品質の計算式を逆算してどの圧縮品質に相当するか求めます。
 圧縮品質の計算式は、圧縮品質をq、量子化テーブルの値をa、圧縮品質50の時の値をTとした場合、次のようになります。
   q>=50の場合: a = T*(100-q)/50
   q< 50の場合: a = T*50/q
 逆算するときは、aが先ほど求めた「平均スケール」、圧縮品質50の時の平均スケールが約45.27として計算します。

◆ただし
 量子化テーブルで削減されるビット量を計算しているだけです。後段のエントロピー圧縮を考慮してないので、正確な値は出ません。あくまでも近い値です。
 またその圧縮品質と同じぐらいの画質になるという意味ではなく、「同じぐらいのサイズになる」という意味です。量子化テーブルをカスタマイズするのに参考になるかもしれません。
このエントリーをはてなブックマークに追加

↑このページのトップヘ