ImageMagick の例 --
リサンプリングフィルター

索引
ImageMagick の例 序文と索引
リサンプリングアーチファクト - リサイズの品質は?
ブロッキングリンギングエイリアシングブラー
 
リサンプリングフィルター
リサンプリングフィルター (続き)
 
ニコラス・ロビドゥーによるリサンプリング (サブセクション)
ここでは、リサイズの低レベルな側面と、結果の画像内の個々のピクセルの最終的な色を決定するために使用されるリサンプリングフィルターを見て、画像のディストーションについて解説します。これは広範囲に及ぶ、長年の研究テーマであり、完璧なリサイズ画像が何であるかを決定することは不可能であるため、客観的な事実というよりは意見や個人的な見解に満ち溢れています。これは証明済みの事実であり、決して終わることのない非常に大きな研究分野となっています。 リサイズとスケーリング演算子を読んで理解することをお勧めします。

リサンプリングアーチファクト- IM のリサイズの品質は?

画像リサイズは非常に困難な問題に取り組む必要があります。どのようにして、値の配列を、より小さくまたは大きくした値の配列に減らして、私たちの目には綺麗に見えるようにするのでしょうか。これを行おうとする際に多くの問題が発生する可能性がありますが、それらは4つの基本的なカテゴリに分類されます。

ブロッキング

基本的に、ピクセルを複製するだけで画像を拡大すると、ピクセルのより大きな長方形のブロックが作成されます。実際、「-scale」または「-sample」を使用して画像を拡大すると、まさにそのように、拡大されたピクセル化された画像が生成されます。たとえば、ここでは小さな画像をスケールし、綺麗な滑らかな画像ではなく、色の大きなブロックを生成しています。その隣には「リサイズ」されたバージョン、そして最後にガウシアンフィルターを使用して通常よりもブラーを強め、孤立したピクセルを丸いドットに置き換えて、ブロック状のものをいくらか取り除いたバージョンがあります。

  magick storm.gif  -scale  300%  storm_scaled.gif
  magick storm.gif  -resize 300%  storm_resized.gif
  magick storm.gif -filter Gaussian -resize 300%  storm_resized_gas.gif
[IM Output]
オリジナル
==> [IM Output]
スケール
[IM Output]
リサイズ
[IM Output]
ガウシアンリサイズ
「ブロッキング」の主な原因は、アンチエイリアス処理が不十分なソース画像であるか、画像全体の見た目を向上させるためのピクセル間の十分なスムージング(色の混合またはブラー)がないかのいずれかです。これは、非常に低解像度の画像をはるかに大きなスケールにリサイズする場合や、高解像度デバイスで使用する場合にもよく見られます。これが見られる最も一般的な場所は、ユーザーが作成したニュースレターや雑誌でビットマップ画像を使用し、それを非常に高解像度のレーザープリンターで印刷した場合です。ニュースレターは画面上では見栄えがしますが、印刷されたページでは「ブロック状」になります。この状況は修正が非常に困難であり、一般的には、はるかに高解像度のクリップアートを使用するか、スケーラブルなベクター画像(SVGやWMF形式の画像など)を使用することで回避するのが最善です。もちろん、状況によっては、ブロッキングアーチファクトが実際に望ましく、結果的に強調されることもあります。たとえば、古い低解像度のビデオゲームを新しい高解像度ディスプレイで再現しようとする場合、画像の古い「ブロック状」を維持することで、「レトロ」な外観が強調されます。または、新しい色や結合された色を生成せずに画像を回転させようとする場合などです。実際に「ブロック状」を維持しながら、正方形を斜線で埋める手法は、ピクセルアートスケーリングアルゴリズムとして知られており、そのような多くのスキームが開発されています。ImageMagick には、Magnify演算子でスキームが組み込まれています。

リンギング

リンギングは、非常に低品質の JPEG 画像で、シャープなエッジ付近によく見られる効果です。これは通常、エッジがリサイズまたは画像圧縮アルゴリズムによって過度に補正されたり、サポートサイズが不適切な高品質フィルターを使用した場合に発生します。たとえば、ここでは特別なオプションを使用して、非常にシャープな色変化で生の Sinc フィルターを選択します。また、画像拡大用にデフォルトのフィルター選択を使用する IM のデフォルトのリサイズ演算子を使用して、操作を繰り返しました。

  magick -size 8x16 xc:'#444' xc:'#AAA' +append  gray_edge.gif
  magick gray_edge.gif -filter Sinc \
                         -resize 100x100\!  gray_edge_ringing.gif
  magick gray_edge.gif  -resize 100x100\!  gray_edge_resize.gif
[IM Output] ==> [IM Output] [IM Output]
上記は、IM が提供する最適化なしで、生のリサイズフィルターの使用によって生成される過補償を非常に明確に示しています。デフォルトの IM 拡大フィルターによって生成された2番目の画像も、非常にわずかなリンギング効果を示していますが、ほとんど目立たず、実際には境界を知覚的にシャープにするという点で望ましいものです。これがリンギング効果の別の例で、今回はグレーの背景で単一のピクセルを拡大した場合です。

  magick -size 1x1 xc: -bordercolor '#444' -border 4x4 \
          -define filter:lobes=5  -filter Sinc \
          -resize 100x100\!   dot_sinc.gif
[IM Output]
この画像は、一次元フィルターの使用によって生成される二次効果も明確に示しています。つまり、リンギング効果は水平方向と垂直方向(直交)が最も強く、45度の二次リンギングがあります。そして今回は、円筒フィルター(ディストートリサイズ演算による)を使用して、リサイズ演算子が使用する、より一般的な2パスの直交配置(テンソル)フィルターとどのように異なるかを示しています。

  magick -size 1x1 xc: -bordercolor '#444' -border 4x4 \
          -define filter:lobes=5  -filter Jinc \
          -distort resize 100x100\! +repage dot_jinc.gif
[IM Output]
これらの効果は通常は表示されず、ここでは、極端な拡大のために生の「Sinc」または「Jinc」フィルター(以下の窓関数フィルターを参照)の使用によってのみ見られます。通常、このような「生」フィルターは使用されません。

エイリアシングとモアレ効果

エイリアシング効果は一般的に、画像の端に沿って「階段」のような効果が生じると見られます。多くの場合、これは「-sample」を使用するなど、画像の生サンプリング、またはリサイズ中の画像の過度のシャープニングが原因です。階段状の効果は、画像の強い縮小で最も顕著ですが、IM ではめったに見られません。ただし、エイリアシングには他の効果もあります。特に、ピクセルレベルのパターンを含む画像に、大規模なモアレパターンが現れることです。これらの低レベルのパターンは、並行線のパターン、布の織り方(絹は実生活でこの効果を示します!)、レンガ造りの建物、フェンス、舗装の写真のレンガやタイルのパターンなど、大規模なモアレパターンを生成することがよくあります。[IM Output] モアレ効果が強く発生するリサイズ画像の例については、Wikipedia、モアレパターンページを参照してください。リサイズでエイリアシングの問題が発生するかどうかを確認する古典的な方法は、リング画像(右を参照)を縮小することです。この画像は、任意のリサイズ形式を任意のスケールで適用すると、モアレ効果を示すことがよくあります。特に、Webブラウザは、超高速(ただし多くの場合品質が低い)リサイズ手法を使用しているため、そのような画像を表示するときにモアレ効果を示します。
ここでは、「-sample」演算子、「-scale」演算子、および通常のデフォルト「-resize」を使用してリサイズされた「リング」画像を示します。

  magick rings_sm_orig.gif  -sample 100x100  rings_sample.png
  magick rings_sm_orig.gif  -scale  100x100  rings_scale.png
  magick rings_sm_orig.gif  -resize 100x100  rings_resize.png
[IM Output]
sample
[IM Output]
scale
[IM Output]
resize
ご覧のとおり、すべてのリサイズ方法でモアレ効果が発生しましたが、IM のデフォルトのリサイズ演算子は、最終画像で望ましくないこの二次パターンを最小限に抑えています。わずかなリサイズのみの効果を示すために、大きなリング画像の角を切り取りました。その結果が最初に表示され、次にそのサイズがわずか5%縮小されています。

  magick rings_lg_orig.png -crop 105x105+0+0  rings_crop.png
  magick rings_crop.png    -sample 100x100    rings_crop_sample.png
  magick rings_crop.png    -scale  100x100    rings_crop_scale.png
  magick rings_crop.png    -resize 100x100    rings_crop_resize.png
[IM Output]
切り抜きオリジナル
==> [IM Output]
sample
[IM Output]
scale
[IM Output]
resize
ご覧のとおり、わずかなリサイズでも、リサイズ演算子が持つ可能性のあるエイリアシングが表示されます。実際、注意深く見ると、元のスケーリングされていない切り抜き元の開始画像にも非常に軽いモアレ効果が見える可能性があります。これは、コンピューター画面での表示に適した密度でラスター画像のみを使用することによる制限から生じています。つまり、このテスト画像が、画像を縮小することによって引き起こされるエイリアシング効果を示すのにどれほど敏感であるかを示しています。

ブラー

ほとんどの人が、"-resize" の使用によって生じるぼかしに馴染みがあるでしょう。実際、これはおそらく画像のリサイズに関する最も多い不満であり、それには十分な理由があります。通常、非常に小さなリサイズはぼやけた画像を生成する傾向があり、再度リサイズするとさらに悪化するだけです。問題は、画像をリサイズするときに、ピクセル(「ラスタ」として知られる)の「グリッド」または配列として保存された画像を、まったく異なるピクセルの「グリッド」に合わせるために変更しているということです。2つの「グリッド」は、非常に特殊なケースを除いて一致せず、その結果、画像データはこの新しいドットパターンに合うように変更する必要があります。基本的に、画像を直接リサイズしてきれいに仕上がることを期待するのは不可能ですが、妥当な結果を得ることはできます。結果として、通常、ピクセルデータがわずかにぼやけます。リサイズアルゴリズムが優れているほど、シャープなエッジのぼかしは少なくなります。ただし、一部のリサイズフィルター、特に画像を拡大するために特別に設計されたものは、必要以上に多くのぼかしを追加することがよくあります。これは、上記で実証したように、'ブロッキング'アーティファクトに対抗するためです。画像の縮小には、シャープなエッジで 'リンギング'アーティファクトを回避し、可能なエイリアシング効果を低減するために、ぼやけたエッジがよく使用されます。ただし、これは安易な妥協案であり、IMはこれを避けるために努力しています。それでも、特別なエキスパートフィルターブラー設定を使用して、フィルターが提供するぼかしを調整できます。ただし、1.0より小さい数値はぼかしを減らすはずですが、使用されている正確なフィルターとリサイズ比率によっては、ぼかしを悪化させる可能性もあることに注意してください。保証はできません。
IM v6.3.6-3より前のバージョンでは、フィルターブラー設定は「-support」と呼ばれていましたが、これは実際に行っていることを非常に誤解させるものでした。このオプションは非推奨となり、現在では利用できません。
リサイズによって発生するぼかし効果を修正するより良い方法は、シャープニング演算子を使用して画像を再フィルターすることです。詳細については、リサイズされた画像のシャープニングを参照してください。

IMリサイズと他のプログラム

IMのデフォルトのリサイズ演算子と、実世界の画像のリサイズにおける他の多くのプログラムとの実用的な比較が、Bart van der Wolfによって提供されています...
ダウンサンプリングの例
具体的に、IMリサイズのまとめとしては...
シャープニングの量は好みの問題ですが、エイリアシングアーティファクトがないことは、最もクリーンで自然に見える画像を生み出します。
彼はまた、さまざまなPhotoshopリサイズメソッドとImageMagickを直接比較するための「リング」テストも見ています...
ダウンサンプリング方法
これらの記事は、画像処理において、正しいリサイズ(および適切なフィルタリング方法の使用)がどれほど重要であるかを示しています。次のセクションでこれを詳しく見ていきます。

リサンプリングフィルター

"-filter"設定は、"画像のリサイズ"だけでなく、"一般的な歪み演算子"が、最小限のリサンプリングアーティファクトでクリーンな結果を生成する方法に関する重要な制御です。これは1980年代後半に集中的に研究されたトピックであり、この分野の主要な研究者であるPaul Heckbertが、彼の「ズーム」画像リサイズプログラムを作成し、公開しました。このプログラムは、今日使用されているほとんどの画像リサイズプログラムの父となりましたが、後期の多くのプログラムは、間違いを犯しやすいので、これを適切に実装していません。たとえば、Webブラウザが画像をリサイズする方法のテスト結果を見てください。多くの点で、これらのフィルターは画像の畳み込み、さらにはぼかしカーネルと密接に関連しています。それらは同様の問題さえ抱えています。ただし、フィルターは、リサイズまたは画像を歪ませるときに最終的な結果の外観を向上させるように設計されています。フィルターの名前は、過去1世紀(またはそれ以上)の画像処理の専門家や数学者のまさに「名簿」です。それらは通常、フィルターの説明ではなく、最初にフィルター(またはフィルターファミリー)を公開した人、またはそのフィルターを最も研究した人のラベルにすぎません。ただし、これにより、「ラグランジュ」フィルター(ジョゼフ=ルイ・ラグランジュにちなんで名付けられた)が、たとえば「カトマ」フィルター(エドウィン・カトマルとラファエル・ロムにちなんで名付けられた)よりも優れているかどうかを知ることがはるかに困難になります。ここでは、フィルターの主な側面について説明します。これらのことを学ぶことは不可欠ではありませんが、IMリサイズフィルターシステムのメジャーなオーバーホールと拡張(IM 6.3.7-1)の一環として、この分野の研究を完了した後、私が学んだことの要約を文書化することにしました。リサイズフィルターの再開発中の研究にご協力いただいたFred Weinhausに感謝します。彼は特に、このオーバーホール以前のIMリサイズには存在しなかった「ラグランジュ」ファミリーのフィルターの追加を切望していました。また、Nicolas Robidouxにも感謝します。彼の数学は、一般的な歪み演算子の重大な欠陥を解決し、次に円筒フィルターを開発するのに役立ちました。これにより、リサイズ演算子で得られるものよりも優れた結果が得られます。

