Resize

BicubicResize (clip, int target_width, int target_height, float "b=1./3.", float "c=1./3.", float "src_left", float "src_top", float "src_width", float "src_height")
BilinearResize (clip, int target_width, int target_height, float "src_left", float "src_top", float "src_width", float "src_height")
BlackmanResize (clip, int target_width, int target_height, float "src_left", float "src_top", float "src_width", float "src_height", int "taps=4")
GaussResize (clip, int target_width, int target_height, float "src_left", float "src_top", float "src_width", float "src_height", float "p=30.")
LanczosResize (clip, int target_width, int target_height, float "src_left", float "src_top", float "src_width", float "src_height", int "taps=3")
Lanczos4Resize (clip, int target_width, int target_height, float "src_left", float "src_top", float "src_width", float "src_height")
PointResize (clip, int target_width, int target_height, float "src_left", float "src_top", float "src_width", float "src_height")
Spline16Resize (clip, int target_width, int target_height, float "src_left", float "src_top", float "src_width", float "src_height")
Spline36Resize (clip, int target_width, int target_height, float "src_left", float "src_top", float "src_width", float "src_height")
Spline64Resize (clip, int target_width, int target_height, float "src_left", float "src_top", float "src_width", float "src_height")

v2.56 から、すべてのリサイザに対して(Crop と同様に)オフセット*1を使用することができます:
すなわち、

GaussResize (clip, int target_width, int target_height, float "src_left", float "src_top", float -"src_right", float -"src_bottom")

すべてのリサイザに関して、リサイズ前にクロップを行う拡張シンタックスを使用することができます。リサイズの前に Crop フィルタを置くのと同じ演算が実行されますが、両者にはわずかにスピードの違いがあります。

エッジの意味がわずかに異なります。Crop はクッキリとした完全な境界線を生じますが、リサイザフィルタのローブ*2は画像の物理的なエッジを超えない範囲でクロップされた領域にまで及ぶかもしれません。

クッキリとした縁や VHS のヘッドのスイッチングノイズを取り除くには、Crop を使用してください。リサイザのクロップを使用すると、ノイズを近傍の出力ピクセルにまで増殖させるおそれがあります。完全な画像の一部分を削る際に正確なエッジのレンダリングを維持するには、リサイザのクロップを使用してください。

Crop(10,10,200,300).BilinearResize(100,150)

# 上記のスクリプトは、以下とほぼ同じ
BilinearResize(100,150,10,10,200,300)

重要: AviSynth は、完全に独立した垂直と水平のリサイザを備えています。もし 1 つの軸に関して入力が出力と同じなら、リサイザはスキップされます。どちらが最初に呼び出されるかは、どちらが最も小さい縮小率かによって決定されます。これは、最大限の品質を保持するために行われます。これにより、2 番目のリサイザは、処理すべき最高のピクチャを得ます。

BilinearResize

BilinearResize フィルタは、入力ビデオフレームを任意の新しい解像度にリスケール(再拡大/再縮小)します。オプションの source 引数*3を与えると、BilinearResize の前にそれらの引数を使ってクリップに Crop を適用した場合と同じ結果になります。

BilinearResize は、標準的なバイリニアフィルタリング*4を使用しており、VirtualDub の「precise bilinear」リサイズオプションとほぼ同じです。「ほぼ」というのは、単に VirtualDub のフィルタが若干スケーリング係数を間違っているようであり、その結果、画像の上と右のピクセルがクリッピングされるかもしくは複製されるからです(このエラーは 1 つないし 2 つ以上の係数によってフレームサイズを拡大するときに顕著ですが、さもなければ大したことはないため、これについて過度に心配することはないと思います)。

使用例:

# ビデオファイルを読み込み、(元のサイズに関係なく) 240x180 にリサイズ
AVISource("video.avi").BilinearResize(240,180)

# 720x480 (ITU-R BT.601)のビデオを読み込み、正しいアスペクト比を保持したまま、
# 352x240(ビデオ CD)にリサイズ
AVISource("dv.avi").BilinearResize(352, 240, 8, 0, 704, 480)

# 上に同じ
AviSource("dv.avi").BilinearResize(352, 240, 8, 0, -8, -0)

# 320x240 のビデオの右上の 1/4 を抽出し、それをズームして
# フレーム全体を埋める
BilinearResize(320,240,160,0,160,120)

BicubicResize

線形フィルタリングの代わりに Mitchell-Netravali の 2 つのパラメータを取るキュービック・フィルタ*5を使用するということを除けば、BicubicResize*6 は BilinearResize に似ています。パラメータ bc は、3 次式のプロパティを調整するために使用することができます。それぞれ、「ぼかし」と「リンギング」*7と呼ばれることがあります。

