2012年12月13日木曜日

convo2d その2

更新しました。

convo2d-0.1.2-2.7z
https://github.com/chikuzen/convo2d

・入力クリップの各フレームのフォーマットが一定でない場合、及びフレームのサンプルがfloatの場合の処理を追加。

VapourSynthはAviSynthと違って、クリップの各フレームの解像度や色空間がすべて同じであるとは限りません。フレーム0は720x480のYUV420P8なのに、フレーム1は1920x1080のRGBということもありえます。
そこらへんを忘れていたので処理を追加しました。


さて、せっかく書いたプラグインなので、なにかやってみようと思います。
とりあえず簡単そうなやつで、アンシャープマスクでもいってみましょうか。

一般にアンシャープマスクと呼ばれる処理は次のようなことを行います。
1. 元画像と、それをぼかした画像を用意する。
2. 元画像とぼかした画像の差分をとる。
3. 差分をそのまま、もしくは何かしら手を加えてから元画像にかぶせる。
この結果として、なんかコントラストがきつくなったような画像が得られます。

まずは元画像を読み込みます。
import vapoursynth
core = vapoursynth.Core()
core.std.LoadPlugin('/path/to/vsimagereader.dll')
clip = core.imgr.Read('/path/to/lena.bmp')
次にぼかした画像を用意する。
core.std.LoadPlugin('/path/to/convo2d.dll')
blur = core.convo2d.Convolution(clip, [1, 1, 1, 1, 1, 1, 1, 1, 1])
二つの画像の差分をとります。
def clamp(value):
    if value < 1: return 0
    if value > 254: return 255
    return value

lut_diff = []
for y in range(256):
    for x in range(256):
        lut_diff.append(clamp(x - y + 128))

diff = core.std.Lut2([clip, blur], lut_diff, [0, 1, 2])
とりあえず今回はそのままかぶせます。
lut = []
for y in range(256):
    for x in range(256):
        lut.append(clamp(x + y - 128))
result = core.std.Lut2([clip, diff], lut, [0, 1, 2])
では元画像と結果を並べてみましょう。
last = core.std.StackHorizontal([clip, result])

差分のクリップに閾値をつけたり、値に倍率を掛けたり、あるいはぼかし方を変えてみたりしてみるのも面白いかもしれません。

しかし、これではconvo2dの使い方というよりLut2の使い方みたいですな…。

追記:
0.1.2では修正が不十分だったので、0.1.2-2に更新しました。

2012年12月10日月曜日

convo2d

VapourSynth用に空間convolutionフィルタを書きました。

convo2d-0.1.1.7z
https://github.com/chikuzen/convo2d

マトリクスを変更することによって様々な処理が行えることから、カスタムフィルタと呼ばれたりするものです。

単純な平滑化/先鋭化からエッジ検出、エンボス、ピクセルシフトといろいろ出来るので、ググってマトリクスを探してみるのもいいかもしれません。

追記:
メモリリーク、及び画像端の処理が間違ってたのを直しました。

2012年11月20日火曜日

FineSharpen for VapourSynth

VapourSynth用にFineSharpenを移植してみました。

https://gist.github.com/4111749

avs scriptの移植のサンプルにと考えて、規模的にちょうどよさそうだったのでこれを選んだわけですが、よく考えてみたらRemoveGrain、Repairというavisynthプラグインに依存してしまうので、あまりよくなかったかもしれません。

まあ、「masktoolsの代替をどうするか」の参考くらいにはなるということで。

これで使っているspline()は、こちらの方のものを参考にさせていただきました。
これだけのためにNumpyとか使うわけにもいかんからなぁ…

使い方:
gistからスクリプトをDLして、Python3.x\\Lib\\site-packages以下にfinesharp.pyという名前で保存して下さい。
import vapoursynth as vs
import finesharp

core = vs.Core()
core.std.LoadPlugin('path/to/the/ffms2.dll')
core.std.LoadPlugin('path/to/the/RemoveGrain.dll')
core.std.LoadPlugin('path/to/the/Repair.dll')
fs = finesharp.FineSharp(core)

clip = core.ffms2.Source('path/to/the/video.mp4')
clip = fs.sharpen(clip)
...

ちなみに 'print(fs.usage())' で、sharpen()の説明が読めます。

2012年11月18日日曜日

vsrawsource その3

更新しました。

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

* アルファチャンネルの読み込みに対応
* sarnum/sardenでsarを指定できるように機能追加

VapourSynth-r15以降専用です

vsavsreader その6

更新しました

vsavsreader-79a12496.7z
https://github.com/chikuzen/VS_AvsReader

* アルファチャンネルの読み込みに対応

VapourSynthはr15からAPIバージョンが3にあがりました。
それにあわせてこちらもAPIを上げたので、r15以降でないと動きません。

2012年11月16日金曜日

ある日の会話より

(Chikuzen) Doom9とかにたまに書き込んでる Mr.VacBobってastrange氏だったのか
(JEEB)     いぇす
(JEEB)     http://forum.doom9.org/showpost.php?p=1600803&postcount=501
(JEEB)     I have a new (NIH) resizer project in progress myself, but it's just for thumbnailing
           and not really worth trying to do much else with it.←リサイザー作ってるのか。まぁ、
           libavcodec等にはもうAppleのせいで触れられないんで、何か別のプロジェクトを作るのは時間の
           問題だった 笑
(Chikuzen) あら、あの人appleに就職したの?
(JEEB)     うん
(JEEB)     それであのQT用のlibavcodecうんたらが開発停止になったわけだし
(Chikuzen) なるほど、そーいうことだったのか
(Chikuzen) Perian開発終了はAppleのせいだった!
(JEEB)     あとlibavcodecの-mtに触れられないのもそれが原因だったりw
(Chikuzen) なんだ、最近ffmpeg-mt関連にあの人ほとんど触らなくなったと思ったら
(Chikuzen) GoogleなんかBBB氏を使ってガンガン進めてるのにねぇ
(Chikuzen) やっぱAppleはオープンソースの敵だよ
(JEEB)     オープンソースを敵にもなりそうな相手として扱ってるからねぇ・・・ 「外部で仕事でやった
           ような感じのプログラミングはしちゃダメダメよ(はーと)」という条件が仕事の契約に入ってるw

つくづく俺はAppleは嫌いだよ...

2012年11月2日金曜日

vsimagereader

というわけで(?)、これまで書いた4つの画像入力用プラグインを一つに統合しました。

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

いまのところ、これで読めるのはBMP、JPEG、PNG、TGAの4種類です。
いちおうそこそこ拡張しやすいように書いたつもりなので、ひょっとすると対応フォーマットが増えるかも知れません。
でも、殆どの場合、JPEGとPNGさえ読めれば、あとはどうとでもなるような気がするんですが…JPEG2000とかWebPとか、誰も使ってないでしょ?

なお、旧プラグイン4つはこれを持ちまして開発終了としますので、なにかバグをみつけても直しません。
不具合があった場合は、とりあえずこちらを試してみて、それでもダメだった場合のみ報告をお願いします。