フィルターの仕組み

画像をリサイズするときは、基本的に、元のソース画像のピクセルに基づいて、新しい画像の各ピクセルの正しい値を決定しようとしています。ただし、これらの新しいピクセルは古いピクセルの位置と正確に一致しないため、これらのピクセルの正しい値を何らかの方法で決定する必要があります。行われることは、元のソースピクセル値の何らかのタイプの加重平均を使用して、新しいピクセルの適切な値を決定しようとすることです。新しいピクセルの場所を囲む実際のピクセルは、寄与する値の「近傍」を形成します。この近傍が大きいほど、リサイズは遅くなります。これは、畳み込みと呼ばれる手法です。各実際の隣接ピクセル(「サンプル」として知られている)が最終的なピクセルを生成するために寄与する量は、重み付け関数によって決定されます。これが、"-filter"設定を使用して選択できる「フィルター」です。そのフィルターは通常、フィルターの「サポート」としても知られている、理想的な近傍サイズを持っていますが、それは「ウィンドウ」としても知られています。定義済みの2次元「フィルター」は、「畳み込みカーネル」としても知られています。
FUTURE: some diagrams may be helpful here
これらの重み付け関数、つまり「フィルター」の設計は、複雑な数学、周波数分析、さらにはフーリエ変換を含む、非常に複雑なビジネスです。これに興味がある場合の良い出発点は、Wikipedia: ナイキスト・シャノンのサンプリング定理です。ただし、既存のフィルターとその画像への影響を理解するためにそこまで行く必要はありません。

フィルター

補間フィルター

最も単純なタイプのリサイズフィルター関数は、補間メソッドです。これらは、ソース画像内の特定のピクセル位置を取り、周囲のピクセルの色に基づいて、その位置での画像の論理的な色値を単純に決定しようとします。関与するピクセル数が常に固定されており、最小限であるため、このタイプのフィルターは、画像のリサイズまたは歪曲を行う非常に高速な方法です。ただし、これはフィルターの欠点でもあります。元の画像よりも大幅に小さい画像を形成するために、より多くのピクセルを結合することはありません。その結果、強力なエイリアシングとモアレ効果が発生する可能性があります。補間は通常、画像のスケーリングが不明または不要な場合に、「点」サンプリング画像にのみ使用されます。たとえば、画像の回転やわずかな歪みの場合、画像のスケーリングやサイズは変化しないため、補間は妥当な結果を生成できますが、非常に正確なものではありません。詳細については、IMの補間設定を参照してください。ただし、一般的な画像リサイズには適していません。

ポイント

-filter」設定に「Point」を使用するということは、基本的にはスケーリングされていない補間フィルターを使用することを意味します。リサイズ演算子の場合、新しいピクセルの位置に最も近いピクセルを選択するだけで、それがすべてです。つまり、リサイズ演算子は、ソース画像内の実際のピクセルの色を使用します。色を結合したり、結果の画像のより良い色を生成したりする試みは行われません。その結果、"-filter point -resize ..."を使用すると、"-sample"(サンプリング演算子を参照)と同じ結果が生成されますが、後者の方が高速です。そのコードは、正確なサンプリングポイントを調整するコントロールを使用して、ポイントサンプリングによって画像をリサイズするように特別に設計されているからです。
歪み演算子の場合、"-filter Point"を選択すると、円筒フィルターの代わりに補間ポイントサンプリングが強制的に使用されます。詳細については、歪み演算子の画像フィルターを参照してください。

通常の画像リサイズで同じ補間ポイントサンプリングが必要な場合は、代わりに補間リサイズ演算子を使用できます。または、同じ結果を得るには、ポイントフィルター処理された歪みリサイズを使用します。

ここでは、10x10ピクセルのハッシュパターンから始めてサイズを縮小し、結果を見ることができるようにスケーリングします。

  magick -size 10x10 pattern:gray50  checks_10.gif
  magick checks_10.gif -filter point -resize 9x9  checks_point-1.gif
  magick checks_10.gif -filter point -resize 8x8  checks_point-2.gif
  magick checks_10.gif -filter point -resize 7x7  checks_point-3.gif
  magick checks_10.gif -filter point -resize 6x6  checks_point-4.gif
  magick checks_10.gif -filter point -resize 5x5  checks_point-5.gif
[IM Output]
 
==> [IM Output]
ポイント-1
[IM Output]
ポイント-2
[IM Output]
ポイント-3
[IM Output]
ポイント-4
[IM Output]
ポイント50%
実際に起こっているのは、画像の単一の行と列のピクセルが削除されることだけです。このレベルでも、結果の画像に極端なブロッキングエイリアシングが発生し、上記のような特定のケースでは、完全に非現実的な結果になる可能性があります。したがって、「Point」フィルター、またはより高速な同等のサンプリング演算子は、通常の画像リサイズには推奨されません。

ボックス

Box」フィルター設定は、「point」とほぼ同じですが、わずかな違いがあります。画像を縮小する際、ピクセルを平均化して結合します。結果の画像が小さければ小さいほど、より多くのピクセルが平均化されます。[IM Output] こちらはフィルターの重み付け関数のグラフで、なぜ「Box」フィルターと呼ばれるのかがわかります。基本的には、「Box」内に入るピクセルはすべて、新しいピクセルの色を計算するために直接使用されます。フィルターは幅がわずか1/2ピクセルであるため、実際にはリサイズされない画像の場合、最も近いピクセルが1つだけ使用されます。言い換えれば、スケーリングが関係ない(または拡大のみ)場合、新しい場所への最も近いピクセルが新しいピクセルの色を形成します。ただし、画像が小さくされる場合、ソース画像のより多くの部分がその「ボックス」の境界内に圧縮されます。その結果、より多くのピクセルが平均化され、より小さい画像のピクセルの色を生成します。たとえば、以下は「Box」フィルターを使用して徐々に圧縮されるチェッカーボードのピクセルパターンを拡大したものです。

  magick checks_10.gif -filter box -resize 9x9  checks_box-1.gif
  magick checks_10.gif -filter box -resize 8x8  checks_box-2.gif
  magick checks_10.gif -filter box -resize 7x7  checks_box-3.gif
  magick checks_10.gif -filter box -resize 6x6  checks_box-4.gif
  magick checks_10.gif -filter box -resize 5x5  checks_box-5.gif
[IM Output]
 
==> [IM Output]
Box-1
[IM Output]
Box-2
[IM Output]
Box-3
[IM Output]
Box-4
[IM Output]
Box 50%
ご覧のとおり、「Box」フィルターを使用して画像を小さくリサイズするにつれて、ますます多くのピクセルが結合されますが、結合は特定の、等間隔の行と列で発生します。これにより、画像の縮小と拡大の両方で、さまざまなアーティファクトやモアレまたはエイリアシング効果が発生します。「Box」フィルターは、画像の「ビニング」に使用することをお勧めします。つまり、結果のすべてのピクセルが同じ数の隣接ピクセル(「ビン」)の平均になるように、整数倍で画像を縮小することです。結果の画像は、上記最後の画像のように、見た目がきれいなままになります。また、「Boxフィルター」の代わりに、はるかに高速なスケール演算子を使用することをお勧めします。ごくわずかなピクセルで画像を縮小する場合を除き、ほぼ同じ結果が得られます。「ビニング」の場合は、同じ結果が得られます。
スケール演算子は、特別な「ピクセルミキシング」アルゴリズムを使用して実装されているため、正確には「Boxフィルター」と同じではありません。正確な詳細については、スケール内部を参照してください。
拡大する場合、「Point」フィルターと「Box」フィルターの両方で、行と列の同じ「ピクセル複製」が生成されます。これらはすべて、単純な「最近傍」選択を使用するためです。

  magick -size 5x5 pattern:gray50  checks_5.gif
  magick checks_5.gif -filter box   -resize 6x6    checks_box+1.gif
  magick checks_5.gif -filter box   -resize 7x7    checks_box+2.gif
  magick checks_5.gif -filter box   -resize 8x8    checks_box+3.gif
  magick checks_5.gif -filter box   -resize 9x9    checks_box+4.gif
  magick checks_5.gif -filter box   -resize 10x10  checks_box+5.gif
[IM Output]
 
==> [IM Output]
Box+1
[IM Output]
Box+2
[IM Output]
Box+3
[IM Output]
Box+4
[IM Output]
Box+5
スケール演算子も同様の結果を生成しますが、整数スケーリング係数で拡大しない限り、拡大時にピクセルカラーミキシングが行われます。

トライアングル

[IM Output]トライアングル」または「バイリニア」補間フィルターは、最近傍の補間をさらに一歩進めたものです。「Box」が行うように、単に近くのピクセルを平均化するのではなく、新しいピクセルの位置が近傍(または「サポート」領域)内の元のピクセルにどれだけ近いかに応じて、ピクセルに重み付けします。新しいピクセルがソース画像のピクセルに近いほど、そのピクセルが寄与する色が多くなります。これにより、画像が縮小される際に、よりグローバルな色の平均化が行われます。

  magick checks_10.gif -filter triangle -resize 9x9 checks_tri-1.gif
  magick checks_10.gif -filter triangle -resize 8x8 checks_tri-2.gif
  magick checks_10.gif -filter triangle -resize 7x7 checks_tri-3.gif
  magick checks_10.gif -filter triangle -resize 6x6 checks_tri-4.gif
  magick checks_10.gif -filter triangle -resize 5x5 checks_tri-5.gif
[IM Output]
 
==> [IM Output]
Tri-1
[IM Output]
Tri-2
[IM Output]
Tri-3
[IM Output]
Tri-4
[IM Output]
Tri
ご覧のとおり、コーナーピクセルは元の画像のコーナーとほぼ完全に一致していたため、より目立ちますが、近くのピクセルが新しい生成されるピクセルと正確に一致しない中央に向かっては、近傍全体の色がより平均化されます。チェッカーボードのピクセルパターンの場合、平均的なグレー色でフェードインおよびフェードアウトする傾向があります。ただし、「サポート」近傍が大きいほど、画像を拡大する際に関与するピクセルが多くなります。したがって、画像に追加されるピクセルを生成するときに色の平均化が行われます。

  magick checks_5.gif -filter triangle -resize 6x6  checks_tri+1.gif
  magick checks_5.gif -filter triangle -resize 7x7  checks_tri+2.gif
  magick checks_5.gif -filter triangle -resize 8x8  checks_tri+3.gif
  magick checks_5.gif -filter triangle -resize 9x9  checks_tri+4.gif
  magick checks_5.gif -filter triangle -resize 10x10 checks_tri+5.gif
[IM Output]
 
==> [IM Output]
Tri+1
[IM Output]
Tri+2
[IM Output]
Tri+3
[IM Output]
Tri+4
[IM Output]
Tri+5
大規模な拡大の場合、結果は、各ピクセルの間に色のグラデーションが追加されたかのように機能します。たとえば、ここでは、単一の白いピクセルを持つ非常に小さな画像を生成します(表示は拡大表示です)。次に、その画像を大幅に拡大します。

  magick xc: -bordercolor black -border 2x0 pixel_5.gif
  magick pixel_5.gif  -filter triangle -resize 300x  pixel_triangle.gif
[IM Output]
単一ピクセル画像
(拡大)
==> [IM Output]
トライアングルフィルター拡大
上記の画像の色をグラフ化すると(「im_profile」スクリプトを使用)、三角形フィルターグラフのレプリカが表示されます。
[IM Profile]
画像のプロファイル
ご覧のとおり、中央のピクセルは隣接ピクセルと結合され、それらのポイント間で色の線形グラデーションが生成されました。すべての補間フィルターは、隣接ピクセル間で同様のグラデーションパターンを生成します。また、これが画像拡大に非常に適している理由でもあります。

その他の補間フィルター

[IM Output] 右側には、さまざまな補間フィルターをグラフ化しました。ただし、「Point」は、実際には、スケールされていない「Box」フィルター(純粋な「NearestNeighbor」補間)の非常に特別なケースです。他の補間フィルターには、「Hermite」が含まれます。これは結果が三角形に非常に似ていますが、拡大時にスムーズな丸みを生成し、グラデーションの遷移をスムーズにします。右側のグラフをクリックすると、これら3つのフィルター関数のグラフが表示されます。
[IM Output]Lagrange」フィルターは、「普遍的な」補間フィルターと呼ばれています。「サポート」サイズ(以下のサポートエキスパート設定を参照)を変更することで、以前に確認したすべての補間フィルター(「Hermite」を除く)を生成できます。デフォルト設定(グラフの右側に紫色の線で示されているラグランジュ3次フィルター(サポート=2.0))は、妥当な「立方」フィルターを提供します。勾配の変化により、拡大時に目立つブロック効果が発生する可能性がありますが、ビットマップ画像や線画ではこれは良いことです。他のラグランジュフィルターの次数については後で詳しく説明します。[IM Output] Catrom」(カトマル-ロム)フィルターは、補間関数としてよく使用される既知の標準三次フィルターであり、同じ名前で利用できます。このフィルターは、適度にシャープなエッジを生成しますが、「Lagrange」フィルターで生成される可能性のある、大規模な画像拡大における顕著な勾配の変化はありません。基本的には、組み込みの「アンシャープリサイズ」(シャープ化されたリサイズ画像を参照)と同等ですが、シャープネスを制御できないため、シャープすぎると考える人もいます。 「Catrom」フィルターをさらに興味深いものにしているのは、2ローブの「Lanczos」フィルターとほぼ同じ三次相当であることです。これはおそらく最も一般的に使用されるウィンドウ化シンクフィルターです(以下を参照)。また、三次フィルターでこのフィルターを詳しく見ていきます。