b = 0 かつ c = 0.75 の場合、このフィルタは VirtualDub の「precise bicubic」とまったく同じで、上述の VirtualDub のスケーリング問題を除けば結果もまったく同じです。デフォルト値は b = 1./3. と c = 1./3. です。これは、人間の主観テストにおいて最も視覚的に満足の行く結果をもたらすものとして Mitchell と Netravali により推奨された値です。bc をもっと大きな値にすると、興味深いオプアート*8効果を引き起こすことができます -- たとえば b = 0、c = -5 を試してみてください。

もしビデオを拡大するのなら、BilinearResize よりも BicubicResize の方がはるかに良い結果が得られます。しかし、もし縮小するのなら、BilinearResize でもおそらく同程度かむしろ良いくらいでしょう。VirtualDub のバイキュービックフィルタはバイリニアフィルタよりもきれいな画像をつくり出しますが、これはおもにバイキュービックフィルタが画像をシャープにするからであり、サンプリングにおいて優れているからではありません。シャープな画像は見た目はすばらしいですが、それは圧縮を試みるまでのことであり、圧縮した瞬間、それらの画像は急激に扱いにくいものになります。BicubicResize の初期設定は、VirtualDub のバイキュービックほどシャープにはしませんが、バイリニアよりはシャープにします。もし低いビットレートでビデオをエンコードするつもりなら、BilinearResize のほうが全体的に優れた最終結果をもたらしたとしてもまったく驚きません。

数値的にもっとも正確なフィルタのためには、b と c が以下の式を満たすように制限してください :-

b + 2 * c = 1

これにより、b = 0 のとき、c の最大値 0.5 が与えられます。これは Catmull-Rom スプライン*9 と呼ばれるもので、シャープさを得るにはおすすめです。

c が 0.6 より大きくなると、「リンギング」が出始めます。リアルなシャープさではなく、テレビのシャープネスコントロールのようにくっきりしたものが得られるようになります。b に関しては、負の値は許可されていません。c が 0.5 より大きい場合、b = 0 を使用してください。

BlackmanResize

BlackmanResize は、タップ数が大きい場合のリンギングノイズをよりうまくコントロールする LanczosResize の改造版です。taps 引数に関する説明は LanczosResize を参照してください(デフォルト: taps=4)。(v2.58 で追加)

GaussResize

GaussResize は、調節可能なシャープ用のパラメータ p (デフォルト 30)を持つガウシアンリサイズフィルタを使用します。p の取る範囲はおよそ 1 から 100 までで、1 は非常にぼやけ、100 はとてもシャープになります。GaussResize は 4 タップを使用し、Lanczos4Resize に似た処理速度です(v2.56 で追加)。

LanczosResize / Lanczos4Resize

LanczosResize*10 は、かなり強いシャープを生み出す c = 0.6 〜 0.75 という高い値を指定した場合の BicubicResize の代替となるフィルタです。通常、優れた品質(少ない人工ノイズ)とシャープな画像を提供します。

Lanczos4Resize (v2.55 から追加)は、LanczosResize (正式名称: Lanczos3Resize)と密接に関連しています。リサイズを行うために、後者が 2*3=6 ローブ(lobe)を使用するのに対し、前者は 2*4=8 ローブを使用します。結果として、Lanczos4Resize の方がよりシャープな画像を生成します。とりわけクリップを拡大するときに役立ちます。

Lanczos4Resize は、LanczosResize(taps=4) の簡略表記です。

注: taps という名前の入力引数は、本当は lobes であるべきです(実際、ローブの半分です)。リサイザについて議論するとき、taps は以下で説明されているように異なる意味を持ちます。

補間タップ*11数(taps パラメータ)

taps=4 と仮定すると、アップサンプリング*12に関しては、すべての平均化が 4 つの入力サンプルにわたって起こるようにフィルタ範囲が大きさで分けられ、これを 4 タップフィルタにします。出力画像がどれだけ大きなものになるのかは問題ではありません - 依然として 4 タップのままです。

ダウンサンプリング(画像の縮小)については、4 つの *目的* サンプル(当然、ソースサンプルよりも広く間隔をあけられる)にわたって起こるように大きさによって分けられます。そのため、2 の倍数でのダウンサンプリング(画像を半分の大きさにする)の場合、このフィルタは 2*4=8 の入力サンプルを対象とします。すなわち、事実上の 8 タップです。さらに 3 倍のダウンサンプリングなら、事実上、3*4=12 タップとなる、といった具合になります。

