2013年1月17日木曜日

GenericFilters その5

更新しました。

GenericFilters-0.4.1.7z
https://github.com/chikuzen/GenericFilters

* Convolution/ConvolutionHV/Blur:フレームが16bitだった場合の処理を修正

uint16_tとint16_tの乗算が出来る組み込み命令がないのって面倒すぎると思うんですが…。

2013年1月13日日曜日

GenericFilters その4

更新しました。

GenericFilters-0.4.0.7z
https://github.com/chikuzen/GenericFilters

* 新関数'Binarize2'を追加

Binarize2はBinarizeと同じくクリップを二値化するフィルタですが、閾値によって分けるのではなく、Sierra-2-4Aという誤差拡散法(いわゆるディザリングで使われるアルゴリズム)の一種によって処理します。

具体的には、これが
こうなります。
簡単に出来そうだったからやってみただけですので、実用性とかは気にしてはいけません。


2013年1月12日土曜日

vsimagereader その2

更新しました。

vsimagereader-0.2.0.7z
https://github.com/chikuzen/vsimagereader

* VapourSynthのAPIバージョンを3に更新
* アルファチャンネルの読み込みに対応/'alpha'オプションの追加
* 幅/高さ/出力フォーマットがバラバラな画像の読み込みに対応

以前も書きましたが、VapourSynthはavisynth等と違って各フレームの解像度やフォーマットが異なっていても扱えるようになっています。
今回の更新で、「解像度や保存形式がバラバラなものを一度に読み込んで、解像度を揃えて出力」なんてことが出来るようになりました。

一度にプラグイン4つも更新したので、大変疲れました。

GenericFilters その3

更新しました。

GenericFilters-0.3.0.7z
https://github.com/chikuzen/GenericFilters

* 関数に'Blur'を追加。

普通の3x3のぼかしフィルタです。
単なるConvolution()のaliasですな。

vsrawsource その4

更新しました。

vsrawsource-0.3.1.7z
https://github.com/chikuzen/vsrawsource

* アルファチャンネルのサポート方法を変更

vsavsreader その7

更新しました。

vsavsreader-0.1.0.7z
https://github.com/chikuzen/VS_AvsReader

* アルファチャンネルのサポート方法を変更
* 'alpha'オプションを追加

今回からこれにもバージョン番号を付けることにしました。

2013年1月6日日曜日

GenericFilters その2

更新しました。

GenericFilters-0.2.2.7x
https://github.com/chikuzen/GenericFilters

* Sobel/Prewitt: rshiftオプションを追加
* いろいろバグフィックス

ちょっとだけ内部処理の説明を書いておきます。

画像処理を行う場合、各ピクセルの値は、そのフォーマットによって扱える範囲が限定されます。
8bitフォーマットであればピクセルは0~255、16bitフォーマットであれば0~65535の範囲内に存在する値をとらなければなりません。
しかし、いろいろな計算を行った場合、出力値はしばしばこの下限/上限を超えることがあります。

この対処法として、最終的に出力する前に次のようなことが行われます。
1. 単純に、下限値/上限値で切り捨て。
2. 絶対値で扱う(値が下限値の0を超えた場合の対策)
3. 値を割ることで範囲内に収める(値が上限を超えた場合の対策)

GenericFiltersのConvolution(HV)はsaturateオプションをFalseにすれば処理2(絶対値化)が行われます。
divisorオプションによって処理3が行われます。
最後に処理1(値の切り捨て)を行うことで、出力値は範囲内に収められます。

さて、SobelとPrewittも多少工程が複雑であることを除けば単なる畳み込み演算なのですが、これらはエッジ検出に特化したアルゴリズムなので、自由度はConvolutionよりも低くなっています。
まず、処理2の絶対値化は必ず行われます。
そして、処理3の割る数は(主に処理速度の都合により)2の整数乗(rshiftで指定)に限定されています。

では今回はこのへんで

2013年1月5日土曜日

GenericFilters

VapourSynth用のプラグインを書きました

GenericFilters-0.2.0.7z
https://github.com/chikuzen/GenericFilters

名前のとおり、デジタル画像処理で一般的によく知られているフィルタ(畳み込み演算、二値化、膨張、収縮、メディアン等)の詰め合わせです。
avisynthで言えばmasktoolsにあたります。
VapourSynthは標準フィルタとして画像合成用のLut/Lut2/Expr/MaskedMergeを装備しているので、これらと組み合わせれば大幅に出来ることが増えます。

これを書くためにまず試作品としてConvo2Dを書き、ついでこれを書いたわけですが、最初はC言語オンリーだったので遅いったらありません。
とりあえず色々チュ-ニングしては見ましたが、やはり根本的な解決には至らず、今回とうとうSIMD(SSE2)に手を出してしまいました。

intrinsicなので多少はラクなのでしょうが、いや疲れたのなんのって、頭の中がバイト列の組み合わせパズルで占領されてしまいました。

UtVideoの梅澤さんに「よくアセンブラとか書けますね」って聞いてみたら、intrinsicよりMASMやNASMのほうが彼にはとってはラクなのだとか…怖いなぁ。