補間とIMの補間設定

補間設定は、FX DIY演算子(「-fx」)やカラー検索置換演算子(「-clut」)などの演算子で、スケーリングされていない画像の「ポイント」ルックアップを生成するために使用されます。また、一部の古い円形歪み関数は、これらの単純な補間リサイズフィルターに基づいています。ただし、現在、これらは別々のコードを使用して実装されており、設定名も異なります。これらの補間設定には、「NearestNeighbor」が含まれ、「Point」(またはスケールされていない「Box」)フィルターを実装し、「BiLinear」を使用して、スケールされていない「Triangle」フィルターを取得します。余談:現時点では、スムーズ化された三角形フィルター「Hermite」は、補間設定として直接実装されていません。これは、非常に優れた補間フィルターであるため、残念です。

ガウスぼかしフィルター

周波数領域へのフーリエ変換の複雑な数学では、リサイズフィルターは、存在する可能性のある高周波ノイズを除去することを目的としています。このノイズは、実世界の画像がピクセルにサンプリングされることによって発生し、画像をリサイズすると、そのノイズがエイリアシングおよびモアレ効果として現れます。このため、ガウスベル曲線は、実世界の影響の理想的なモデルであるため、リサイズまたはリサンプルフィルターとして自然な初期候補になりました。

ガウス

[IM Output] ガウスフィルターは、周波数領域で同じ「ベル曲線」形状を生成する非常に特別なフィルターです。これにより、画像のフィルターとして非常に役立ちます。制御可能な方法でこの高周波ノイズを適切に除去することが保証されるためです。ただし、フィルターグラフを調べると、サンプリングポイントから1ピクセルの距離で、ゼロ以外の値が表示されます。実際、非常に高い値です。これにより、実際にはリサイズが行われていない場合でも、個々のピクセルのぼかしが非常に大きくなります。たとえば、ここでは、ガウスフィルターを使用して標準のIMロゴをリサイズし、通常IMフィルター(ここでは「Lanczos」、後で詳しく説明します)を再度使用しました。

  magick logo:  -filter Gaussian  -resize 150x logo_gaussian.png
  magick logo:                    -resize 150x logo_normal.png
[IM Output]
ガウス
[IM Output]
通常のリサイズ
よく見ると、左側の「Gaussian」でフィルター処理された画像は、通常のリサイズよりもぼやけていることがわかります。特に、杖の周りや魔法使いの帽子にある小さな星の詳細に関してはそうです。この画像のぼやけは、画像縮小におけるすべてのエイリアシング効果と、画像拡大におけるすべてのブロック効果を除去するために得られるトレードオフです。また、(完璧に適用された場合)リンギング効果を生成することはありません。しかし、そのすべては、結果として得られる画像に対する極端なぼかしという代償を伴います。
実際、大規模な拡大中、このフィルターは、正方形のドットではなく、丸いドットを生成します。たとえば、ここでは、中央に単一のドットがある3x3ピクセルの画像を大幅に拡大します。

  magick xc:red -bordercolor yellow -border 1 \
          -filter Gaussian   -resize 99x99  -normalize dot_gaussian.jpg
[IM Output]
ご覧のとおり、単一のピクセルが完全に円形のドットに拡大されます。ガウスフィルターおよびガウスのようなフィルターのみがこれを行います。

ガウスシグマエキスパートコントロール

ガウシアンフィルタは、特別なエキスパートオプション「-define filter:sigma={value}」を使用して、ガウス曲線の実際の「シグマ」値を指定することで直接制御できます。デフォルトでは、この値は「0.5」であり、これはボックスフィルタと同じサイズです。多くの場合、ガウシアンフィルタは本質的に「ぼやけたボックス」と見なすことができます。このエキスパートオプションは、フィルタのサポート範囲を縮小することなく、非常に小さなガウシアンブラーを作成できるようにするために追加されました(下記参照)。ただし、「シグマ」を大きくすると、フィルタがクリップされる可能性があります。そのため、「シグマ」値を大きくすると、デフォルトの「サポート」(2.0)も同様の量だけ増加します。これはデフォルトの「シグマ」値が増加した場合にのみ発生します。サポートのエキスパート設定を使用してこの自動的な効果を上書きできますが、通常は必要ありません。
filter:sigma」エキスパートオプションは、ガウシアンフィルタでのみ機能します。他のフィルタは、このエキスパートコントロールの影響を受けません。

他のフィルタのより一般的な制御は、ブラーフィルタのエキスパートコントロールを使用して実現できます。これについては後で説明します。

その他のガウシアン類似フィルター

[IM 出力]右側の比較グラフを調べると、「Quadratic」フィルタと、わずかに複雑な「Spline」フィルタが、「Gaussian」フィルタの重み付け曲線によく従っていることがわかります。そして、多項式関数であるため、計算もはるかに高速であり、それが元々発明された理由です。「Quadratic」はガウシアンフィルタよりもわずかにぼやけていますが、「Spline」フィルタはさらにぼやけており、同等のシグマ設定は約「0.65」です。これにより、「Spline」フィルタは、変更なしで提供される最もぼやけたフィルタになります。グラフを調べると、ガウシアンフィルタと同様に、補間フィルタとは異なり、サンプリングポイントから1.0の距離でゼロ以外の値を持っていることがわかります。これにより、近くのピクセルが色をマージし、表示されるぼかしの原因となります。「Spline」フィルタは1.0の距離で最大の値を持っているため、サイズ変更(または歪み)された画像で最も多くのぼかしを生成します。この余分なぼかしは、大規模な拡大で存在する可能性のある「ブロッキング」効果の最後の部分を取り除きます。シャープ化されたサイズ変更画像手法とともに使用して、結果に非常に小さな「階段効果」で線画を拡大できます。「Mitchell」フィルタも比較グラフに示されています。このフィルタも、サンプリングポイントから1.0の距離にぼかしがあり、他のフィルタと同様に、このフィルタをわずかにぼかしています。ただし、その曲線には負の重み付けもあり、リンギング効果(後でウィンドウドシンクフィルタを参照)を生成しますが、シャープなエッジ付近のぼかしを相殺します。

フィルターサポートエキスパートコントロール

ガウシアンフィルタは、IIR(無限インパルス応答)フィルタとして知られています。これは、使用する応答「曲線」がゼロに達しないことを意味します。つまり、サンプリングポイントからどれだけ離れていても、非常に遠いピクセルからの結果にゼロ以外の寄与が依然として存在します。数学的には、これは実際には良いことであり、結果が数学的にはるかに完璧になることを意味します。実際のアプリケーションでは、無限フィルタでは、元の画像のすべてのピクセルの加重平均を使用して、出力画像のすべての新しいピクセルを生成する必要があるため、非常に悪いことです。つまり、大きな画像では、このフィルタを使用して完璧にサイズを変更するのに非常に長い時間がかかります。ただし、「Gaussian」フィルタの場合、サンプリングポイントから約2ピクセル(デフォルトの「シグマ」設定の4倍)を超える範囲では、最終結果にほとんど影響がないため、通常は無視できます。シグマの3倍でさえ、一般的に妥当と見なされています。この範囲はフィルタの「サポートウィンドウ」として知られており、フィルタの実際の限界です。本当に必要な場合は、特別なエキスパート設定「-define filter:support={value}」を使用してフィルタの「サポート」を変更できます。
たとえば、ここでは、シグマ値の2-1/2倍である1.25という小さいサポート値を使用して、1ピクセルで画像をサイズ変更します(右側の結果のグラフを参照)。これはもちろん、一般的に受け入れられている最小値であるシグマ値の3倍よりも小さいです。


magick pattern:gray5 -crop 5x1+0+3 +repage pixel_5.gif magick pixel_5.gif -filter gaussian -define filter:support=1.25 \ -resize 300x pixel_gaussian.png
[IM Output]
[IM Output]
単一ピクセル画像
==> [IM Output]
ガウシアンフィルタ処理済み
[IM Profile]
画像のプロファイル
小さい「support」設定を使用することにより、「ステップ」(サポートウィンドウが関数をカットオフする場所)が1.25の位置に移動されました。これにより、フィルタのプロファイルでより大きな「停止」が生じ、拡大で確認できる「エイリアシング」効果が生じます。つまり、グラフの「ピーク」付近の揺れと、フィルタの「サポート」制限のエッジでの急激な「低下」です。「サポート」は、拡大された画像結果を生成するために一緒に平均化されるピクセル全体にわたるスライド式の「ウィンドウ」であると考えることができます。サポートサイズが1.25の場合、フィルタの合計サポート領域は幅が2.5ピクセル(画像拡大中にスケールされていない)であるため、水平サイズ変更フェーズには2つまたは3つのピクセルを含めることができます。このサポート「ウィンドウ」が画像上をスライドすると、各ピクセルが出入りするときに、フィルタの「曲線」に突然の「変化」が生成されます。つまり、結果にわずかな揺れが生じる原因です。つまり、これらのポイントでは、フィルタの重み付け曲線に従って、平均化されるピクセルの合計数にピクセルが追加または削除されています。これにより、サイズ変更された画像に4つの「揺れ」または「ジグザグ」が生成されます。単一の白いピクセルがサポート範囲に出入りするときに外側のエッジに最初の2つ、および2番目の黒いピクセル(3ピクセルの加重平均を作成)がサポート範囲に出入りするときに2番目の揺れのペアが発生します。フィルタにそのような突然の「停止」がない場合、つまり、フィルタがサポート制限設定でゼロになる場合、その「揺れ」は表示されず、目に見える効果もありません。「Gaussian」フィルタのデフォルトの「サポート」設定である「2.0」のような整数または半整数に設定されたサポートサイズを使用すると、新しいピクセルがサポート範囲に入るときは常に、別のピクセルが離れるように常に同じ数のピクセルがその平均の一部になることが保証されます。これにより、2つの中央の揺れがなくなりますが、サポート制限を示す外側の最初の揺れは削除されません。フィルタ内の急な勾配の変化(不連続性)でさえ、トライアングルラグランジュフィルタから発生するものなど、結果の画像に目に見えるアーティファクトを生成する可能性があります。
IM v6.3.6-3以前では、ガウシアンフィルタの「サポート」は「1.25」という値に設定されており、拡大時にリンギング効果(上記のような)を生成していました。このため、ガウシアンの「サポート」は、常に同じ数のピクセルが平均化されるようにし、小さなステップを減らすために「1.5」に変更されました。

IM v6.6.5-0以降では、ガウシアンのデフォルトの「サポート」設定が「2.0」の値に増加しました。これはフィルタの全体的な速度にはほとんど影響しませんが、「停止」を実質的に存在しないようにします。また、特にEWA歪み可変ブラーマッピングなど、このフィルタの他の特別な用途のフィルタコーディングも簡素化しました。

ただし、非常に大きなサポート設定を使用すると、より多くのピクセルを平均化する必要があるため、結果が実際に改善されることなく、サイズ変更操作が遅くなることに注意してください。通常、2.0を超えるサポートウィンドウを使用することで、より良い結果を得ることができるのは、ウィンドウドシンク/ジンクフィルタとラグランジュフィルタのみです。これらは「エキスパート」オプションであり、このオプションを使用すると、より良い結果ではなく、悪化させる可能性が高いことを忘れないでください。そのため、これらは単純なコマンドラインオプションではなく、特別な「-define」オプションを介して提供されます。もちろん、上記のように、物事をよりよく理解するために遊んでみることは歓迎されており、IMはこのオプションを提供しているため、まさにそれを実行できます。

フィルターブラーエキスパートコントロール

特別なエキスパートオプション「-define filter:blur={value}」を使用すると、フィルタが提供するぼかしの量を調整できます。値「1.0」はデフォルトのアクションを生成し、値が小さくなったり大きくなったりすると、全体的な「ぼやけ」が調整されます。基本的に、これはフィルタの曲線をX軸(サンプリングポイントからのピクセルの距離)に沿って線形に拡大または縮小し、通常はフィルタの全体的なぼかしを調整します。設定値を小さくすると、フィルタの関数(およびサポートウィンドウ)が小さくなります。ガウシアンおよびガウシアンのようなフィルタの場合、フィルタの「シグマ」値(デフォルト= 0.5)にこの「ブラー」係数を掛けた場合と同じ効果があります。この設定では、クリッピングを防ぐために、フィルタのサポートウィンドウも同じ量だけ拡大または縮小されますが、サポートのエキスパートフィルタ設定を使用して上書きできます。たとえば、ここでは、ガウシアンのようなスプラインフィルタを使用して、3つの異なる「ブラー」設定で画像のサイズを変更します。

  for blur in 0.5 1.0 1.5; do \
    magick logo: -define filter:blur=$blur -filter Spline \
            -resize 150x logo_blur_$blur.png; \
  done
[IM Output]
ブラー 0.5
<== [IM Output]
ブラー 1.0
==> [IM Output]
ブラー 1.5
ご覧のとおり、この特別な設定を使用すると、「Spline」フィルタの結果の全体的なぼやけを制御できます。フィルタブラー設定によって「サポートウィンドウ」のサイズもスケールされるため、非常に小さなスケール値を使用すると、リサンプリングですべてのピクセルを「見逃す」か、ゼロ重み付けされたピクセルのみが生成される可能性があります。その結果、規則的な「黒」の線やブロックが生成されます。例えば...

  magick rose: -define filter:blur=0.1 -filter Gaussian \
          -resize 100x100  rose_black_bars.png