したがって、ダウンサンプリングに関するタップの有効数は、ダウンサンプリング率 × フィルタ入力タップ数です(要するに、T 倍のダウンサンプリングと LanczoskResize は T*k タップになります)。これは、次の偶数まで切り上げられます。アップサンプリングについては、つねに k タップです。ソース: [avsforum の投稿]

PointResize

PointResize は、最もシンプルなリサイズフィルタです。一般に非常にブロックの目立つ画像をもたらすポイントサンプリング(Point Sampler)またはニアレストネイバー(Nearest Neighbour)*13のアルゴリズムを使用します。そのため、一般的にこのフィルタは、意図的に低品質を狙う場合か、クリアなピクセル描画を必要とする場合にのみ使用すべきです。
詳しく調べるためにピクセルの小さな領域を拡大するのに非常に役立ちます。

Spline16Resize/Spline36Resize/Spline64Resize

3 つのスプライン*14ベースのリサイズフィルタ(v2.56/v2.58 で追加)。Spline の論理的根拠は、LanczosResize よりも少ないリンギングノイズで、可能な限りシャープであることです。Spline16Resize は sqrt*15(16)=4 つの標本点を使用し、Spline36Resize は 6 つ、Spline64Resize は 8 つの標本点を使用します。標本点が多く使用されるほど、クリップはシャープになります。リサイザ間の比較は、こちらにあります。

今日現在、AviSynth の作者は、Spline リサイザで使用されているような係数がどのようにして導き出されるのかわかりません。もし知っている方がいれば、ご連絡ください。

更新履歴:

v2.55Lanczos4Resize を追加
v2.56Spline16Resize、Spline36Resize、GaussResize を追加。LanczosResize に taps パラメータを追加。xxxResize の Crop 部分にオフセットを追加
v2.58BlackmanResize、Spline64Resize を追加

註: このページは、AviSynth 2.5.8 RC3 に同梱されている英語版ヘルプの日本語訳です。原文は、AviSynth をインストールしたフォルダ内の Docs/english/corefilters/resize.htm にあります。なお、このページのテキストおよび画像のライセンスは、オリジナルのそれに準じます。詳しくは、AboutLicense を参照してください。


*1 訳者註: src_width と src_height の部分に負の値を使用することによって、それぞれ右端(src_right)と下端(src_bottom)のクロップ幅を指定することができるようになります。
*2 訳者註: 参考: Lanczos vs Bicubic comparison - Page 2窓関数 - Wikipedia
*3 訳者註: 「src_」始まるパラメータ(src_left、src_top、src_width、src_height)のこと。また、その値。
*4 訳者註: バイリニア補間(双線形補間)を用いた画像フィルタリング手法。参考: ASCII24 - アスキー デジタル用語辞典 - バイリニアフィルタリングJAVAで学ぶ3D内分点と画像の拡大・縮小
*5 訳者註: 原文は「Mitchell-Netravali two-part cubic」。同じフィルタを指すために「Mitchell & Netravali's two-param cubic filter」という表現も使われているようです。このため、訳文のように翻訳することにしました。参考: Reconstruction filters in computer-graphics
*6 訳者註: 参考: Diary 2000-12(まるも製作所)MemoNyanDum : Resize 2. Bilinear vs Bicubic
*7 訳者註: 参考: リンギング / プロフェッショナルビデオ用語辞典 / システムファイブ e-PROSHOPASCII24 - アスキー デジタル用語辞典 - リンギング
*8 訳者註: 参考: オプ・アート - Wikipedia
*9 訳者註: 参考: 第3章 第5節 Catmull-Romスプライン曲線
*10 訳者註: 参考: Diary 2001-7(まるも製作所)Diary 2001-6(まるも製作所)Lanczos 3, Lanczos 4とはなんぞや - 2008/04/302006/09/11 ageha was here
*11 訳者註: 参考: Lanczos vs Bicubic comparison - Page 2Resampling - Avisynth wikiDiary 2001-7(まるも製作所)Lanczos 3, Lanczos 4とはなんぞや - 2008/04/302006/09/11 ageha was here
*12 訳者註: 参考: アップ・サンプリング
*13 訳者註: 最近傍法、最近傍画素法とも言う。参考: 画像補間法アルゴリズム入門 : 第 4 章 画像処理入門 2画像縮小について (株式会社ディア Dear inc.)
*14 訳者註: 参考: 情報工学演習II 第12回: スプライン補間(宮崎大学)
*15 訳者註: sqrt は平方根を表します。よって、sqrt(16) は、16 の平方根のうち、正の数の 4 となります。

最終更新日時: 2014-03-12 (水) 23:40:09 (3925d)