[IM Output]
(ブラーによってスケーリングされる前の)サポートウィンドウのサイズを大きくすると、これらの影響を防ぐのに役立つ場合がありますが、ほとんどのフィルタは「自然な」サポート範囲外のピクセルに対してのみゼロの重み付けを生成するため、すべてのフィルタで機能するとは限りません。通常、サポート範囲全体で有用な非ゼロ値を生成するフィルタは、ボックスフィルタシンク/ジンクウィンドウフィルタのみです。フィルタのサポートが小さすぎて、常にサンプリングするピクセルを少なくとも1つ見つけることができない場合、円筒フィルタでも同様の効果が見られます。ラグランジュフィルタは、サポートのエキスパートフィルタ設定を使用して、「サポートウィンドウ」に合わせる適切な「次数」を決定し、さまざまな他の形式にポリモルフします(下記参照)。
負の重み付けを含むフィルタ(基本的に、次に調べるフィルタのいずれか)で不適切なサポート設定を使用すると、逆シャープニング効果と否定効果、および不釣り合いに強いエイリアシング効果が生じる可能性があります。まれに、無限の重み付けされた色(通常の非HDRIバージョンのIMでは純粋な黒と白にクランプされます)を生成することさえあります。

この特別なオプションをフィルタで使用する場合は、注意と専門知識が必要です。
IM v6.3.6-3以前では、「filter:blur」定義は、オプション「-support」によって誤って設定されていました。このオプションは、正確に何を行ったのかを非常に誤解させるものでした。このオプションは廃止され、使用できなくなりました。

ガウシアン補間フィルタバリアント

[IM 出力] ブラー制御の値が「0.75」であるガウス様フィルター、またはガウスフィルターシグマ制御の値が「0.375」である場合、私はこれをガウス補間器と呼ぶバリエーションが生成されます。このシャープ化されたガウスフィルターは、上で見た補間フィルターと似た特性を持ちます。しかし、拡大された画像で目立つ可能性のある急な停止やその他のグラデーションの変化は含まれていません。この点で、「ハーミット」フィルター(グラフ参照)に非常によく似ていますが、非対称な歪みがあり、補間器としてより適切に機能するようです。

  magick logo: -filter Gaussian -resize 150x logo_gaussian.png
  magick logo: -define filter:blur=0.75 -filter Gaussian \
          -resize 150x logo_gaussian_interpolate.png
[IM Output]
ガウス
==> [IM Output]
ガウス補間器
(ブラー=0.75 または シグマ=0.375)
実際、ガウスフィルターは、シャープすぎず、ぼやけすぎない、はるかに許容できる結果を生み出すことがわかりました。しかし、フィルターのブラー処理を減らすと、エイリアシング効果が強まり、低ピクセルレベルのパターンから大規模なモアレ効果が発生しやすくなります。これは、ブラー処理の少ない形式のフィルターを使用する場合のトレードオフです。

  magick rings_crop.png -filter gaussian -resize 100x100  rings_gaussian.png
  magick rings_crop.png -filter gaussian -define filter:blur=0.75 \
                              -resize 100x100  rings_gaussian_interpolate.png
[IM Output]
ガウス
==> [IM Output]
ガウス補間器
(ブラー=0.75 または シグマ=0.375)

窓関数 Sinc フィルター

Sincフィルター

数学的に、画像のリサイズ(2パスの「テンソル」リサイズ技術を使用)に最適なフィルターはSinc()関数であるとされています。(ナイキスト・シャノンのサンプリング定理を参照)。[IM 出力] 数学的に完璧なSinc()には、私が指摘したい特別な機能がいくつかあります。まず、フィルターの重み付け関数からのすべての整数距離で、値がゼロになります。これは非常に重要です。つまり、フィルターは(ガウスフィルターとは異なり)必要以上に画像をぼかしません。また、画像をリサイズせずに再サンプリングした場合(「noop」リサイズ)、画像はフィルターの影響をまったく受けません。したがって、非常に複雑ではありますが、補間フィルターです。Jinc()関数はSinc()と密接に関連しており、汎用画像歪曲演算子で使用されるような2次元フィルタリング用のフィルターとして役立つ特性を備えています。この関数については、後で円筒フィルターで詳しく説明します。今のところ、ウィンドウ化Jincフィルターの基本関数としても使用できることに注意してください。Sinc()ベースのフィルターとJinc()ベースのフィルター、およびこれまで見てきたフィルターとのもう1つの大きな違いは、多くの重みが負であることです。つまり、画像内の各ピクセルについて、最終的な色から近くの色ピクセルの一部を減算します。これは少し奇妙に思えるかもしれませんが、オブジェクトのエッジを強くシャープにします。もちろん、負の重みは一般に、曲線に沿ってさらに多くの正の重みによって相殺する必要があり、これにより、サンプリングポイントから長い範囲にわたって伸びる波のような関数が生成されます。これらの余分な正(および負)の重みの「ローブ」は、高コントラストの線画や、赤い屋根と青い空のような境界など、非常に強い色の境界を含む画像にリンギングアーチファクトを引き起こします。これらの関数のフィルターが不適切に適用されると、これらのリンギング効果はさらに顕著になる可能性があります。

窓関数

残念ながら、この関数はIIR(無限インパルス応答)関数でもあります。つまり、以前のガウスフィルターと同様に、無限まで効果が及ぶということです。つまり、「Sinc」を使用するには、宛先画像のすべての新しいピクセルに最適な表現を作成するために、画像(およびその外側)のすべてのピクセルの加重平均を生成する必要があります。これは非常にコストがかかり、これらの完璧なフィルターを直接使用することは現実的ではありません。リンギング効果のために、そうしたいと思うことはないでしょう。しかし、ガウスフィルターとは異なり、「Sinc」関数は、サンプルポイントから短い距離でゼロ近くまで減衰するだけではありません。実際、サンプリングポイントから10ピクセル離れた場所(上のグラフを参照)でも、最終結果にかなりの影響を与える可能性があります。ただし、サポート距離が10のフィルターを使用して画像をリサイズするには、最終結果でピクセルあたり少なくとも20x20または400ピクセルの平均化が必要です。そして、それは非常に遅いリサイズにつながります。その結果、生の「Sinc」フィルターを使用することはお勧めしませんし、ほとんど使用されませんが、専門家フィルターコントロールを使用することで、IMは本当にそうしたいのであれば、これを実行することを妨げません。推奨され提供されるのは、画像処理の専門家によって開発されたSinc関数の「ウィンドウ化」された形式であり、無限のSinc(およびJinc)関数をより実用的なサイズに「制限」するために使用できます。これらのウィンドウ化フィルターには、「Blackman」、「Bohman」、「Hann」、「Hamming」、「Lanczos」、「Kaiser」、「Welch」、「Bartlett」、「Parzen」などのフィルターが含まれます。

ウィンドウ化フィルターの仕組み

[IM 出力] たとえば、右のグラフには3つの関数が示されています(クリックして拡大表示を取得)。赤い関数は、無限に伸びる数学的に理想的なSinc()関数です。緑の関数は、単純なCosine()カーブに基づく「Hann」窓関数です。これはSinc()と乗算して、フィルターのより遠い成分を調整し、サポートウィンドウの端(このフィルターのデフォルトでは4.0ピクセル単位の距離)でゼロ(またはほぼゼロ)になります。基本的に、「-filter」の選択で「Hann」を選択することで、実際には「Hann()」「窓関数」を選択して、「Sinc()」(または「Jinc()」)などの「重み付け関数」を調整します。そのため、「窓化フィルター」は実際には2つの関数です。SincまたはJinc関数のいずれか(画像処理演算子によって異なります)と、フィルターとして使用するために特別に選択した「窓関数」です。(以下の専門家フィルターコントロールを参照)。
v6.3.6-3より前のIMは、実際には窓関数をフィルターの重み付け関数として直接使用するという大きな間違いを犯していました。これにより、これらのフィルター(Lanczosを除く)はすべて、リサイズに使用すると、ひどいエイリアシング画像を作成することになりました。その結果、フィルターはしばしば誤解されたり、IMユーザーによってめったに使用されませんでした。これは修正されました。

様々な窓関数フィルター

[IM 出力] 右は、この記事の執筆時点でIMが利用できるすべてのさまざまな窓関数のグラフです(後で追加されました)。そうです、窓関数は多くの信号処理専門家による集中的な研究の対象であったため、たくさんの窓関数があります。すべての窓化フィルター関数は、一般に、使用されている窓関数のクラスに応じて、Sinc(3または4ローブ)のサポートとして3または4のいずれかを使用してSinc(またはJinc)重み付け関数を調整するために使用されます(以下を参照)。たとえば、「Blackman」窓化フィルターは4ローブを使用しますが、「Lanzcos」は3ローブを使用します。これはIMバージョンに依存するため、確実にしたい場合は、詳細フィルター専門家オプションを確認してください。ご覧のとおり、すべての窓化フィルター関数は、元のSinc()関数のミュートされた形式も生成します。また、特定のフィルターが生成するリンギングの量以外に、ある窓化フィルターを別の窓化フィルターと区別するものはほとんどありません。おそらく最も優れた窓化フィルターの1つは「Lanczos」です。他の人は、「Blackman」、「Bohman」、「Hann」(コサインテーパベル)、「Hamming」(コサインベルバリアント)、「Cosine」(単一コサインローブ)を窓関数として強く推奨しています。これらの関数はすべて、定式化におけるSincまたはSine/Cosine関数の使用に基づいており、これにより、関数が優れた周波数応答を持つことが保証されていると考えられています。その他の窓化フィルターには、「Welch」(放物線)、「Parzen」(立方スプライン)、「Kaiser」(ベッセル)、およびおそらく最も単純な「Bartlett」(三角形または線形)が含まれます。通常、これらの関数は、そのシンプルさと高速な計算のために作成されましたが、一般的に「周波数応答」が低いと見なされています。また、これらの窓関数の多くは、それ自体がリサンプリングフィルターとして使用されます。たとえば、「Bartlett」(おそらくすべての窓関数の中で本当に異質なものです)は、実際には「Triangle」フィルターだけでなく、「Bilinear」補間フィルターにも使用されるのと同じ数学関数です。すべての関数(「Bartlett」を除く)は、窓関数の2つの基本的なカテゴリを形成します。
  • Hamming」、「Hann」、「Kaiser」、「Blackman」、「Bohman」、「Parzen」などのテーパー「ベル」型の曲線。
  • および、「Lanczos」、「Welch」、「Cosine」など、ウィンドウのサポートによって「カットオフ」される前に、すぐにゼロになる、テーパーのない「ローブ」タイプの窓関数。
上記のウィンドウ関数グラフを調べると、2つのスタイルのフィルターの形状がどのように異なるかがわかります。しかし、ウィンドウ関数の2つのカテゴリーは、三角関数で定義された曲線から得られる全体的な「周波数応答」ほど重要ではないようです。テーパリングされた「ベル」型のウィンドウ関数は、Sinc重み付け関数(または円筒(歪み)リサンプリングにおけるJinc関数)の4つのローブにわたってローブサポートを使用します。テーパリングされていない「ローブ」型のウィンドウフィルターは、デフォルトで3ローブサポートを使用します。これは、ウィンドウ関数のロールオフの違いにより、2つのタイプのウィンドウフィルター間でほぼ同等になります。また、テーパリングされていないウィンドウフィルターは、デフォルトではテーパリングされたフィルターよりもわずかに高速になります。フィルターが持つべきデフォルトのローブ数については、IMフォーラムのディスカッション「コサインウィンドウの追加?」で議論されました。もちろん、必要に応じて、ローブサポートや、任意のリサイズフィルターの一般的なサポートを変更できます。それらはすべてほぼ同じで、生成されるリンギングやブロッキング効果の量にわずかな違いがあるだけです。[IM Output]右に示すのは、IMによって関数のテーパー/非テーパーの性質に従って定義されたデフォルトのローブサポートを使用した同じウィンドウ関数です。最初の2つのローブ(最も影響力のある主要なローブ)では、どのフィルターの間にもほとんど違いがなく、すべてがその範囲にわたって非常に類似した「ロールオフ」を示していることがわかります。ただし、関数の順序はあまり変わっておらず、「Welch」と「Parzen」の間で極端な状態が維持されており、「Lanczos」が結果の曲線ロールオフの中間に位置しています。[IM Output]そして、右に示すのは、上記のデフォルトを使用してこれらのウィンドウ関数を選択したユーザーによって提供される、結果として得られるウィンドウ化されたsincフィルターです。ご覧のとおり、最終的な重み付け曲線はすべて非常に類似しており、予想どおり、すべてが「Welch」と「Parzen」の極値の間で挟まれています。これらのさまざまなウィンドウ関数のほとんどの詳細な定義とグラフ、およびフーリエ周波数スペクトルでの結果については、Wikipedia、ウィンドウ関数で確認できます。
まとめ:これらのさまざまなウィンドウ関数の結果には、大きな違いは見られませんでした。また、研究論文の結果を読んだ限りでは、どれも具体的なものではなく、その適合性に関する定性的な意見のように思われました。私の考えでは、ほぼすべてのウィンドウ関数を使用できますが、1つを選ぶとしたら、最も一般的な「Lanczos」ウィンドウフィルターに固執するのが良いでしょう。上記のすべてのフィルターの中間に位置し、優れた周波数スペクトル応答を持ち、一般的にリサンプリングフィルターとして優れた選択肢です。一方で、ImageMagickのリサンプリングフィルターの開発に尽力してきた画像処理の専門家は、これに同意しません。彼は、特定の画像の正確な要件に基づいてフィルターを選択しているためです。彼の提案とコメントについては、Nicolas Robidouxが推奨するテクニックをご覧ください。

ランチョスフィルター

私たちはすでに「Lanczos」フィルターを何度か言及しました。これは、ウィンドウ化フィルターの中で最もよく知られているものであり、今まで見てきたウィンドウ化フィルターの範囲の中間に位置しています。基本的には、速すぎず、遅すぎず、「ロールオフ」せず、結果のフーリエ変換で優れた周波数応答を持ちます。基本的に、「Lanczos」はあらゆる種類のフィルター作業の優れた出発点となり、最近のウィンドウ化Jinc円筒フィルターの開発で広く使用されています(下記参照)。「Lanczos」フィルターは、基本的にSinc()関数の最初の「ローブ」を使用して、Sinc()関数をウィンドウ化します。つまり、フィルターの重み付け関数は、フィルター自身のウィンドウ関数を設定するために使用されます。多くの人が、これを他の多くのウィンドウ化されたSincフィルターよりも選択する理由として捉えています。それが最良であるという実際的な証拠はほとんどありませんが、堅実な中間レンジフィルターです。デフォルトでは、IMは「Lanczos」フィルターを3つの「ローブ」を持つものとして定義しています。その理由は、ウィンドウ関数自体が「テーパーされていない」ためです。つまり、単一のローブが切り取られ、関数の最初のゼロ交差がウィンドウサポートの制限と一致します。上記のウィンドウ化フィルターの仕組みをご覧ください。[IM Output]ただし、2ローブの「Lanczos2」フィルター(ユーザーが簡単に選択できるように追加された、デフォルトのローブが2のLanczos)も人気があることがわかっています。これは、ウィンドウ化されたSincフィルターによって生成される可能性のある正のリンギングアーチファクトを回避できるためです。「Catrom」(実際には「Catmull-Romフィルター」)は、「Lanczos2」フィルターとほぼ同じですが、Cubicフィルターであるため、数学的に生成する方がはるかに高速です。ただし、これは通常、IMが画像を処理する前にフィルター値をキャッシュする方法では問題になりません。そうは言っても、IMフォーラムでの長いディスカッションでは、直交(テンソル)リサイズの場合、4ローブの「Lanczos」は、実際には画像を縮小するのにより適しており、微細なパターンを持つオブジェクトの画像でのモアレを防ぐことが示されていますが、リンギングが増えるという犠牲を払います。

ローブにおけるウィンドウサイズ

私が述べたように、基礎となるSinc(およびJinc)フィルター関数は、実際にはサイズが無限大です。ただし、デフォルトでは、IMは指定されたウィンドウ関数を使用して、それらをはるかに小さく、より実用的なサイズに制限します。ただし、はるかに大きく、遅いウィンドウ(サポート)サイズを使用して、画像のより正確で、より正確なサイズ変更を試したい場合もあります。これは、ガウスライクフィルターの場合と同様に、フィルターサポートエキスパートコントロールを使用して、非常に簡単に行うことができます。ウィンドウ関数自体は、(ほとんどの場合)Sinc(およびJinc)をサポート設定範囲でゼロに減らします。しかし、ウィンドウ関数が「サポート」ウィンドウに合うようにスケーリングされると、結果のフィルター関数も変化します。[IM Output]たとえば、右に、さまざまな「サポート」設定(2〜8)を使用した、Sinc()関数を基準とした「Lanczos」ウィンドウフィルターをグラフ化しました。フィルターの実際のサイズは、使用される実際のサポートサイズによって制限されることに注意してください。「サポート」が小さいほど、フィルターは高速になりますが、関数が数学的に理想的なSinc()関数に正確に従うことは少なくなります。グラフ化された各曲線を見てください。「緑」(サポート=2)の曲線には、中央のメインピークと、1つの負の「ローブ」(「Lanczos2」フィルターと同等)しかありません。この後、関数はゼロになり、使用されません。次の「紫」(サポート=3、およびデフォルトの「Lanczos」フィルター)の曲線は、はるかに大きい最初の負の「ローブ」と、より小さい正の「ローブ」を持っています。これは、サポートサイズが整数刻みで増加するにつれて、より多くのローブが追加されることで継続します。追加のローブは高さが小さくなり、最終結果への影響が少なくなり、初期の「ローブ」が高くなります(影響力が大きくなり、リンギング効果が増加します)。最適な効果を得るには、その中に上下の「ローブ」を多く持つフィルターを生成するために、サポート設定を使用します。つまり、ウィンドウ関数を持ち、フィルターの「サポート」が「ゼロ交差」で終了します。ただし、Sinc()関数は整数「サポート」設定で「ローブ」(ゼロ交差)を持ちますが、Jinc()重み付け関数はそうではありません。これは、歪みオペレーターで使用されているフィルターのサポートウィンドウを調整したいユーザーにとって問題になります。実際、Jinc()は、非常に無理数の位置に「ゼロ交差」を持っています。これらのゼロ交差は、数学の専門家でなければ、非常に困難です。フィルターを「ローブ」の数で簡単に設定できるようにするために、もう1つの特別な設定「-define filter:lobes={integer}」が作成されました。フィルターが一般歪みオペレーターなどの2次元画像リサンプリングオペレーターによって使用されている場合、通常はJinc()を基本関数として使用し、フィルターの最初の20個のゼロ交差のテーブルを調べ、その値に「サポート」設定を設定します。これは、Jinc()関数の適切なサポート設定を見つけようとする必要がなく、使用したいローブの数を指定するだけでよいことを意味します。このため、フィルターに含める「ローブ」の数でウィンドウ化されたSincまたはJincフィルターを指定する方が、より直接的な「サポート」設定を指定するよりも優れています。フィルター定義にSinc()関数もJinc()関数も使用されていない場合、「filter:lobes」設定を使用して、フィルターの使用に適した「サポート」設定を計算します。ただし、「filter:support」設定は、指定された「filter:lobes」設定よりも優先されるため、特に一般歪みオペレーターを使用する場合は、「filter:lobes」エキスパートオプションのみを定義することをお勧めします。

ラグランジュフィルター

ガウス」フィルターが数学的に遅い関数であるように(IMの結果のキャッシュのおかげで、全体的な速度にはそれほど影響しませんが)、Sinc/Jincウィンドウ化フィルターは、重み付け関数とウィンドウ関数の両方で使用する三角関数を計算する必要があるため、さらに遅く、計算が複雑になります。ただし、「Lagrange」フィルターは、ウィンドウ化されたフィルターを近似するために、区分的な3次多項式関数を生成します。(Wikipedia:ラグランジュ多項式を参照)。ウィンドウ化フィルターサポート設定に従って調整可能であるように、「Lagrange」フィルターもその設定に従って自身を調整します。デフォルトのサポート設定2.0は、「Lagrange」フィルター(次数3)を生成します。このフィルターは、画像の拡大と縮小の両方に非常に優れており、ブロッキングリンギング効果を最小限に抑え、ブラーリング効果はありません。
サポートエキスパートコントロールは、実際には使用する必要があるラグランジュフィルターの「次数」を定義しています。つまり、デフォルトの2.0サポートラグランジュフィルターは、次数3のラグランジュフィルターを生成します(次数=サポート×2-1。したがって、サポート= 2.0 =>ラグランジュ-3フィルター)。そのため、実質的に半整数サイズの範囲でのみ設定を使用できます。

したがって、ラグランジュ次数4フィルターを取得するには、オプション
  -define filter:support=2.5を使用します
[IM Output] より大きなサポート設定を使用すると、'Lagrange'フィルターは、複雑な三角関数計算や追加のウィンドウ関数を必要とせずに、ウィンドウド Sincフィルターを生成します。サポート設定が大きいほど、フィルターはSinc()関数に近づきますが、計算も遅くなります。(左の大きなサポートラグランジュフィルターのグラフを参照)。
[IM Output] より小さなサポート設定と'Lagrange'フィルターを使用すると、様々な補間フィルターのほとんどをエミュレートします。つまり、サポートサイズが'0.5'の場合、'Box'フィルターを生成し、'1.0'の場合、'Triangle'フィルターを生成します。サポート設定は、半整数単位での調整に限定されており、他のサポートファクターを使用してもあまり効果的ではありません。
[IM Output] もう一方の半整数のサポートであるラグランジュフィルター(偶数次を生成)は、非常に不連続なフィルター重み付けのセットを生成します。また、'Box'フィルターと同様に、強力なブロッキングリサイズアーティファクトを生成する可能性があります。一方、小規模なリサイズの場合、これにより、非常に小さなリサイズ調整でも画像がシャープに保たれます。これらの「偶数」次数の「Lagrange」フィルターは、このフィルターを使用する主な欠点を示しています。それは、重み付け関数が「滑らかな」勾配ではないということです。大規模な拡大では、生成された勾配に目に見える変化が生じる可能性があります。ただし、極端なケースを除いて、これはめったに問題になりません。基本的に、現在の「サポート」設定に適したフィルターを、設定の大小に関わらず普遍的に作成するフィルターを表します。これは自己ウィンドウ化リサイズフィルターです。
'Lagrange'フィルターは、IMバージョンv6.3.7-1までは完全に定義されておらず、使用可能ではありませんでした。

キュービックフィルター

多くの画像専門家が画像リサイズのためにより良く、より高速に計算できるフィルターを見つけようとしていたとき、フィルターのファミリーが進化し、キュービックフィルターとして知られるようになりました。これらは以前に示されたラグランジュフィルターによく似ており、より小さな固定された区分的なセクションのセットで構成されていました。しかし、ラグランジュフィルターとは異なり、ピースは滑らかなカーブを形成するように設計されており、鋭いブロッキング効果を低減します。[IM Output] 左のグラフに示されているのは、IM内で事前に定義されており、リサイズフィルターとしてよく知られている4つの「滑らかな」キュービックフィルターです。「Spline」フィルター(一般的な「Cubic」フィルター関数のエイリアスおよびデフォルト設定としても使用)は、ガウシアンぼかしフィルターをエミュレートします。この曲線は「B-スプライン」補間曲線としても知られており、ポイントのコレクションを通して滑らかな線を描くためにもよく使用されます。また、アニメーションのカメラやオブジェクトの動きにもよく使用され、ユーザーが提供したコントロールポイントを介して滑らかな流れを生成します。また、「Catrom」またはより正確には「Catmull-Romフィルター」または「Keys Cubic Convolution」も表示されています。これは、滑らかでぼやけない形式の補間フィルターを生成します。ただし、わずかにオーバーシュートする可能性があります。基本的には理想的な自己シャープ化フィルターであり、基本的なバイキュービック補間にも一般的に使用される関数です。そして最後に、「Hermite」キュービックフィルターです。これは、滑らかな三角補間フィルターの一種であり、入力座標で滑らかに減衰(ロールオフ)します。基本的には、元の画像のフラットな「カラーレベル」を維持しながら、強いエッジを丸めます。

キュービックフィルターファミリー

上記は、キュービック曲線の最も一般的な「名前付き」フィルターですが、特定のキュービックフィルターのファミリーにも属しています。キュービックの「B-スプライン」ファミリーは、結果の様々な程度のぼかしと基本的に同等です。通常、非常にぼやけたSpline」フィルターから、エッジを丸めていますが、ブロック状の「Hermite」フィルターの結果までさまざまです。次に、「カーディナル」ファミリーがありました。これは、ブロッキングリンギングアーティファクトの妥協点となるフィルターを生成し、「Catmull-Romフィルター」('Catrom')がこれらのアーティファクトのバランスの取れた妥協点として進化しました。次に、これら2つのファミリーが統合されて、「Keysキュービックフィルターファミリー」が形成されました。これは、「Catmull-Romフィルター」(Keys α = 0.5)を「B-スプラインキュービックフィルター」(Keys α = 0.0)とリンクしました。Keysフィルターファミリーには、画像全体に存在する可能性のある線形(アフィン)勾配を保持するという特別な特性もあります。Keysファミリーフィルターのリンギングぼかし効果は、画像に色の滑らかな勾配ではなく、強い色の変化が含まれている場合にのみ有効になります。種類の多さに混乱しましたか?もちろんそうです。誰もがそうでした!問題は、フィルターの結果が、画像、使用している「ファミリー」の制限に依存して、非常に主観的であることが多いことです。優れたフィルターとは何かは、誰に尋ねるか、拡大しているか縮小しているか、処理している画像によって大きく異なりました。ある意味では、今でも混乱しています。私がこのまとめを始めるまでに、2年以上のあいまいな研究、読書、そして様々なフィルターを使った実験が必要でした。そして今でも進化し続けています。画像リサイズは非常に主観的な分野であり、実際に定量化することは不可能であることが証明されています。完璧なリサイズなどというものは存在しません。

ミッチェル-ネトラバリフィルター

この中で、ドン・P・ミッチェルとアルン・N・ネトラバリは、「コンピューターグラフィックスの再構成フィルター」という論文を発表しました。これは、「B」(「B-スプライン」曲線に使用)と「C」(「カーディナル」曲線に使用され、「Keys」フィルターのα値に相当)として知られる2つの変数を公式化しました。これらの2つの値を使用すると、滑らかに適合する(連続的な一次導関数)区分的なキュービックフィルターを生成できます。[IM Output] さらに重要なことに、彼らは次に、9人の画像処理専門家のグループを調査しました。彼ら自身の意見に頼るだけでなく、さまざまなBとCの値を使用して画像をわずかに拡大することによって生成されるアーティファクトを分類しました。その調査の結果は、右側の再現された図に示されています。「緑」の領域は、専門家が許容できる結果を生み出すと見なした値を表し、他のさまざまな領域はさまざまな種類のアーティファクトを生成します。この画像は、さまざまなアーティファクトと生成できるさまざまな種類のフィルターとの関係を実際に示しているため、重要です。また、この結果から、Keysファミリーのフィルターが、優れたキュービックフィルターを生成するためのより良い方法の1つとして、非常に重要になった理由もわかります。そのフィルターは基本的に、画像処理専門家によって「許容できる」と見なされた領域を直接通過する線上に位置していました。この調査から、ミッチェルとネトラバリは、最適なフィルターは「Keys」ファミリーフィルターであり、許容できる領域の中央に位置し、B、Cの値は1/3、1/3であると判断しました。このフィルターは現在「ミッチェル-ネトラバリフィルター」として知られており、IMでは「Mitchell」フィルター設定として利用できます。基本的に、すべてのリサイズアーティファクトの妥協点です。また、IM画像拡大に使用されるデフォルトのフィルターでもあります。すべての組み込みの「名前付き」キュービックフィルター:'Mitchell'、'Robidoux'、'Catrom'、'Spline'、および'Hermite'も、上記の図でマークされており、それらの特定のフィルターについて専門家がどのように考えているかを示しています。また、「B-スプライン」、「カーディナル」、および「Keys」フィルターファミリーを表す線も示されています。内部的には、これらのすべてのフィルターはフィルターの事前定義されたB、C設定のみが異なり、実際、IMは同じ内部関数を使用して、これらのフィルターを定義するための異なるB、C設定のみで、すべてのキュービックフィルターを生成します。

キュービックB、Cエキスパートコントロール

特別なエキスパート設定を使用して、キュービックフィルターが使用しているB、C設定を設定できます。これを行うには、一般的な「Cubic」フィルター「関数」(または他の名前付きキュービックフィルターのいずれか)と、目的の「b」および「c」のエキスパート設定を選択する必要があります。例:
   -filter Cubic
   -define filter:b=value
   -define filter:c=value
エキスパート設定は、リサイズまたは歪み演算子で使用される場合、指定されたフィルターの内部デフォルトを上書きします。そのため、上記のオプションの順序は関係ありません。「-define」または「-set」を使用して、画像処理演算子が使用される前に、必要なすべてのグローバルエキスパート設定を定義または設定する必要があります。 'b'または'c'設定のいずれかが定義または設定されていない場合、Keysファミリーフィルター(ミッチェル-ネトラバリ調査図の点線に沿って)が必要であるという前提に基づいて、他の値からその値が計算されます。 'c'はKeysα設定と同等であり、'b'はキュービックスプラインの「ぼかし」設定と考えることができます。これらのエキスパート設定は、ユーザーが画像リサイズを「調整」して、必要なものを正確に取得するための優れた方法を提供します(リサイズまたは歪みを使用しているかどうかに関係なく)。 「b」設定は、2つのうち理解しやすい方です。「b」を「ぼやけ」と考えてください。 b=0の値は非常にシャープ(Catmull-Romフィルター)であり、負のハローリンギングといくつかのエイリアシングまたはモアレ効果を生成する傾向があります。 b=1の値は、過度にぼやけた(スプラインまたはガウスのような)効果を生成する傾向があります。これにより、専門家(または通常のユーザーでさえ)がこの値を調整して、自分にとって「良い」フィルターを見つけるのが簡単になります。
右は、特に「名前付き」キュービックフィルターのB、C値の表です。 'Hermite'は、'Keys'フィルターファミリーの一部ではない唯一の組み込みキュービックフィルターであることを忘れないでください。また、すべてのBCキュービックフィルターの中で最も小さいサポート('1.0')を持ち、負のローブを含んでいません。 'Robidoux'および'RobidouxSharp'フィルターは'Mitchell'と非常によく似ていますが、調査の結果ではなく、円筒フィルターとして特別な用途のために数学的に決定されました。 'Robidoux'フィルターは、一般的な歪み演算子(下記参照)で使用されるデフォルトのフィルターです。  
フィルター B
 ぼかし 
C
Keys α
エルミート 0.0 0.0
スプライン 1.0 0.0
キャットロム 0.0 1/2
ミッチェル 1/3 1/3
ロビドゥ 0.3782 0.3109
ロビドゥ
シャープ
0.2620 0.3690
ロビドゥ
ソフト
0.6796 0.1602
'Parzen'ウィンドウフィルターは、ウィンドウ関数として'Spline'フィルターを使用します。そのため、このウィンドウフィルターをB、Cエキスパートオプションで再定義できます。これがどれほど有用であり、その結果として得られるウィンドウドSinc(またはJinc)にどのような影響を与えるかは不明であり、推奨されません。

円筒フィルター- 歪みの場合

すでに何度か触れているように、Distortオペレーターは、Resizeオペレーターとはわずかに異なる方法で、フィルター設定を使用して画像をリサンプルします。具体的には、Distortは、ソース画像のサンプリング領域内の「サンプルポイント」と実際のピクセル間の「半径方向」距離を使用してフィルターを適用し、各ピクセルの重みを決定し、それによってサンプルポイントでの最終的な色を決定します。Resizeは対照的に、直交配置されたフィルターを使用して画像を2回処理します。X方向、次にY方向にもう一度処理するため、画像の単純な矩形サイズ変更に限定され、仮想ピクセルの使用は伴いません。つまり、Distortは、X軸またはY軸に沿ってだけでなく、あらゆる方向での回転や可変スケーリング(伸縮)を含む、画像の自由形式の歪みを可能にするために、「ボックス」形状ではなく「円筒」形状を作成するためにフィルターを適用すると言えます。このため、フィルター自体は、このタイプの使用のために調整したり、特別に設計する必要があることがよくあります。

補間円筒フィルター

ここでは、同等のResizeおよびDistortオペレーターを使用して、単一ピクセル画像を30倍に拡大するために「Box」フィルターを使用します。

  magick xc:  -bordercolor black -border 1 \
          -filter Box   -resize 3000%      dot_resize_box_black.png
  magick xc:  -bordercolor black -border 1 \
          -filter Box   +distort SRT 30,0  dot_distort_box_black.png
[IM Output]
Resize
[IM Output]
Distort
ご覧のとおり、「Box」フィルターを円筒フィルターとして使用すると、円(または3次元では円柱)が得られます。ただし、フィルターの処理方法のため、2つのピクセルが(均等に)サンプリングされて完璧な中間色の灰色になる領域があります。円筒ボックスフィルターは、ソース画像を、互いにブレンド(加算ではなく)された一連の重複する円形ピクセルに変換すると考えることができます。以下は、「円筒ボックス」フィルターを使用して拡大するための画像の拡大結果の、よりカラフルな例です。

  magick \( xc:red   xc:white xc:black +append \) \
          \( xc:blue  xc:lime  xc:white +append \) \
          \( xc:black xc:red   xc:blue  +append \) -append \
          -filter Box   +distort SRT 30,0  color_box_distort.gif
[IM Output]
歪んだ画像では、これらの円形ピクセルも一連の重複する楕円に歪められます。例:

  magick \( xc:red   xc:white xc:black +append \) \
          \( xc:blue  xc:lime  xc:white +append \) \
          \( xc:black xc:red   xc:blue  +append \) -append \
          -alpha set -virtual-pixel transparent -filter Box \
          +distort Perspective '0,0 0,0  0,3 0,90 3,0 90,30 3,3 90,60' \
          color_box_distort.png
[IM Output]
円筒「Box」フィルターのサポート「半径」は、「0.5」から「0.707」(sqrt(2)/2)に増加します。これにより、フィルターは常に円形サンプル領域(対角線)に少なくとも1つのソースピクセルを見つけることが保証されます。これは、円筒フィルターの最小限の実用的なサポートサイズです。

他のフィルターには、サポートの増加を必要とするこのカバレッジの問題はありません。
サポートが少なくとも「0.707」でない場合、フィルターがすべてのソースピクセルを「見逃す」画像領域が発生し、リサンプリング失敗が発生する可能性があります。

より大きなサポート設定を使用すると、興味深いパターンも生成されます。「円」が大きくなるにつれて、より多くのピクセルがブレンドされます。例:

  magick \( xc:red   xc:white xc:black +append \) \
          \( xc:blue  xc:lime  xc:white +append \) \
          \( xc:black xc:red   xc:blue  +append \) -append \
          -filter Box -define filter:support=0.83 \
          +distort SRT 30,0  color_box_distort_overlap.png
[IM Output]
結果は、一種の円形のブレンド補間になります。

1.0以上のサポートでは、すべてのリサンプルは、少なくとも2つのピクセルの「ボックス」または「平均」ブレンドになります。


以下は、多数の補間フィルターの比較です。オーバーシュートとアンダーシュートを確認できるように、グレーの色を使用しています。上段は直交サイズ変更を使用し、下段は円筒歪みを使用しています。

  for filter in box triangle hermite lagrange catrom
  do
    magick xc:gray80  -bordercolor gray20 -border 2 \
            -filter $filter   -resize 2000%      dot_resize_$filter.png
    magick xc:gray80  -bordercolor gray20 -border 2 \
            -filter $filter   +distort SRT 20,0  dot_distort_$filter.png
  done
[IM Output]
[IM Output]
ボックス
[IM Output]
[IM Output]
トライアングル
[IM Output]
[IM Output]
エルミート
[IM Output]
[IM Output]
ラグランジュ
[IM Output]
[IM Output]
キャットロム
結果は似ていますが、フィルターが適用される2つの異なる方法によって、内部および外部(リンギング)の両方で異なるスタイルのアーティファクトが生成されていることがわかります。内部アーティファクトは、「三角形」フィルターで特に顕著です。ただし、補間フィルターは歪んだ画像の極端な縮小(縮小)には特に適していないが、拡大(拡大)には非常に適していることを覚えておいてください。

円筒ガウシアン

直交「サイズ変更」と円筒「歪み」形式の間で結果に違いが生じないフィルターの1つは、特別な「ガウシアン」フィルターです...

  magick xc:red -bordercolor yellow -border 1 \
          -filter Gaussian   +distort SRT 33,0  -normalize  dot_distort.jpg
[IM Output]
これは実際にはこのフィルターの特別な特性(分離可能性として知られている)の1つであり、多くの円筒リサンプリング実装がデフォルトフィルターとして使用する理由の1つです。元のEWA論文のデフォルトでしたが、結果が非常にぼやけています。ImageMagickも歪みが最初に実装されたときに使用しましたが、今はもう使用していません。直交サイズ変更の場合と同様に、「ガウシアン」フィルターは、特別な「リング」画像に適用した場合でも、結果の画像にエイリアシングアーティファクトをまったく生成しません。しかし、このコストは、歪みがほとんどまたはまったく関与していない場合でも、ぼやけた結果をもたらします。同様に、シグマエキスパートコントロールに関する議論で説明したように、このフィルターを補間フィルターの一種として使用することもできます。
IM v6.6.5-0以降、IMはデフォルトで画像歪みにこのフィルターを使用しなくなりました。代わりに、よりシャープな結果を生み出すように特別に設計された別のフィルター「Robidoux」フィルターが使用されます。

いずれにせよ、このバージョン以前は、実装上の間違いにより、歪みも非常にぼやけていました。古いバージョンを使用していて、画像歪みを使用する場合は、アップグレードしてください。

IM v6.6.7-6より前は、IMは円筒ガウシアンに、1/2の代わりに1/sqrt(2)または近似的に0.707のわずかに大きい「シグマ」値を使用していました。これにより、わずかにぼやけた結果になり、エイリアシングアーティファクトを減らすことができました。

これは、円筒ボックスフィルターのより大きなサポートをガウシアンフィルターに渡すという研究論文の推奨に従うことによって作成された間違いでした。提示された理由は、ガウシアンは本質的にぼやけたボックスであるということでした。そうではありません。ガウシアンはぼやけたインパルスであり、ぼやけたボックスではありません。このバージョンではその間違いが修正されました。つまり、ガウシアンフィルターを使用すると、サイズ変更または歪みのいずれでも同等の結果が得られるはずです。

個人的には、このわずかに大きいシグマ値を使用すると、線画の拡大時にエイリアスされた斜めのエッジに沿った「ブロッキング」アーティファクトが確かに滑らかになることがわかりました。しかし、それは特別なケースです。

ウィンドウ化Jinc円筒フィルター

[IM Output] Jinc()関数(「ベッセル」フィルターと不正確に呼ばれることもあります)は、円筒フィルタリング操作で使用する「Sinc」の同等物です。Sinc()に非常によく似ており、密接に関連していますが、直交方向(軸に揃えられた方向)のみではなく、半径方向または円筒距離を使用して値の矩形配列をフィルター処理するように設計されています。提供されたJinc()関数のグラフを見ると、最初の「ゼロ交差」、つまり近傍の最初のリングが、1.0(直交近傍の場合)と2の平方根の間の値になっていることがわかります。つまり、ゼロ交差の近似値は「1.2196699」です。Jinc()関数の動作方法は、サンプリングポイントが実際のピクセル値と等しい場合、Jinc()関数は、わずかに近い直交近傍ピクセルに正の値を割り当てますが、わずかに遠い対角近傍ピクセルに同様の負の値を割り当て、2次元の値の配列をさらに移動します。その結果、スケーリング(歪み)が実行されていない場合、理論的には近傍の寄与は互いに打ち消し合うはずです。これが、Jincフィルターが、正方配列の円筒リサンプリングに対する数学的に好ましいソリューションであり、したがって、Distort楕円リサンプリング法(EWA)の「理想的な」フィルターである理由です。これは、人間的な観点から見て「完璧な」フィルターであるという意味ではありません。このため、Distortオペレーターを使用中にウィンドウ化フィルターを選択すると、通常の「Sinc()」関数が同等の「Jinc()」関数に置き換えられます。Jinc()関数には、ゼロ交差が整数ではない位置にあるため、ウィンドウ化Sincフィルターで上記で導入した特別なローブサポート設定でフィルターのサポートを指定することが非常に重要です。「ウィンドウ化Jinc」フィルターを使用する最大の問題は、ソース画像にピクセルレベルのハッシュパターン(たとえば、「pattern:gray50」で提供される、組み込みパターンを参照)が含まれている場合です。この状況では、すべての直交近傍が対角近傍とは異なるため、画像は「Jinc()」関数によって大幅にぼやけます。ただし、線、エッジ、角など、ほぼすべての他のパターンは、「ウィンドウ化Jinc」フィルターを使用すると非常にシャープでクリアなままなので、それでも使用するのに適した関数です。この「問題」は良いことである可能性があります。つまり、2次元円筒Jinc派生フィルターを、色数削減ディザによって生成されたものなど、画像から強力なピクセルハッシュタイプのパターンを削除する方法として、画像の残りの部分のシャープネスに大きな影響を与えることなく使用できることを意味します。つまり、「ディザ削除方法」(下記参照)として使用できます。

No-Opケースでの歪みとフィルター

理想的には、no-op歪みはまったく同じ画像を返す必要があります。しかし、以前の例で見たように、これは実際には起こらない可能性があります。サイズ変更(2パス1次元)フィルター:Lanczos(Sinc-Sinc)、Lanczos2、Catrom、Hermite、Triangle、および他の多くのサイズ変更フィルターには、このプロパティがあります。画像がスケーリングされていない場合、ピクセルパターンは正確に保持されます。一方、ガウシアン、キュービック、クアドラティックなどの平滑化またはぼかしフィルターは、ほぼno-opケースに適用すると画像をぼかします。サイズ変更フィルターのデフォルトであるMitchell-Netravaliでさえ、基本的にはBスプライン「キュービック」平滑化フィルターとキュービック2ローブsinc相当のCatmull-Romフィルターのブレンドであるため、いくつかのぼかしが含まれていることに注意してください。
サイズ変更オペレーターは、デフォルトでそれ自体を短絡するため、no-opケースでは何も実行しません。したがって、フィルターを特に指定しない限り、「no-op」サイズ変更を生成することはできません。

歪みはno-opケースで短絡することは決してありません。これは、歪みスケーリングが「no-op」ケースを通過する可能性のあるアニメーションの一貫性を確保するためです。これは通常、サイズ変更では懸念されないことです。

多くのリサイズフィルターは、操作なしの場合でも画像を保持しますが、円筒(歪み)メソッドは、基本的に完全な操作なしの歪みを生成することはありません。操作なしの歪みは、画像自体は歪んでいなくても、少なくとも画像の色をわずかに歪ませます。これは、円筒フィルターを使用すると、直交する近傍ピクセルの寄与が、対角の近傍ピクセルの寄与とは異なるためです。これらは、操作なしの場合に実際のピクセルを中心とするルックアップポイントからの距離が本質的に異なります。 'Jinc'関数は、直交する近傍の寄与を対角の近傍の寄与で打ち消すことによって、この色の歪みを減らそうとします。これは、実際には数学的な定義の一部です。最悪の場合、「ピクセルレベルのハッシュ」では、すべての対角ピクセル近傍は、すべての直交ピクセル近傍とは異なります。この場合、フィルターの重み付けは、寄与を打ち消すのではなく、強調します。その結果、このタイプの画像は、「ピクセルレベルのハッシュ」を含む画像の操作なしの歪みに対して、非常に深刻な色の歪みを生成する傾向があります。たとえば、ここでは、この特別な特性を使用して、画像からハッシュパターンを削除します。スケーリングは使用されておらず、画像に対して2次元の「畳み込み」が適用された歪みのみが使用されています。

  magick -size 100x100 pattern:gray50  hash.png
  magick hash.png -filter Lanczos -distort resize 100% hash_removed.png
[IM Output] ==> [IM Output]
ハッシュの知覚されるグレースケールが、ハッシュ全体のグレースケールよりもはるかに暗く見えるのは、人間の色の知覚の仕組みによるものです。

解決策は、上記に「-set colorspace RGB」を含めて、IMが線形RGBカラースペースでリサイズしていることを伝えることです。カラースペース補正によるリサイズを参照してください。

上記は実際には、Jincのようなカーネル関数を使用した畳み込みと同等です。しかし、ご覧のとおり、Jinc関数の特別な特性(この場合はEWA Lanczos、またはJincウィンドウJinc)は、元の画像に強く存在していたハッシュパターンを完全に削除しました。現在残っているのは、画像の周囲にある「深淵」(仮想ピクセルの寄与がない)が結果に影響を与える可能性があるエッジに沿った部分だけです。ウィンドウ化されたJincフィルターの実際のローブ数も、結果に大きな影響を与えます。2つのローブでは、「ピクセルレベルのハッシュ」は、鈍化またはぼやけているものの、保持される傾向があります。

  magick hash.png -filter Lanczos2 -distort resize 100% hash_2_lobes.png
Jinc関数に適用されるウィンドウ化メソッドの寄与も、この効果に大きな影響を与えます。場合によっては、ハッシュパターンをさらに強化することさえあります。
[IM Output]
したがって、操作なしの歪みに対するフィルターによって生成される色の歪みを最小限に抑えるために、歪みフィルターをどのように調整するかという問題が生じます。ニコラス・ロビドゥーがこれを行うことに決めた方法は、直交エッジを可能な限り保持する傾向があるぼかし(フィルターカーネルのサポートのリサイズ)を選択することでした。

円筒Lanczosフィルター

さて、上記で説明したように、「Lancoz」は通常、フィルターの重み付けとウィンドウ化の両方に使用される「Sinc()」関数として定義されています。ただし、EWA円筒フィルターとして使用する場合、両方の重み付け関数は「Jinc()」関数に置き換えられます。つまり、重み付け関数が置き換えられるだけでなく(他の線形ウィンドウ化されたフィルターの場合と同様)、ウィンドウ化関数も置き換えられ、JincウィンドウJinc重み付け関数が生成されます。そのため、「円筒Lanczos」は、同じ数のローブ(デフォルトは3)を持つ「JincウィンドウJinc」を選択します。この手法は、インタラクティブ(ローカル)画像ワーピング(24ページ)に関する論文で、アンドレアス・グスタフソンによって最初に提唱されました。彼は具体的に、'Lanczos2D'と名付けた2ローブ円筒Lanczos(JincウィンドウJinc)フィルターを使用しました(次を参照)。これは、平面(EWA)状況の単純な拡張にすぎませんでした。したがって、同じ名前が使用されています。詳細については、BCスプラインディスカッションの投稿を参照してください。

Lanczos2 - 2ローブLanczos

便宜上、この2ローブバージョンは、歪みでの使用に特化して、「Lanczos2」という名前でIM v6.6.4-10に含まれていました。これは実際には、「filter:lobes=2」という専門家設定を持つ円筒の「Lanczos」(Jinc-Jinc)フィルターにすぎません。 上のグラフを参照してください。IMフィルターはSinc()関数とJinc()関数を必要に応じて自動的に切り替えるため、「2D」(円筒)用途だけのものではありません。リサイズにも(Sinc-Sinc関数として)使用できますが、小さすぎる可能性があり、実際には他のさまざまな三次関数と同等になるため、お勧めしません。

LanczosSharp - わずかにシャープ化されたLanczos

Jinc()関数をウィンドウ化すると、直交リサイズの結果(特に細い線の場合)、類似のウィンドウ化されたSinc()関数よりもはるかにぼやけたEWA歪みの結果になることが観察されました。これは特に、わずかな歪みの場合に当てはまりました。基本的に、Jinc()関数にはいくつかの特別な特性があり、Jinc()関数をウィンドウ化すると、これらの特定の望ましい特性が損なわれます。いくつかの計算により、ローレンシャン大学の数学教授であるニコラス・ロビドゥーは、歪んだ画像を修正するために、3ローブ円筒Lanczosのわずかにシャープなバージョンである「LanczosSharp」を考案することができました。ただし、結果として得られるフィルターは、ウィンドウ化されたJinc円筒フィルターの低レベル「ピクセルハッシュ」パターンの強いぼかしをまだ持っています。

Lanczos2シャープ化

[IM Output]Lanzcos2」フィルターでは同じ問題がより深刻だったため、ニコラスはぼかし専門家コントロールをわずかに大きくした、よりシャープな「Lanczos2Sharp」フィルターも作成しました。これにより、歪みのない場合に垂直線または水平線のぼかしが最小限に抑えられたフィルターが作成されました。このシャープ化されたフィルターは、ゼロ点をわずかにシフトさせ、現在、約「1.1684」に位置しています。これは大したことではないように思えるかもしれませんが、フィルターが歪みのほとんどない画像に対して生成するぼかしの量に大きな違いをもたらします。

Lanczos半径

[IM Output] これは、使用されるローブの数(デフォルトでは3)が整数サポート半径に収まるようにぼかし(シャープ化)されたEWA Lanczosフィルターです。つまり、3ローブEWA Lanczos(ウィンドウ化されたJincに基づく)は、半径3のサポートを正確に持つようにシャープ化されています。ローブ専門家コントロールを使用して、同じ結果を達成できますが、Jinc関数の既知のゼロ交差に基づく調整が必要であるため、計算が簡単ではありません。ニコラスは、このフィルターの追加を推奨し、その計算を行う必要がなくなり、この非常に具体的にシャープ化されたフィルターをテストできるようになりました。今後の予定:Jincウィンドウ化されたJincフィルターへのぼかし係数の表。
参照としてローブの数を含めます。

Robidoux円筒フィルター

[IM Output] 奇妙なことに、ミッチェル・ネトラバリフィルターを円筒フィルターとして使用すると、「歪みなし」の場合にほぼ同等の「シャープ」な結果が得られることが実験で示されました。そして、フィルターは、直交(リサイズ)フィルタリングのための「社会調査」によって選択されたため、円筒フィルターとしての使用とは関係がありません。「Mitchell」フィルターは、低レベルの「ピクセルハッシュ」パターンを保持するのが特に得意であり、通常のウィンドウ化されたJincフィルターは、円筒フィルターで処理された画像で破壊しました。その後、ニコラスは、奇妙な偶然により、「Mitchell」が、上記で説明した「Lanzcos2」フィルターの「シャープ化された」形式に非常に近いことを発見しました。これにより、彼は垂直線(および水平線)を完全に保持するKeys Cubic Filterを開発しました。また、この新しいフィルターは、Jinc関数よりも三次関数の計算が非常に安価であるため、計算コストが少なくて済みます。この三次フィルターは、IM v6.6.5-0以降、「Robidoux」フィルターとしてIMに追加され、歪みとその楕円重み付きリサンプリングメソッドで使用されるデフォルトのフィルターでもあります。特に、歪みが最小限の画像に対するぼかしの最小限の特性によるものです。つまり、それが使用する「最適な」フィルターであるとは言えず、ニコラスでさえ他のフィルターを使用することを好みますが、直交(テンソル)リサイズの妥協点として「Mitchell」が優れた妥協点であるのと同様に、非常に優れた妥協点です。「三次マップ」でこのフィルターをマークしました。これは、ミッチェル・ネトラバリ調査によって生成されたもので、「ミッチェル」フィルターとどれだけ密接に関連しているかを確認できます。実際、直交方向にリサイズされた画像または円筒方向に歪んだ画像のどちらにとっても妥当なフィルターになるでしょう。

Robidouxシャープ円筒フィルター

RobidouxSharp」フィルターは、「Robidoux」フィルターをわずかにシャープにしたバージョンですが、結果がシャープすぎると感じる人もいます。これは、「歪みなし」の場合に、純粋な黒と白のピクセルを含む画像を最小限のエラーで保持するように特別に設計されています。具体的には、「歪みなし」の場合に、直交する近傍ピクセルの重み付けが、対角の近傍ピクセルの負の重み付けと正確に一致します。偶然にも、「Mitchell」フィルターは、「Robidoux」フィルターと「RobidouxSharp」フィルターのほぼ中間に位置しており、すべて三次キーフィルターファミリーに属しています。そのため、ユーザーは、これらの3つのフィルターのいずれかを選択して、ほぼ「歪みなし」の状況での結果のぼかしとシャープさを制御できます。このフィルターの詳細については、IMフォーラムのBCスプラインに関するディスカッションを参照してください。

Robidouxソフト円筒フィルター

これは後から追加されたもので、他の円筒フィルターとは大きく異なります。はい、画像のアップサイズや拡大に役立つように、かなりぼやけています。これにより、レンガ造りの建物の写真の階段状のアーチファクトを避けることができます。詳細については、BCスプラインのディスカッションの投稿、および写真処理フォーラムでのディスカッションを参照してください。

円筒フィルターの概要

EWAにおけるJincフィルターの適切なスケーリングに関する長期間にわたるフォーラムディスカッションの中で、ニコラス・ロビドゥー氏が円筒フィルターの概要として次のように述べています。
ロビドゥーがソフトすぎる場合や、ロビドゥーシャープがエイリアスすぎる場合は、中間的な位置にあるミッチェル(ディストートリサイズを使用)を試すことをお勧めします。

JPEGは(離散)コサイン変換を含むため、フーリエの考慮事項に基づいたフィルター(Sincを使用したリサイズであろうとJincを使用したディストートであろうと、ランチョスなど)が、「滑らかな関数の良好な近似」に基づくフィルター(キーのキュービックに基づくフィルター:ロビドゥー、ミッチェル、ロビドゥーシャープ、キャットロム。リサイズであろうとディストートであろうと)よりも一般的に優れていることに驚きはありません。その利点は、PNG(フーリエ領域を通じて情報を破壊しない)ではそれほど大きくないようです。

ニコラスにはもっと多くの意見があります。そのため、彼自身のセクションであるニコラス・ロビドゥーによるリサンプリングが、独立した広範なページとして用意されています。

エキスパートフィルターコントロール

上記のさまざまなセクションでは、さまざまなフィルターをさまざまな方法で変更できる多数の特別な「エキスパート」コントロールを紹介します。これらのエキスパート設定は、グローバル定義設定(または同等の設定オプション)を使用して定義します。「-filter」のIMコマンドラインオプションリファレンスページで、すべてのエキスパートオプションの完全な概要を確認できます。「-filter」設定は、実際には、指定された「名前付き」リサイズフィルターを定義するために、エキスパートコントロールを適切にルックアップして設定するためにのみ使用されます。これらの設定は、特定のリサイズまたは歪み画像処理操作のためにフィルターが設定された時点で、上記で指定されたデフォルト値を上書きします。
-filter」設定の「Point」は、上記のすべてのフィルター設定を完全にバイパスし、スケーリングされていない「ニアレストネイバー」の直接ルックアップ(リサイズ)または補間ルックアップ(ディストート)に劣化します。したがって、この名前付きフィルター設定は、スケーリングされた画像ルックアップフィルターを事実上完全にオフにします。
現在、利用可能になっていますが、最後に1点指摘しておきたいと思います。
あなたがエキスパートでない(または単に遊んでいる)限り、使用しないのが最善です!
画像処理のエキスパートはごくわずかであり、フィルターが何をするか、フィルターを変更するとフィルター処理方法にどのように影響するかを正確に理解していない限り、画像処理の効果を損ない、見栄えの悪い結果を生み出す可能性が高くなります。特に、テストケース以外の画像ではそうです。つまり、ユーザーが使用すべきではないと言っているのではなく、多くのIMの例ではそれらを利用していますが、通常は何らかの特殊効果を提供するために行われています。特別なオプションを使用する場合は、その使用理由も説明されており、その効果のために与えられたレシピに従う必要があります。もちろん、使用してもかまいませんし、それらを利用することで非常に興味深く、非常に珍しい効果を生み出すことができます。

「詳細な」フィルター制御

filter:verbose」の設定は、他のフィルターコントロールを理解し、把握する上で、おそらく最良の味方となるでしょう。たとえば、ランチョスフィルターが、Sincウィンドウ付きSincサポート3で定義されていることを確認できます。

  magick null: -filter Lanczos -define filter:verbose=1 \
          -resize 2    null:    | grep '^#'
[IM Text]
内部的には、ランチョスフィルターは、計算負荷の高い三角関数ライブラリ関数で定義される完全な「Sinc」関数ではなく、高速な多項式等価「SincFast」(4ローブ)関数で定義されていることに注意してください。ここでは、ランチョスフィルターが、円筒型(EWAアルゴリズム)の「-distort」フィルターとして使用した場合に、Jincウィンドウ付きJincフィルターとして定義されていることがわかります。

  magick null: -filter Lanczos -define filter:verbose=1 \
          -distort SRT 0   null:   | grep '^#'
[IM Text]
filter:verbose」設定は、さまざまなエキスパート設定の使用により、最終的な結果フィルターが正確に何であるかをユーザーが確認できる唯一の方法です。フィルター設定の「#」でコメントされたヘッダーの後、フィルターによって生成されたデータ点のセットが返されます。これらは、フィルターのデータをグラフ化するために特別に提供されており、テスト画像の結果から推測することなく、フィルターが実際に何を生成しているかを確認およびチェックすることができます。たとえば、ウェルチウィンドウ付きSincフィルターのデータを抽出します...

  magick null: -filter Welch -define filter:verbose=1 \
          -resize 2 null:  > filter_welch.dat
または、上記で使用された生のウェルチウィンドウ関数を、0から1のサポート範囲にスケーリングして使用します。

  magick null: -define filter:filter=Box \
                -define filter:window=Welch \
                -define filter:support=1.0 \
                -define filter:verbose=1 \
           -resize 2 null:  > window_welch.dat
次に、「gnuplot」コマンドを使用して、そのデータをプロットできます(上記でウィンドウ付きSincフィルターで行ったように)...

  gnuplot
    set grid
    plot "window_welch.dat" with lines

その他のエキスパートフィルターコントロールの例

「生の8ローブSinc」フィルターを作成するには、次のように設定できます...

  -define filter:filter=Sinc
  -define filter:lobes=8
(v6.3.6-3以前にIMが誤って行ったように)ブラックマンウィンドウ関数をフィルターとして直接使用します。

  -define filter:filter=Blackman
  -define filter:support=4.0
ウィンドウ関数は、未定義の場合、「Box」がデフォルトになります。「Box」ウィンドウ関数は、ベースフィルター関数のウィンドウ処理を行いません。「Box」ウィンドウ関数がもたらす唯一の効果は、関数のウィンドウ処理された領域のクリッピングです。上記のフィルターサポートエキスパートコントロールを参照してください。次を使用して、生のJinc関数の使用を強制します(明示的に「Box」ウィンドウ処理を設定します)...

  -define filter:filter=Jinc
  -define filter:window=Box
  -define filter:lobes=3
結果のウィンドウ処理されたフィルターの最初の8ローブのみにクリップされた、12ローブの「ランチョス」ウィンドウ付きフィルター...

  -filter Lanczos
  -define filter:win-support=12
  -define filter:support=8
これにより、結果のウィンドウ処理されたsincフィルターのウィンドウで変調された「テール」(12まで)を無視して(8でサポートをクリッピング)、約4倍高速化されます。ただし、これはサポートのクリッピングの結果として、追加の小さなアーチファクトが発生する可能性があります。ガウスを使用して画像を「ぼかす」!これは、-gaussian 5x2操作と同等ですが、操作を行わないディストートを使用することによって実現できます!

  -filter Gaussian
  -define filter:sigma=2
  -define filter:support=5
  -distort SRT 0
注:これには-resizeを使用することはできません。操作がショートカットされて、操作がまったく実行されない可能性があります。「ミッチェル・ネットラバリ」の調査から別のフィルターを作成します。

  -filter Cubic
  -define filter:b=0.5
  -define filter:c=0.5
α値が0.4の独自の「キーのキュービック」フィルターを作成します...

  -filter Cubic
  -define filter:c=0.4
EWAフィルターの補間」を調査中に、ニコラス・ロビドゥーがこの奇妙なフィルターを作成しました。

  -define filter:blur=.7071067811865475
  -define filter:c=.49257366
  -define filter:b=2.089813051319261
  -filter Cubic
画像を拡大するために使用する場合。ピクセルは、ブレンドに似たスキームで、正方形の代わりにひし形を使用し、ひし形のようなパターンに変換されます。エキスパートオプションの使用は、すべて自己責任で行ってください。これらは本番環境での使用を目的としたものではなく、トリッキーまたは不可能なリサイズ関数を調査または作成するための方法として使用されます。自己責任でご利用ください!

リサイズフィルターの概要

以下は、ImageMagickで利用可能な上記のすべてのフィルターを研究、再コード化、および文書化した後の、私自身の個人的な見解です。私が間違っていると思う場合や、意見を表明したい場合は、IMフォーラムで意見を表明し、私に返答を依頼してください。「Hermite」などの補間フィルターは、画像を大幅に拡大する場合に最適で、最終結果で最小限のぼやけを生み出しますが、出力は後処理でさらに人工的にシャープにされることがよくあります。「Mitchell」などのガウスのようなぼかしフィルターは、基本的に線画や漫画のような画像で構成される画像に最適です。特別なフィルターぼかし設定を使用して、画像上のフィルターのぼかしエイリアシング効果を制御できます。ウィンドウ付きSinc/Jincフィルターラグランジュ相当は、実世界の画像、特に画像を縮小する場合に最適なフィルターです。それらはすべて、基本的な結果が非常に似ています。より大きなサポート、またはさらに優れたローブ数設定は、一般的にさらに優れた結果を生み出しますが、より多くのリンギング効果も発生する可能性がありますが、計算コストは高くなります。キュービックフィルターは、固定サポート(通常2.0)の高速でシンプルなフィルターの寄せ集めであり、「Hermite」の滑らかな補間フィルター、「Mitchell」の画質評価された画像拡大、「Spline」の非常にぼやけたガウスのようなフィルター、または「Catrom」を使用したシャープなウィンドウ付きsincタイプのフィルターまで、あらゆるものを生成します。一般的に、リサイズの結果が許容できる場合は、そのままにしておくと、より悪化する可能性が高く、改善される可能性は低くなります。

フィルター比較

拡大...最後に比較するために、12個の代表的なリサイズフィルターの選択肢を示します。画像は、暗い灰色の背景にある1ピクセル幅の線のエイリアスステップを拡大したものです。元の画像自体が「エイリアス」であるため、さまざまなフィルターが既存のエイリアシング効果をどの程度除去するかを確認できるはずです。

  magick -size 10x6 xc:grey20 +antialias -draw 'fill white line 4,0 5,5' \
          -filter {filter_type} -resize 100x   {result}
[IM Output]
上記は補間フィルターから始まり、ガウシアンブラーフィルターへと続き、これらのフィルターがどれほどぼかしを生み出すか、そしてそれによって元の画像の「エイリアシング」をどのように除去するかを示しています。これらのフィルターはリンギングを生じません。2行目は3つのウィンドウ付きSincフィルターから始まり、それらが生成する可能性のある強いリンギング効果を示しています。これらのフィルターは、画像を拡大するのではなく、縮小するように設計されていることを覚えておいてください。これは、「Lagrange」のデフォルトの「補間」設定を使用した例と、「Catrom」補間三次フィルターへと続きます。最後の画像は「Mitchell」フィルターで、最終結果に存在する4つのリサンプリングアーティファクトを最小限に抑え、画像の拡大に使用するのに最適な「理想的な」フィルターとして、専門家が主観的に合意したものが示されています。私自身も彼らの発見に同意しますが、拡大の場合に限ります。これが「Mitchell」がIMで使用されるデフォルトの「拡大」フィルターである理由です。縮小...エイリアシング効果の概念を得るために、ここでは以前に作成したラージリング画像の切り抜き(サイズは105x105ピクセル)を縮小し、同じ12個の代表的なフィルターがどのようなモアレ効果を生成するかを確認します。

  magick rings_crop.png -filter {filter_type} -resize 100x {result}
[IM Output]
ご覧のとおり、補間フィルターは非常に強いエイリアシングモアレ効果を示します。これは、これらのフィルターが生成するブロッキングアーティファクトの副作用として発生します。一方、ガウシアンブラーフィルターのブラーアーティファクトは、結果として得られる画像からすべてのブロッキングモアレ効果を取り除きましたが、結果として得られる画像には全体的なぼかし(不明瞭な線)があります。「ガウシアン」フィルター自体は、フィルターサポート設定によってクリップされた無限(IIR)フィルターによって引き起こされる、ごくわずかなエイリアシング効果を示していますが、それは非常に小さいものです。一方、ウィンドウ付きSincフィルターは、3つの代表的なフィルター全体でほぼ同じ強度の円形のモアレ効果を持つ、非常にシャープな外観の画像を生成します。これは、これらのフィルターが生成するリンギングアーティファクトによって、干渉パターンが生成されるためです。最後に、三次フィルターも非常に軽いモアレ効果を示していますが、負のローブリンギングによるものにすぎません。リンギング効果が最も少ない「ミッチェル」フィルターです。「Mitchell」は、ほぼすべてのリサイズアーティファクトから非常にわずかな効果を生成することに注意してください。つまり、グリッド状のモアレ-エイリアシング/ブロッキング、円状のモアレ-リンギング、および線のぼかしです。ただし、すべてのアーティファクトは非常に低いレベルであるため、これはオールラウンドな優れたフィルターです。ここにもう1つの比較がありますが、今回は小さなリング画像をさらに小さく縮小しています。

  magick rings_sm_orig.gif -filter {filter_type} -resize 100x {result}
[IM Output]
ご覧のとおり、補間フィルターは多くのエイリアシングアーティファクトを生成し、ガウシアンブラーフィルターは他のフィルターよりも多くの線をぼかす傾向があります。しかし、他のすべてのフィルターは適切な処理をする傾向があります。

最適なフィルター?

つまり、自分で見つける必要があるものです。ただし、多くの場合、どのようなタイプの画像とリサイズを行っているかによって異なります。画像を拡大する場合、「Mitchell」はおそらく使用できる最高のフィルターであり、基本的にはウィンドウ付きフィルター(デフォルトは「Lanczos」)は、特にローレベルのパターンが関与している場合に、画像を縮小するのに適しています。ただし、パターンがなく、まっすぐなエッジ(GIFの透明度など)がたくさんある場合は、強いリンギング効果を避けるために、シャープニングされたガウシアンフィルターまたは再び「Mitchell」を使用することをお勧めします。「Lagrange」フィルターも特に、画像を縮小する場合、より大きなフィルターサポート設定を使用すると非常に優れています。興味のある方は、IMユーザーディスカッショントピックリサイズ後の画質を比較する方法?をご覧ください。これは、定量的に「最適なフィルター」を決定する方法はなく、定性的または主観的な「最適なフィルター」しかないことを基本的に示しています。選択はあなた次第であり、選択はImageMagickの重要な機能です。

IMのデフォルトフィルター...

これらの理由から、「Mitchell」は、透明度を含む画像や、パレット(またはカラーマップ)を含む画像の縮小だけでなく、拡大のデフォルトフィルターです。ただし、「Lanczos」は他のすべての場合、つまり通常の画像(通常は写真)の縮小で使用されます。ディストーションの場合、フィルター設定は「Robidoux」フィルターにデフォルト設定されます。これは、実際のディストーションが発生しない場合に画像のぼかしを最小限に抑えるように特別に設計されました。もちろん、これらの選択を上書きすることもできます。

Nicolas Robidoux

Nicolas Robidouxは、画像処理の専門家であり、画像サイズ変更から絶対的な最高の結果を得ようとする試みについて、さらに多くの意見や推奨事項を持っています。彼自身が独自のセクションを持つほどです...
Nicolas Robidouxによるリサンプリング.