⚠️ これは 非公式の翻訳サイトです。ImageMagick Studio LLC とは無関係です。正確な情報は 原文(https://usage.imagemagick.org/filter/index.html) を参照してください。

ImageMagick 使用例 -- リサンプリングフィルタ

ここでは画像のリサイズや歪み変形の、より低レベルな側面に踏み込み、結果画像の個々のピクセルの最終的な色を決定するために使われるリサンプリングフィルタを見ていきます。この分野は広範で、長年研究されており、完璧なリサイズ画像とは何かを決めることが不可能であるため、確固たる定性的事実というよりは、しばしば意見や個人的見解に満ちています。これは証明された事実であり、決して終わることのない非常に大きな研究領域となっています。先に リサイズとスケーリング演算子 を読み、理解しておくことをお勧めします。


リサンプリングアーティファクト - IM のリサイズはどれくらい良いのか

画像のリサイズは非常に難しい問題に立ち向かわなければなりません。値の配列を、より小さい、あるいはより大きい値の配列へと、どうやって我々の目に良く見えるように縮小・拡大するかという問題です。これを試みる際には多くの問題が起こり得ますが、それらは基本的に四つのカテゴリに分類されます。

ブロッキング

要するに、単純にピクセルを複製して画像を拡大すると、より大きな矩形のピクセルのブロックが作られてしまいます。実際、"[-scale](https://imagemagick.org/command-line-options/#scale)" や "[-sample](https://imagemagick.org/command-line-options/#sample)" を使った画像の拡大はまさにこれを行い、拡大されたピクセル化画像を生成します。例えば、ここでは小さな画像をスケールして、滑らかな画像ではなく大きな色のブロックを生成しています。その隣には 'リサイズ' したバージョン、そして最後に Gaussian フィルタを使って通常より強くぼかし、孤立したピクセルを丸い点に置き換えてブロック感を取り除いたものを示します。

  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]
Gaussian リサイズ
---|---|---|---|---

'ブロッキング' の主な原因は、ソース画像のアンチエイリアスが不十分であるか、画像全体の見栄えを良くするためのピクセル間のスムージング(色の混合やぼかし)が足りないことです。また、非常に低解像度の画像が、はるかに大きなスケールにリサイズされたり、高解像度のデバイスで使われたりするときにも典型的に見られます。これが最もよく見られるのは、ユーザーが作成したニュースレターや雑誌でビットマップ画像を使い、それを非常に高解像度のレーザープリンタで印刷した場合です。ニュースレターは画面上では素晴らしく見えますが、印刷ページでは 'ブロック状' に出てきます。この状況は修正が非常に難しく、一般的にはより高解像度のクリップアートを使うか、スケーラブルなベクター画像(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 拡大フィルタによって生成されたもので、ごくわずかなリンギング効果も見せますが、ほとんど気づかないほどで、境界を知覚的にシャープにするという点ではむしろ望ましいものです。ここにリンギング効果のもう一つの例を示します。今度は単一のピクセルをグレー背景上で拡大したものです。 |

  magick -size 1x1 xc: -bordercolor '#444' -border 4x4 \
          -define filter:lobes=5  -filter Sinc \
          -resize 100x100\!   dot_sinc.gif

[IM Output]
この画像はまた、一次元フィルタの使用によって生じる二次的効果も明確に示しています。つまり、リンギング効果は水平方向と垂直方向(直交方向)で最も強く、45 度方向に二次的なリンギングが現れます。今度は円筒型フィルタ(Distort リサイズ操作 経由)を使い、リサイズ演算子 が使うより一般的な 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](https://imagemagick.org/command-line-options/#sample)" を使うなど画像を生のままサンプリングしたり、リサイズ中に画像を過度にシャープ化したりすることで生じます。階段状効果は画像の強い縮小で最も目立ちますが、IM ではめったに見られません。しかし、エイリアシングには他の効果もあります。特に、何らかのピクセルレベルのパターンを含む画像に大規模なモアレパターンが現れることです。これらの低レベルなパターンは、大規模なモアレパターンをしばしば生成します。例えば、平行線のパターン、布の織り目(絹は現実でこの効果を示します!)、そしてレンガ造りの建物・フェンス・舗装の写真におけるレンガやタイルのパターンなどです。[IM Output] 強いモアレ効果を生むリサイズ画像の例については、Wikipedia, モアレパターン のページを参照してください。リサイズがエイリアシング問題を生むかどうかを確認する古典的な方法は、リング画像 を縮小することです(右を参照)。この画像は、どのようなスケールでもリサイズが適用されると、しばしばモアレ効果を示します。特に Web ブラウザは、超高速(だが多くの場合粗悪な)リサイズ技法を使うため、このような画像を表示するときにこうしたモアレ効果を示します。
ここでは 'rings' 画像を、強くエイリアシングする "[-sample](https://imagemagick.org/command-line-options/#sample)" 演算子、ブロック平均化の "[-scale](https://imagemagick.org/command-line-options/#scale)" 演算子、そして通常のデフォルトの "[-resize](https://imagemagick.org/command-line-options/#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](https://imagemagick.org/command-line-options/#resize)" の使用によって生じるぼかしに馴染みがあるでしょう。実際、これはおそらくリサイズ画像に対する不満の第一位であり、それももっともなことです。通常、ごく小さなリサイズはぼやけた画像を生む傾向があり、それを再びリサイズすればさらに悪化するだけです。問題は、画像をリサイズするとき、'グリッド' すなわちピクセルの配列('ラスタ' と呼ばれる)として格納された画像を、まったく異なるピクセルの 'グリッド' に合わせて変更しているということです。この二つの 'グリッド' は、ごく特殊な場合を除いて一致せず、その結果、画像データはこの新しい点のパターンに合うように変更されなければなりません。基本的に、画像を直接リサイズして、それがきれいに出てくることを期待するのは不可能ですが、それなりの結果は達成できます。その結果は通常、ピクセルデータのわずかなぼかしです。リサイズアルゴリズムが優れているほど、鋭いエッジのぼかしは少なくなります。しかし一部のリサイズフィルタ、特に画像の拡大専用に設計されたものは、必要以上に多くのぼかしを加えることがしばしばあります。これは上で示した 'ブロッキング' アーティファクトに対抗するためです。画像の縮小では、鋭いエッジでの 'リンギング' アーティファクトを避け、起こり得る エイリアシング 効果を低減するために、ぼやけたエッジがしばしば使われます。しかしこれは苦肉の妥協であり、IM が極力避けようとしているものです。それでも、特別なエキスパート向けの フィルタブラー 設定を使って、フィルタが提供するぼかしを調整できます。ただし、1.0 より小さい数値はぼかしを減らすことになっているとはいえ、正確なフィルタと使われるリサイズ比率によっては、逆に悪化させることもあるので注意してください。何の保証もありません。 IM v6.3.6-3 より前は、フィルタブラー 設定は "[-support](https://imagemagick.org/command-line-options/#support)" と呼ばれており、それが正確に何をするかについて非常に紛らわしいものでした。このオプションは非推奨となり、もう利用できません。
リサイズによって生じるぼかし効果を修正するより良い方法は、シャープ化演算子を使って画像を再フィルタリングすることです。詳細は リサイズした画像のシャープ化 を参照してください。

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

実世界の画像をリサイズする際の、IM のデフォルトリサイズ演算子と他の多くのプログラムとの実践的な比較が、Bart van der Wolf によって以下で提供されています…

ダウンサンプリングの例

具体的には、IM リサイズについて要約すると…

シャープ化の量は好みの問題ですが、エイリアシングアーティファクトが無いことが、それらすべての中で最もクリーンで最も自然な見た目の画像を生み出します。

彼はさらに 'rings' テストを見て、さまざまな Photoshop のリサイズ手法を ImageMagick と直接比較しています…

ダウンサンプリングの手法

これらの記事は、リサイズを正しく(そして正しいフィルタリング手法を使って)行うことが、画像処理にとっていかに重要かを示しています。次のセクションでこれをより詳しく見ていきます。


リサンプリングフィルタ

"[-filter](https://imagemagick.org/command-line-options/#filter)" 設定は、"[画像リサイズ](resize.html#resize)" と "[汎用 Distort 演算子](distorts.html#distort)" が、リサンプリングアーティファクト を最小限に抑えてクリーンな結果を生み出すための、鍵となるコントロールです。これは 1980 年代後半に集中的に研究されたテーマであり、この分野の主要な研究者である Paul Heckbert は、その研究から彼の "**[zoom](http://www.xmission.com/~legalize/zoom.html)**" 画像リサイズプログラムを制作し、公開しました。このプログラムは、今日使われているほとんどの画像リサイズプログラムの父となりましたが、誤りやすいため、後の多くのプログラムは実装が粗悪です。例えば Web ブラウザが画像をどうリサイズするか のテスト結果を見てみてください。多くの点で、これらのフィルタは 画像の畳み込み、さらには ぼかしカーネル と密接に関連しています。それらは似たような問題にも悩まされます。しかしフィルタは、画像をリサイズしたり、あるいは歪み変形させたりするときの、最終結果の見栄えを向上させるように設計されています。フィルタの名前は、過去一世紀(あるいはそれ以上)の画像処理の専門家や数学者の、まさに 'who's who'(名士録)です。それらは通常、フィルタの説明ではなく、そのフィルタ(あるいはフィルタファミリ)を最初に発表した人、あるいはそのフィルタを最も研究した人のラベルにすぎません。しかしこのため、'Lagrange' フィルタ(Joseph-Louis Lagrange にちなんで命名)が、例えば 'Catrom' フィルタ(Edwin Catmull と Raphael Rom にちなんで命名)より良いかどうかを知ることは、はるかに難しくなります。ここでは、フィルタの主要な側面を説明します。これらを学ぶことは必須ではありませんが、IM リサイズフィルタシステムの大幅な見直しと拡張(IM 6.3.7-1)の一環として、この分野での研究を終えた後、私が学んだことの要約を文書化することにしました。リサイズフィルタの再開発における研究を手伝ってくれた Fred Weinhaus に特別な感謝を捧げます。彼は特に '[Lagrange](#lagrange)' ファミリのフィルタの追加に熱心でした。これはこの見直し以前の IM リサイズには存在しませんでした。また、汎用 Distort 演算子 の大きな欠陥の解決を数学で助け、さらに リサイズ演算子 より良い結果を生む 円筒型フィルタ の開発を助けてくれた Nicolas Robidoux にも感謝します。

フィルタの仕組み

画像をリサイズするとき、基本的には元のソース画像のピクセルに基づいて、新しい画像の各ピクセルの正しい値を決定しようとしています。しかしこれらの新しいピクセルは、古いピクセルの位置と正確には一致しないため、これらのピクセルの正しい値を何らかの方法で決定する必要があります。行われるのは、新しいピクセルの良い値を決定するために、元のソースピクセル値の何らかの加重平均を使おうとすることです。新しいピクセルの位置を囲む実際のピクセルが、寄与する値の '近傍' を形成します。この近傍が大きいほど、リサイズは遅くなります。これは 畳み込み と呼ばれる技法です。各実近傍ピクセル('サンプル' と呼ばれる)が最終ピクセルの生成にどれだけ寄与するかは、重み付け関数によって決定されます。これが、"[-filter](https://imagemagick.org/command-line-options/#filter)" 設定で選択できる 'フィルタ' です。そのフィルタには、一般に理想的な近傍サイズがあり、これはフィルタの 'サポート' として知られていますが、'ウィンドウ' とも呼ばれます。事前定義された二次元の 'フィルタ' は、'畳み込みカーネル' とも呼ばれます。

_将来: ここにいくつかの図があると役立つかもしれません_

これらの重み付け関数、すなわち 'フィルタ' の設計は、複雑な数学、周波数解析、さらにはフーリエ変換を伴う、非常に複雑な仕事です。これに興味があるなら、良い出発点は Wikipedia: ナイキスト–シャノンのサンプリング定理 です。しかし、既存のフィルタとその画像への効果を理解するために、そこまで深く行く必要は本当にありません。

フィルタ

補間フィルタ

最も単純なタイプのリサイズフィルタ関数は 補間 法です。これらは、ソース画像内の特定のピクセル位置を取り、周囲のピクセルの色に基づいて、その位置における画像の論理的な色の値を単純に決定しようとします。関与するピクセルの数は常に固定で最小限なので、このタイプのフィルタは画像のリサイズや歪み変形の非常に高速な手法です。しかし、これはフィルタの弱点でもあります。なぜなら、元の画像より大幅に小さな画像を形成するために、より多くの数のピクセルを統合することはないからです。それが今度は、強い エイリアシングとモアレ効果 をもたらすことがあります。補間は通常、画像のスケーリングが既知でないか、または不要なときに、画像の '点' サンプリングにのみ使われます。例えば、画像の回転や軽微な歪み変形では、画像のスケーリングやサイズは変わらないので、補間はそれなりの結果を生み出せますが、あまり正確なものではありません。詳細は IM の 補間設定 を参照してください。しかし、一般的な画像リサイズには適していません。

Point

"[-filter](https://imagemagick.org/command-line-options/#filter)" 設定に '**Point**' を使うことは、基本的にスケーリングされていない補間フィルタを使うことを意味します。リサイズ演算子 では、それは単に新しいピクセルの位置に最も近いピクセルを選択するだけで、それで終わりです。これは、リサイズ演算子 がソース画像の実際のピクセルの色をそのまま使うことを意味します。色を統合したり、結果画像のためのより良い色を生成したりする試みは一切行われません。その結果、"-filter point -resize ..." を使うと "[-sample](https://imagemagick.org/command-line-options/#sample)"(サンプリング演算子 を参照)と同じ結果が得られますが、後者の方が高速です。なぜなら、そのコードは点サンプリングによる画像リサイズ専用に設計されており、正確なサンプリング点を調整するコントロールも備えているからです。 | _Distort 演算子 では "[-filter](https://imagemagick.org/command-line-options/#filter) Point" を選択すると、円筒型フィルタ の代わりに 補間点サンプリング の使用を強制します。詳細は Distort 演算子における画像フィルタ を参照してください。

通常の画像リサイズで同じ 補間点サンプリング が欲しい場合は、代わりに 補間リサイズ 演算子を使えます。あるいは、同じ結果を得るために point フィルタの Distort リサイズ を使ってください。

_
---|---
ここでは 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]
Point-1 | [IM Output]
Point-2 | [IM Output]
Point-3 | [IM Output]
Point-4 | [IM Output]
Point 50%
---|---|---|---|---|---|---

実際に起きているのは、画像全体でピクセルの単一の行と列が取り除かれているだけです。このレベルでも、結果画像には極端な ブロッキングエイリアシング が生じ、上記のような特定の場合にはまったく非現実的な結果を生み出すことがあります。そのため、'Point' フィルタ、あるいはより高速な同等の サンプリング演算子 は、通常の画像リサイズには推奨されません。

Box

'**Box**' フィルタ設定は、'point' とまったく同じですが、わずかな違いが一つあります。画像を縮小するとき、ピクセルを平均化して統合します。結果画像が小さいほど、より多くのピクセルが一緒に平均化されます。[IM Output] ここにフィルタの重み付け関数のグラフを示します。これを見れば、なぜそれが 'Box' フィルタと呼ばれるのかが分かります。基本的に、'Box' の内側に入るどのピクセルも、新しいピクセルの色を計算するために直接使われます。さて、フィルタはピクセルの 1/2 だけの幅しかないので、実際にはリサイズされていない画像の場合、一つのピクセル、つまり最も近いピクセルだけが使われます。言い換えれば、スケーリングが関与しない(あるいは拡大のみの)場合、新しい位置に最も近いピクセルが新しいピクセルの色を形成します。しかし画像が小さくされる場合、ソース画像のより多くの部分がその 'box' の境界内に圧縮されます。その結果、より多くのピクセルが一緒に平均化されて、小さい画像のピクセルの色を生み出します。例えば、ここにチェッカーボードのピクセルパターンが '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 フィルタ' の代わりに、はるかに高速な Scale 演算子 を使うことも推奨されます。それはほぼ同一の結果を生み出します。ただし、画像をわずか数ピクセル縮小する特殊な場合は例外です。'ビニング' の場合は同一の結果を生み出します。 Scale 演算子 は 'Box フィルタ' と厳密には同じではありません。なぜなら、特別な 'ピクセルミキシング' アルゴリズムを使って実装されているからです。正確な詳細は Scale の内部 を参照してください。
拡大するときは、'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
---|---|---|---|---|---|---

| Scale 演算子 も、整数のスケーリング係数で拡大する場合を除き、拡大時にいくらかのピクセル色の混合を伴いつつ、似たような結果を生み出します。
---|---

Triangle

[IM Output] 'Triangle' すなわち '[Bilinear](misc.html#bilinear)' 補間フィルタは、最近傍の補間をもう一歩進めただけのものです。'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]
Triangle フィルタ拡大
---|---|---

上の画像の色を("[im_profile](../static/img/scripts/im_profile)" スクリプトを使って)グラフ化すると、三角形のフィルタグラフの複製が見えるでしょう。

[IM Profile]
画像のプロファイル

ご覧の通り、中央のピクセルは近傍のピクセルと統合され、それらの点の間に色の線形グラデーションを生み出しました。すべての補間フィルタは、近傍ピクセルの間に同様のグラデーションパターンを生み出します。これがまた、それらが画像の拡大に非常に適している理由でもあります。

その他の補間フィルタ

[IM Output] 右に、さまざまな補間フィルタをグラフ化しました。ただし 'Point' は除きます。これは実際にはスケーリングされていない 'Box' フィルタの非常に特殊な場合(純粋な '[NearestNeighbor](misc.html#nearest)' 補間)だからです。その他の補間フィルタには '**Hermite**' があります。これは結果が triangle に非常に似ていますが、拡大に対してより滑らかな丸めを生み出し、グラデーションの遷移を滑らかにします。これら三つのフィルタ関数のグラフを見るには、右のグラフ をクリックしてください。
[IM Output] '**Lagrange**' フィルタは '万能' 補間フィルタと呼ばれてきました。'support' サイズを変える(下記の サポートエキスパート設定 を参照)ことで、これまで見てきたすべての補間フィルタ('Hermite' を除く)を生成できます。デフォルト設定(support=2.0 の Lagrange 次数 3 フィルタ。右のグラフの紫の線として示される)は、それなりの 'cubic' フィルタを提供します。非常によく機能しますが、グラデーションの変化が拡大時に目立つ ブロッキング 効果をもたらすことがあります。ただし、ビットマップ画像や線画では、これは良いことかもしれません。他の Lagrange フィルタ の次数については後で詳しく説明します。[IM Output] '**Catrom**'(Catmull-Rom)フィルタは、補間関数としてよく使われる、よく知られた標準的な Cubic フィルタ であり、同じ名前で利用できます。このフィルタはそれなりに鋭いエッジを生み出しますが、'Lagrange' フィルタが生み出すような、大規模な画像拡大での顕著なグラデーション変化はありません。それは基本的に、組み込みの 'unsharp resize'(シャープ化したリサイズ画像 を参照)に相当しますが、シャープすぎると感じる人もおり、シャープ化のコントロールは一切提供されません。'Catrom' フィルタをより興味深いものにしているのは、それがほぼ同一の、2 ローブ '[Lanczos](#lanczos)' フィルタの cubic 相当だということです。後者はおそらく最もよく使われる ウィンドウ Sinc フィルタ(下記を参照)です。このフィルタについても後で Cubic フィルタ でより詳しく見ていきます。

補間と IM の Interpolate 設定

IM の Interpolate 設定は、FX DIY 演算子("[-fx](https://imagemagick.org/command-line-options/#fx)")や 色ルックアップ置換演算子("[-clut](https://imagemagick.org/command-line-options/#clut)")、そしていくつかの古い 円形歪み変形 関数などの演算子で、画像のスケーリングされていない 'point' ルックアップを生成するために使われますが、これらの単純な補間リサイズフィルタに基づいています。しかし、それらは現在、別個のコードを使って実装されており、設定名も異なります。これらの 補間設定 には次のものが含まれます。'Point'(あるいはスケーリングされていない 'Box')フィルタを実装する '[NearestNeighbor](misc.html#nearestneighbor)'、そしてスケーリングされていない 'Triangle' フィルタを得る '[BiLinear](misc.html#bilinear)'。余談: 現時点では、滑らかな triangle フィルタ 'Hermite' は 補間設定 として直接実装されていません。これは非常に良い補間フィルタなので残念です。

Gaussian ぼかしフィルタ

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

Gaussian

[IM Output] Gaussian フィルタは、周波数領域で同じ 'ベル曲線' の形を生成する非常に特殊なフィルタです。これは、この高周波ノイズを高度に制御可能な方法で確実に除去することを保証するため、画像フィルタとして非常に有用です。しかし、フィルタグラフを調べると、サンプリング点から 1 ピクセルの距離で、ゼロでない値を持つことが分かります。実際、それはかなり高い値です。これは、実際にはリサイズが行われていなくても、個々のピクセルの膨大なぼかしをもたらします。例えば、ここでは標準の IM ロゴを Gaussian フィルタを使ってリサイズし、再び通常の IM フィルタ(この場合は 'Lanczos'。後で見ます)を使ってリサイズしました。

  magick logo:  -filter Gaussian  -resize 150x logo_gaussian.png
  magick logo:                    -resize 150x logo_normal.png

| [IM Output]
Gaussian | [IM Output]
通常のリサイズ
---|---|---

よく見ると、左の 'Gaussian' フィルタを適用した画像は、通常のリサイズよりぼやけていることが分かります。特に、杖の周りや魔法使いの帽子の上の小さな星々の細部に関してです。この画像のぼかしは、画像縮小におけるすべての エイリアシング 効果と、画像拡大におけるすべての ブロッキング 効果を除去することのトレードオフです。また、(完璧に適用された場合)決して リンギング 効果を生み出しません。しかしそれらすべては、結果画像の極端な ぼかし を代償としています。実際、大規模な拡大の間、このフィルタは四角い点ではなく丸い点を生成します。例えば、ここでは中央に単一の点を持つ 3x3 ピクセルの画像を大きく拡大します。 |

  magick xc:red -bordercolor yellow -border 1 \
          -filter Gaussian   -resize 99x99  -normalize dot_gaussian.jpg

[IM Output]
ご覧の通り、単一のピクセルが完全に円形の点に拡大されます。Gaussian および Gaussian 系のフィルタだけがこれを行います。

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

特別なエキスパートオプション "[-define](https://imagemagick.org/command-line-options/#define) filter:sigma=_{value}_" を使って、ガウス曲線の実際の 'sigma' 値を指定することで、Gaussian フィルタを直接コントロールできます。デフォルトではこの値は '0.5' で、これは Box フィルタ と同じサイズでもあります。多くの点で、Gaussian フィルタは本質的に 'ぼかした box' とみなせます。このエキスパートオプションは、フィルタのサポート 範囲(下記を参照)を縮小せずに、非常に非常に小さな Gaussian ぼかしを作成できるようにするために追加されました。しかし、'sigma' を増やすと、フィルタがクリップされる原因になることがあります。そのため、'sigma' 値を増やすと、デフォルトの 'support'(2.0)も同程度の量だけ増やされます。これはデフォルトの 'sigma' 値の増加時にのみ起こります。サポートエキスパート設定 を使ってこの自動効果を上書きできますが、通常は必要ありません。 | _'filter:sigma' エキスパートオプションは Gaussian フィルタ でのみ機能します。他のフィルタはこのエキスパートコントロールの影響を受けません。

他のフィルタ向けのより一般化されたコントロールは、後で見る Blur フィルタエキスパートコントロール を使って達成できます。

_
---|---

その他の Gaussian 系フィルタ

[IM Output] 右の比較グラフを調べると、'Quadratic' フィルタや、やや複雑な 'Spline' フィルタが、'Gaussian' フィルタの重み付け曲線にかなりよく従っていることが分かります。そして多項式関数であるため、計算もはるかに高速で、これがそもそもそれらが発明された理由でした。'Quadratic' は Gaussian フィルタ よりごくわずかにぼやけている程度ですが、'Spline' フィルタはさらにぼやけており、Sigma 設定で約 '0.65' に相当します。これにより、'Spline' フィルタは、改変なしで提供される中で最もぼやけたフィルタとなります。グラフを調べると、Gaussian フィルタ と同様に、また 補間フィルタ とは異なり、サンプリング点から 1.0 の距離でゼロでない値を持つことが分かります。これにより近傍のピクセルが色を統合し、これがあなたの見るぼかしの原因です。'Spline' フィルタは 1.0 の距離で最も高い値を持ち、リサイズ(あるいは歪み変形)された画像に最大量のぼかしを生み出します。この余分なぼやけは、大規模な拡大で存在し得る最後の 'ブロッキング' 効果を取り除きます。そして リサイズした画像のシャープ化 技法と組み合わせて、結果に非常に少ない '階段効果' で線画を拡大するのに使えます。'[Mitchell](#mitchell)' フィルタも比較グラフに示されています。このフィルタもサンプリング点から 1.0 の距離でいくらかぼかしを持つため、これも他の見てきたフィルタと同様、わずかにぼやけています。しかし、曲線に負の重み付けも持ち、それが リンギング 効果(後の ウィンドウ Sinc フィルタ を参照)を生み出す一方で、鋭いエッジ近くでそのぼやけを相殺します。

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

Gaussian フィルタは IIR(無限インパルス応答)フィルタとして知られており、これは単に、それが使う応答 '曲線' が決してゼロに達しないことを意味します。つまり、サンプリング点からどれだけ離れても、非常に遠いピクセルから結果へのゼロでない寄与がいくらか残ります。数学的には、これは実際には良いことです。なぜなら、結果がはるかに数学的に完璧であることを意味するからです。実際の応用では、無限フィルタは、出力画像のあらゆる新しいピクセルを生成するために、元画像のすべてのピクセルの加重平均を使う必要があるため、非常に悪いことです。それは、大きな画像をこのフィルタで完璧にリサイズするには非常に非常に長い時間がかかることを意味します。しかし 'Gaussian' フィルタの場合、サンプリング点から約 2 ピクセル(デフォルトの 'sigma' 設定の 4 倍)を超える範囲は、一般に最終結果に関してほとんど効果を生まないため、一般的に無視できます。sigma の 3 倍でも一般にそれなりとみなされます。この範囲はフィルタの 'サポートウィンドウ' として知られ、プログラムにとってのフィルタの実用的な限界です。本当に望むなら、特別なエキスパート設定 "[-define](https://imagemagick.org/command-line-options/#define) filter:support=_{value}_" を使ってフィルタの 'support' を変更できます。例えば、ここでは単一のピクセルを持つ画像を、より小さなサポート値 1.25、すなわち sigma 値の 2 と 1/2 倍を使ってリサイズします(右の 結果のグラフ を参照)。これはもちろん、一般に受け入れられる sigma 値の 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]
Gaussian フィルタ適用
---|---|---
[IM Profile]
画像のプロファイル

より小さな 'support' 設定を使うことで、'ステップ'(サポートウィンドウが関数を打ち切る箇所)が 1.25 の位置に移動しました。それが今度は、フィルタのプロファイルにより大きな 'ストップ' をもたらし、拡大で見られる 'エイリアシング' 効果を生み出します。つまり、グラフの 'ピーク' 付近の揺れ、そしてフィルタの 'サポート' 限界のエッジでの突然の '落ち込み' です。'support' は、拡大画像の結果を生み出すために一緒に平均化されるピクセルにわたってスライドする 'ウィンドウ' と考えることができます。サポートサイズが 1.25 なので、フィルタの総サポート領域は幅 2.5 ピクセル(画像拡大時はスケーリングされない)であり、そのため水平方向のリサイズフェーズには 2 つまたは 3 つのピクセルが関与し得ます。このサポート 'ウィンドウ' が画像にわたってスライドするにつれ、入ったり出たりする各ピクセルが、フィルタの '曲線' に突然の '変化' を生み出します。これが、結果のわずかな揺れの原因です。つまり、これらの点で、フィルタの重み付け曲線に従って一緒に平均化される総ピクセル数に、ピクセルが追加または除去されているのです。これが今度は、リサイズ画像に 4 つのこうした '揺れ' あるいは 'ジグザグ' を生み出します。最初の 2 つは、単一の白いピクセルがサポート範囲に入る/出るときの外側のエッジ上で、そして 2 つ目のペアの揺れは、2 つ目の黒いピクセル(3 ピクセルの加重平均を作る)がサポート範囲に入る/出るときです。フィルタにそのような突然の 'ストップ' がなければ、つまりフィルタがサポート限界設定でゼロに達すれば、'揺れ' は見えず、目に見える効果も生じません。サポートサイズを整数または半整数('Gaussian' フィルタのデフォルトの 'support' 設定 '2.0' など)に設定すれば、新しいピクセルがサポート範囲に入るときには常に別のピクセルが出ていくことが保証され、同じ数のピクセルが常にその平均の一部となります。それは中央の 2 つの揺れを取り除きますが、サポート限界を示す外側の最初の揺れは取り除きません。TriangleLagrange フィルタで得られるような、フィルタの鋭い傾斜変化(不連続)でさえ、結果画像に目に見えるアーティファクトを生み出すことがあります。 | _IM v6.3.6-3 より前は、Gaussian フィルタの 'support' はこの '1.25' という値に設定されており、拡大で(上に示したような)リンギング 効果を生み出していました。このため、常に同じ数のピクセルが平均化されるように、そしてより小さなステップを減らすために、Gaussian の 'support' は '1.5' に変更されました。

IM v6.6.5-0 の時点で、Gaussian のデフォルトの 'support' 設定は '2.0' という値に増やされました。これはフィルタの全体的な速度にはほとんど影響しませんが、'ストップ' を事実上存在しないものにします。また、特に EWA 歪み変形可変ぼかしマッピング など、このフィルタの他の特殊な用途のためのフィルタコーディングを簡素化しました。

_
---|---
ただし、非常に大きな support 設定を使うと、もちろん一緒に平均化する必要のあるピクセルが増え、結果の実質的な改善なしにリサイズ操作が遅くなることに注意してください。ウィンドウ Sinc/JincLagrange フィルタだけが、2.0 より大きなサポートウィンドウを使うことで、一般により良い結果を生み出せます。これらは 'エキスパート' オプションであり、そのため、これらのオプションを使うことで物事を良くするよりも悪くする可能性の方が高いことを覚えておいてください。それが、これらが単純なコマンドラインオプションではなく、特別な "[-define](https://imagemagick.org/command-line-options/#define)" オプションを介して提供される理由です。もちろん、物事をよりよく理解しようとして、私が上でやったように、あなたが遊ぶのは歓迎します。IM はまさにそれができるように、これらのオプションを提供しています。

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

特別なエキスパートオプション "[-define](https://imagemagick.org/command-line-options/#define) filter:blur=_{value}_" を使って、フィルタが提供するぼかしの量を調整できます。'1.0' という値がデフォルトの動作を生み出し、より小さい値とより大きい値が全体的な 'ぼやけ具合' を調整します。基本的に、これはフィルタの曲線を X 軸(サンプリング点からのピクセルの距離)に沿って線形に拡大または縮小し、典型的にはフィルタを全体的により多く、あるいはより少なくぼやけさせます。より小さい設定を使うと、フィルタの関数(とそのサポートウィンドウ)がより小さくなります。Gaussian および Gaussian 系 フィルタの場合、効果はフィルタの 'sigma' 値(デフォルト=0.5)にこの 'blur' 係数を掛けたかのようになります。この設定はまた、クリッピングを防ぐために、フィルタの サポートウィンドウ を同じ量だけ拡大または縮小しますが、これは サポートエキスパートフィルタ設定 を使って上書きできます。例えば、ここでは Gaussian 系の Spline フィルタ を使い、3 つの異なる 'blur' 設定で画像をリサイズします。

  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]
blur 0.5 | | [IM Output]
blur 1.0 | | [IM Output]
blur 1.5
---|---|---|---|---

ご覧の通り、この特別な設定を使うと、'Spline' フィルタの結果の全体的なぼやけ具合をコントロールできます。'サポートウィンドウ' のサイズも フィルタブラー 設定によってスケーリングされるため、非常に小さなスケーリング値を使うと、リサンプリングがすべてのピクセルを 'ミス' したり、ゼロ重み付けのピクセルしか生成しなかったりすることがあります。その結果、規則的な '黒い' 線やブロックが生成されます。例えば… |

  magick rose: -define filter:blur=0.1 -filter Gaussian \
          -resize 100x100  rose_black_bars.png

[IM Output]
サポートウィンドウのサイズを(blur によってスケーリングされる前に)増やすと、これらの効果を防ぐのに役立つかもしれませんが、ほとんどのフィルタは '自然な' サポート範囲外に入るピクセルにゼロ重み付けしか生成しないため、すべてのフィルタで機能するわけではありません。サポート範囲全体にわたって有用なゼロでない値を典型的に生成する唯一のフィルタは、Box フィルタSinc/Jinc ウィンドウフィルタ です。同様の効果は、円筒型フィルタ でも、フィルタのサポートが小さくなりすぎて、サンプリングする少なくとも 1 つのピクセルを常に見つけられないときに見られます。Lagrange フィルタサポートエキスパートフィルタ設定 を使って 'サポートウィンドウ' に収まる適切な '次数' を決定し、こうしてさまざまな他の形に変形します(下記を参照)。 | _負の重み付けを含むフィルタ(基本的に次に見るフィルタのいずれか)で不適切なサポート設定を使うと、逆シャープ化やネガ化効果、そして不釣り合いに強いエイリアシング効果を生み出すことがあります。まれに、無限に重み付けされた色を生成することさえあります(これは通常の非 HDRI 版 IM では純粋な黒と白にクランプされます)。

どのフィルタでも、この特別なオプションを使う際には注意と専門知識が推奨されます。
---|---
| _IM v6.3.6-3 より前は、'filter:blur' define がオプション "-support" によって誤って設定されており、それが正確に何をするかについて非常に紛らわしいものでした。このオプションは非推奨となり、もう利用できません。

---|---

Gaussian 補間フィルタ変種

[IM Output] Gaussian 系フィルタBlur コントロール 値 '0.75'、あるいは Gaussian フィルタSigma コントロール 値 '0.375' は、私が Gaussian 補間器 と呼ぶ変種を生成します。このシャープ化された Gaussian フィルタは、上で見た 補間フィルタ と似た性質を持ちます。しかし、拡大画像で目立つことのある鋭いストップやその他のグラデーション変化を一切含みません。この点で、それは "[Hermite](#hermite)" フィルタによく似ています(グラフを参照)が、補間器としてより良く機能するように見える非対称な歪みを持ちます。

  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]
Gaussian | | [IM Output]
Gaussian 補間器
(blur=0.75 または sigma=0.375)
---|---|---

実際、これは Gaussian フィルタに、シャープすぎず、ぼやけすぎず、はるかに受け入れやすい結果を生み出させると感じています。しかし、フィルタの ぼかし を減らすと エイリアシング 効果が強まり、低ピクセルレベルのパターンから大規模なモアレ効果を生成しやすくなります。これは、フィルタのよりぼやけの少ない形を使うことのトレードオフです。

  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]
Gaussian | | [IM Output]
Gaussian 補間器
(blur=0.75 または sigma=0.375)
---|---|---

ウィンドウ Sinc フィルタ

Sinc フィルタ

数学的には、画像をリサイズする(2 パスの 'テンソル' リサイズ技法を使う)ための理想的なフィルタは Sinc() 関数であることが判明しています。(ナイキスト–シャノンのサンプリング定理 を参照)。[IM Output] Sinc() は数学的に完璧であり、指摘したい特別な特徴をいくつか持っています。まず、サンプリング点からのすべての整数距離で、フィルタの重み付け関数がゼロになります。これは非常に重要です。なぜなら、フィルタが(Gaussian フィルタ とは違って)必要以上に画像をぼかさないことを意味するからです。また、画像がリサイズなしでリサンプリングされた("no-op" リサイズ)場合、画像はフィルタの影響を完全に受けないままであることも意味します。それはこうして補間フィルタですが、非常に複雑なものです。Jinc() 関数は Sinc() と密接に関連しており、汎用画像歪み変形演算子 が使うような二次元フィルタリングのフィルタとして有用な性質を持っています。この関数については後で 円筒型フィルタ で詳しく説明します。今は、それが ウィンドウ Jinc フィルタ の基底関数としても使えるということだけ覚えておいてください。Sinc() ベースおよび Jinc() ベースのフィルタと、これまで見てきた以前のフィルタとのもう一つの大きな違いは、重みの多くが負であることです。つまり、画像の各ピクセルについて、近くの色のピクセルの一部を最終的な色から差し引きます。これは少し奇妙に思えるかもしれませんが、結果としてオブジェクトのエッジを強くシャープ化します。もちろん、どんな負の重みも、一般に曲線のさらに先のもっと多くの正の重みで相殺される必要があり、それがサンプリング点から長い範囲に伸びる、波のような関数を生み出します。これらの正(および負)の重みの余分な 'ローブ' は、非常に強い色境界を含む画像、例えば高コントラストの線画や、青空に対する赤い屋根のような境界に、リンギング アーティファクトを引き起こします。これらのリンギング効果は、これらの関数に基づくフィルタが不適切に適用されると、さらに顕著になることがあります。

ウィンドウ関数

残念ながら、この関数も IIR(無限インパルス応答)関数です。つまり、以前の Gaussian フィルタ と同様に、無限遠まで及ぶ効果を持つということです。これは、'Sinc' を使うには、出力画像のあらゆる新しいピクセルに最良の表現を作り出すために、画像内の(そしてそれを超えた)すべてのピクセルの加重平均を生成する必要があることを意味します。これは法外に高価であり、これらの完璧なフィルタを直接使うことを非実用的にします。リンギング効果のせいで、そうしたいとも思わないでしょうが。しかし Gaussian フィルタ とは違って、'Sinc' 関数はサンプル点から短い距離で単にほぼゼロに先細りするわけではありません。実際、サンプリング点から 10 ピクセル離れても(上のグラフを参照)、最終結果にかなりの効果を及ぼします。しかし、サポート距離 10 を持つフィルタで画像をリサイズするには、最終結果のピクセルごとに少なくとも 20x20、すなわち 400 ピクセルの平均化が必要になります。そしてそれは非常に遅いリサイズを生み出します。その結果、生の "Sinc" フィルタを使うことは推奨されず、ほとんど決して使われません。ただし、エキスパートフィルタコントロール を使えば、IM はあなたが本当にそうしたい場合に、これを行うのを妨げません。推奨され、提供されているのは、無限の Sinc(および Jinc)関数をより実用的なサイズに '制限' するために、画像処理の専門家によって開発された 'ウィンドウ' 形式の Sinc 関数です。これらの ウィンドウフィルタ には、'Blackman'、'Bohman'、'Hann'、'Hamming'、'Lanczos'、'Kaiser'、'Welch'、'Bartlett'、'Parzen' といったフィルタが含まれます。

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

[IM Output] 例えば、右のグラフは 3 つの関数を示しています(拡大表示を得るにはクリックしてください)。赤の関数は数学的に理想的な Sinc() 関数で、無限遠まで伸びています。緑の関数は "Hann" ウィンドウ関数(単純な Cosine() 曲線に基づく)です。これは Sinc() と掛け合わされて、フィルタのより遠い成分を変調し、サポートウィンドウのエッジ(このフィルタではデフォルトで距離 4.0 ピクセル単位)でゼロ(あるいはほぼゼロ)に達します。基本的に、"[-filter](https://imagemagick.org/command-line-options/#filter)" の選択で 'Hann' を選ぶことは、実際には 'Sinc()'(あるいは 'Jinc()')のような '重み付け関数' を変調するための 'Hann()' 'ウィンドウ関数' を選んでいるのです。そのため、'ウィンドウフィルタ' は実際には 2 つの関数です。Sinc または Jinc 関数(画像処理演算子に依存)と、使うフィルタとして具体的に選んだ 'ウィンドウ関数' です。(下記の エキスパートフィルタコントロール を参照)。 v6.3.6-3 より前、IM はウィンドウ関数を直接フィルタの重み付け関数として使うという重大な誤りを犯していました。これが今度は、リサイズに使われたとき、これらのフィルタ(Lanczos を除く)すべてに、ひどく エイリアシングした 画像を生み出させていました。その結果、これらのフィルタは IM ユーザーにしばしば誤解され、めったに使われませんでした。これは今では修正されています。

さまざまなウィンドウフィルタ

[IM Output] 右は、執筆時点で IM が利用できるさまざまなウィンドウ関数すべてのグラフです(後でさらに追加されました)。そう、たくさんあります。ウィンドウ関数は、多数の信号処理の専門家による集中的な研究の対象となってきたからです。すべてのウィンドウフィルタ関数は一般に、使われるウィンドウ関数のクラスに応じて、Sinc(または Jinc)の重み付け関数を 3 または 4 のサポート(Sinc では 3 または 4 ローブ)を使って変調するために使われます(下記を参照)。例えば 'Blackman' ウィンドウフィルタは 4 ローブを使いますが、'Lanzcos' は 3 ローブを使います。これは IM のバージョンに依存するので、確実にしたい場合は Verbose フィルタエキスパートオプション を確認してください。ご覧の通り、すべてのウィンドウフィルタ関数は、同じく示されている元の Sinc() 関数の弱められた形を生み出します。そして、特定のフィルタが生成する リンギング の量以外には、あるウィンドウフィルタを別のものと区別するものはしばしばほとんどありません。おそらく最良のウィンドウフィルタの一つは '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 重み付け関数(または円筒型(distort)リサンプリングでは Jinc 関数)の 4 ローブにわたって ローブサポート を使います。先細りしない 'ローブ' タイプのウィンドウフィルタは、デフォルトで 3 ローブのサポートを使います。これは、ウィンドウ関数のロールオフの違いにより、2 つのタイプのウィンドウフィルタの間でおおよその等価性をもたらします。これはまた、先細りしないウィンドウフィルタが、デフォルトで先細りするものよりわずかに高速であることも意味します。フィルタが持つべきデフォルトのローブ数は、IM フォーラムの議論 Add Cosine windowing? で議論されました。もちろん、望むなら、どのリサイズフィルタの ローブサポート、あるいは一般的なサポートさえも変更できます。それらはすべてほぼ同じで、生成されるリンギングとブロッキング効果の量にごくわずかな違いがあるだけです。[IM Output] 右は同じウィンドウ関数ですが、関数の先細り/非先細りの性質に応じて IM が定義したデフォルトの ローブサポート を使っています。ご覧の通り、最初の 2 つのローブ(最も影響力のある主要なもの)にわたっては、どのフィルタの間にもほとんど違いがなく、すべてがその範囲で非常に似た 'ロールオフ' を示します。しかし、関数の順序はあまり変わっておらず、極端は依然として 'Welch' と 'Parzen' の間にあり、'Lanczos' は結果として得られる曲線のロールオフのちょうど真ん中に位置しています。[IM Output] そして右は、ユーザーが上記のデフォルトを使ってそれらのウィンドウ関数を選択することで提供される、結果として得られるウィンドウ Sinc フィルタです。ご覧の通り、最終的な重み付け曲線はすべて非常に似ており、予想通り、すべてが 'Welch' と 'Parzen' の極端の間に挟まれています。これらのさまざまなウィンドウ関数のより詳細な定義とグラフ、そしてフーリエ周波数スペクトルにおける結果は、Wikipedia, 窓関数 で見ることができます。
まとめると: これらのさまざまなウィンドウ関数の結果の間に、大きな違いは見いだせませんでした。また、結果に関する研究論文を読んだところ、いずれもその適合性に関する確固たるものというよりは、より定性的な意見のように思えました。私の感覚では、ほぼどんなウィンドウ関数でも使えますが、もし一つ選ぶとすれば、最も人気のある 'Lanczos' ウィンドウフィルタにこだわるのが良いでしょう。それは上記のすべてのフィルタの真ん中にあり、良い周波数スペクトル応答を持ち、一般にリサンプリングフィルタとして良い選択です。一方で、ImageMagick のリサンプリングフィルタに尽力してきたある画像処理の専門家は、これに同意しません。ただし彼は、特定の画像の正確な要件に基づいてフィルタを選びます。彼の提案とコメントは Nicolas Robidoux 推奨の技法 で見ることができます。

Lanczos フィルタ

'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 は、指定されたウィンドウ関数を使って、それらをはるかに小さく、より実用的なサイズに制限します。しかし、はるかに大きく、より遅いウィンドウ(サポート)サイズを使って、画像のはるかに良く、より正確なリサイズを本当に得ようとしたい状況もあるかもしれません。それは、Gaussian 系 フィルタでやったのと同じように、フィルタサポート エキスパートコントロールを使って、かなり簡単に行うことさえできます。ウィンドウ関数自体が、(ほとんどの場合)サポート 設定範囲にわたって Sinc(および Jinc)をゼロに減らします。しかし、ウィンドウ関数が 'サポート' ウィンドウに収まるようにスケーリングされるため、結果として得られるフィルタ関数も変化します。[IM Output] 例えば、右に、参照として Sinc() 関数に対して、2 から 8 までのさまざまな 'support' 設定を使って 'Lanczos' ウィンドウフィルタをグラフ化しました。フィルタの実際のサイズは、使われる実際のサポートサイズによって制限されることに注意してください。'support' が小さいほどフィルタは高速ですが、関数が数学的に理想的な Sinc() 関数に従う正確さは低くなります。グラフ化された各曲線をよく見てください。'緑'(support=2)の曲線は、中央の主ピークと 1 つの負の 'ローブ' だけを持ちます('Lanczos2' フィルタに相当)。これ以降、関数は単にゼロで、使われません。次の '紫'(support=3、デフォルトの 'Lanczos' フィルタ)の曲線は、はるかに大きな最初の負の 'ローブ'、それからより小さな正の 'ローブ' を持ちます。これは、サポートサイズが整数刻みで増えるにつれ、より多くのローブが追加されながら続きます。追加のローブは高さがますます小さくなり、最終結果への影響はますます少なくなりますが、初期の 'ローブ' は高く(より多くの影響、ゆえにより多くの リンギング 効果)なります。最良の効果のためには、サポート設定を使って、それだけの数の上下の 'ローブ' を持つフィルタを生成するとよいでしょう。つまり、ウィンドウ関数、ゆえにフィルタの 'サポート' が 'ゼロ交差' で終わるようにします。しかし、Sinc() 関数は整数の 'support' 設定で 'ローブ'(ゼロ交差)を持つのに対し、Jinc() 重み付け関数はそうではありません。これは、Distort 演算子 で使われるフィルタのサポートウィンドウを調整したいユーザーにとって問題となります。実際、Jinc() は非常に 無理数 の位置に 'ゼロ交差' を持ちます。これらのゼロ交差は、数学の専門家でなければ計算するのが非常に困難です。'ローブ' の数でフィルタを設定しやすくするために、別の特別な設定 "[-define](https://imagemagick.org/command-line-options/#define) filter:lobes=_{integer}_" が作られました。フィルタが、一般に基底関数として Jinc() を使う 汎用歪み変形演算子 のような二次元画像リサンプリング演算子で使われる場合、そのフィルタの最初の 20 のゼロ交差のテーブルを参照し、'サポート' 設定をその値に設定します。これは、Jinc() 関数の適切なサポート設定を見つけようとする必要がなく、使いたいローブの数を指定するだけでよいことを意味します。このため、より直接的な 'サポート' 設定を指定するよりも、フィルタが含むべき 'ローブ' の数でウィンドウ Sinc または Jinc フィルタを指定する方が良いのです。フィルタ定義に Sinc()Jinc() 関数も使われない場合は、'filter:lobes' 設定がフィルタの使用に適した 'サポート' 設定を計算するために使われます。ただし、'filter:support' 設定は与えられた 'filter:lobes' 設定を上書きするので、特に 汎用歪み変形演算子 を使う場合は、'filter:lobes' エキスパートオプションのみを定義する方が良いことに注意してください。

Lagrange フィルタ

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

そのため、Lagrange 次数 4 フィルタを得るには、オプション_ -define filter:support=2.5 を使います。
---|---
[IM Output] より大きな サポート 設定では、'Lagrange' フィルタは、複雑な三角関数計算や、さらには追加のウィンドウ関数を必要とせずに、ウィンドウ Sinc フィルタ を生成します。サポート設定が大きいほど、フィルタは Sinc() 関数をより近く模倣しますが、計算も遅くなります。(左のより大きなサポートの Lagrange フィルタのグラフを参照)。
[IM Output] より小さな サポート 設定を使うと、'Lagrange' フィルタはさまざまな 補間フィルタ のほとんどを模倣します。つまり、'0.5' のサポートサイズは 'Box' フィルタを生成し、'1.0' は 'Triangle' フィルタを生成します。サポート 設定は半整数による調整に限られており、それ以外のサポート係数を使うのはあまり生産的ではありません。
[IM Output] もう一方の半整数サポートの Lagrange フィルタ(偶数次数を生成する)は、非常にばらばらなフィルタ重み付けのセットを生み出し、'Box' フィルタによく似て、いくつかの強い ブロッキング リサイズアーティファクトを生み出すことがあります。一方で、小規模なリサイズでは、これが非常に小さなリサイズ調整に対して画像をシャープに保つことを保証できます。これらの '偶数' 次数の 'Lagrange' フィルタは、実際にはこのフィルタを使うことの主な欠点を浮き彫りにします。それは、重み付け関数が '滑らかな' グラデーションではないということです。大規模な拡大では、これは生成されるグラデーションに目に見える変化が出ることを意味します。しかし、これらの極端な場合を除けば、めったに問題にはなりません。基本的に、それは現在の 'サポート' 設定に対して、その設定がどれだけ大きくても小さくても、普遍的に適切なものを作り出すフィルタを表します。それは自己ウィンドウ化リサイズフィルタです。 | '[Lagrange](#lagrange)' フィルタは、IM バージョン v6.3.7-1 まで完全に定義されず、使用可能ではありませんでした。
---|---

Cubic フィルタ

多くの画像専門家が、画像リサイズのためのより良く、より計算の速いフィルタを見つけようとする中で、フィルタのファミリが進化し、Cubic フィルタとして知られるようになりました。これらは、以前に示した Lagrange フィルタ によく似ており、より小さな固定された区分セクションのセットで構成されていました。しかし Lagrange フィルタとは違って、その断片は、鋭い ブロッキング 効果を減らすために、滑らかな曲線を形成するように組み合わさるよう設計されていました。[IM Output] 左のグラフに示されているのは、IM 内で事前定義され、リサイズフィルタとしての使用でよく知られた、こうした 4 つの '滑らかな' cubic フィルタです。'Spline' フィルタ(一般的な 'Cubic' フィルタ関数のエイリアスおよびデフォルト設定としても使われる)は、Gaussian ぼかしフィルタ を模倣します。この曲線は 'B-スプライン' 補間曲線としても知られ、点の集合を通る滑らかな線を描くのにもよく使われます。また、アニメーションでのカメラやオブジェクトの動きにもしばしば使われ、ユーザーが提供した制御点を通る滑らかな流れを生み出します。同じく示されているのは 'Catrom'、より正確には 'Catmull-Rom フィルタ' あるいは 'Keys Cubic Convolution' で、これは 補間フィルタ の滑らかで非ぼかしの形を生成します。ただし、わずかにオーバーシュートすることがあります。それは本質的に理想的な自己シャープ化フィルタであり、そのため基本的な バイキュービック補間 によく使われる関数でもあります。そして最後に 'Hermite' Cubic フィルタ。これは滑らかにされた三角形 補間フィルタ の一種で、入力座標で滑らかに減速(ロールオフ)します。基本的に、元画像の平坦な '色レベル' を保ちつつ、強いエッジを丸めます。

Cubic フィルタファミリ

上記は Cubic 曲線の最も一般的な '名前付き' フィルタですが、それらは特定の Cubic フィルタファミリにも属しています。'B-スプライン' ファミリ の cubic は、本質的に結果のさまざまな度合いの ぼかし に相当します。典型的には、非常に ぼやけた 'Spline' フィルタから、エッジを丸めるが ブロック状の 結果の 'Hermite' フィルタにまで及びます。次に 'Cardinal' ファミリ があり、これは ブロッキングリンギング アーティファクトの間で妥協するフィルタを生み出し、そこから 'Catmull-Rom フィルタ'('Catrom')がこれらのアーティファクトのバランスの取れた妥協として進化しました。これら 2 つのファミリは次に統合されて 'Keys Cubic フィルタファミリ' を形成し、これが 'Catmull-Rom フィルタ'(Keys α = 0.5)を 'B-スプライン Cubic フィルタ'(Keys α = 0.0)と結びつけました。Keys ファミリのフィルタはまた、画像全体に存在しうるあらゆる線形(アフィン)グラデーションを保つという特別な性質も持っています。Keys ファミリフィルタの リンギングぼかし 効果は、画像が滑らかな色のグラデーションではなく、強い色の変化を含むときにのみ現れます。この多様さに混乱しましたか?もちろんそうでしょう。皆も同じでした!問題は、フィルタの結果がしばしば非常に主観的で、画像に依存し、使っている 'ファミリ' の制約に依存することです。何が良いフィルタを作るかは、誰に尋ねるか、拡大しているか縮小しているか、そしてどんな画像を処理しているかに本当に依存しました。ある意味で、今でもそれは混乱しています。この要約の始まりを思いつくまで、さまざまなフィルタについて読んだり遊んだりして 2 年以上の試行錯誤がかかり、今でもまだ進化しています。画像リサイズは非常に主観的な領域で、いかなる実際の方法でも定量化するのが困難(実際には不可能であることが証明されています)です。'完璧な' リサイズなどというものは存在しません。

Mitchell-Netravali フィルタ

これに対して、Don P. Mitchell と Arun N. Netravali が、論文 'Reconstruction Filters in Computer Graphics' を発表し、'B'('B-スプライン' 曲線に使われる)と 'C'('Cardinal' 曲線に使われ、'Keys' フィルタの α 値に相当)として知られる 2 つの変数を定式化しました。これら 2 つの値を使うと、滑らかに当てはまる(一階導関数が連続な)任意の区分的 cubic フィルタを生成できます。[IM Output] より重要なことに、彼らは自分自身の意見だけに頼るのではなく、9 人の画像処理の専門家のグループに調査を行い、B と C のさまざまな値を使って画像をわずかに拡大したときに生成される アーティファクト を分類しました。その調査の結果が右の再現図に示されています。'緑' の領域は、専門家が受け入れられる結果を生み出すとみなした値を表し、その他のさまざまな領域はさまざまなタイプの アーティファクト を生み出します。この画像は重要です。なぜなら、それはさまざまな アーティファクト と、生成できるさまざまな異なるタイプのフィルタとの関係を本当に示しているからです。結果から、なぜ 'Keys' ファミリのフィルタがこれほど重要になったのか、良い cubic フィルタを生成するより良い方法の一つとして、その理由も分かります。そのフィルタは基本的に、画像処理の専門家が '受け入れられる' とみなした領域をまっすぐ貫く線上に位置していました。この調査から、Mitchell と Netravali は、最良のフィルタが 'Keys' ファミリのフィルタで、受け入れられる領域の真ん中に位置し、B,C 値 1/3,1/3 を使うものであると判断しました。このフィルタは今では 'Mitchell-Netravali フィルタ' として知られ、IM では 'Mitchell' フィルタ設定として利用できます。基本的に、それはすべてのリサイズアーティファクトの妥協です。それはまた、IM 画像拡大に使われるデフォルトフィルタでもあります。組み込みの '名前付き' Cubic フィルタすべて、'Mitchell'、'Robidoux'、'Catrom'、'Spline'、'Hermite' も上の図にマークされており、それらの専門家がそれらの特定のフィルタについてどう考えるかを示しています。同じく示されているのは、'B-スプライン'、'Cardinal'、'Keys' フィルタファミリを表す線です。内部的に、これらのフィルタはすべてフィルタの事前定義された B,C 設定によってのみ異なります。実際、IM はすべての cubic フィルタを生成するのに同じ内部関数を使い、それらのフィルタを定義するために異なる B,C 設定を使うだけです。

Cubic B,C エキスパートコントロール

特別なエキスパート設定を使って、Cubic フィルタ が使う B,C 設定を設定できます。これを行うには、一般的な 'Cubic' フィルタ '関数'(あるいは他の名前付き cubic フィルタのいずれか)と、希望する 'b' および 'c' エキスパート設定を選ぶ必要があります。例えば…

   -filter Cubic
   -define filter:b=_value_
   -define filter:c=_value_

エキスパート設定は、与えられたフィルタがリサイズまたは distort 演算子で使われるとき、その内部デフォルトを上書きします。そのため、画像処理演算子が使われる前に、希望するすべてのグローバルなエキスパート設定を "[-define](https://imagemagick.org/command-line-options/#define)" または "[-set](https://imagemagick.org/command-line-options/#set)" している限り、上記のオプションの順序は問題になりません。'b' または 'c' 設定の一方が定義または設定されていない場合、その値は、あなたが 'Keys' ファミリのフィルタを望んでいるという仮定(Mitchell-Netravali 調査図の点線に沿って)に基づいて、もう一方の値から計算されます。'c' は Keys の α 設定に相当し、'b' は cubic スプラインの 'blur' 設定と考えられることを覚えておいてください。これらのエキスパート設定は、ユーザーが画像リサイズを 'チューニング' して、望むものを正確に得るための良い方法を提供します(Resize を使っていても Distort を使っていても)。'b' 設定は 2 つのうち理解しやすい方です。'b' を 'ぼやけ具合' と考えてください。b=0 の値は非常にシャープ(Catmull-Rom フィルタ)で、負のハロ リンギング といくらかの エイリアシングまたはモアレ 効果を生み出す傾向があります。b=1 の値は、過度にぼやけた(Spline あるいは Gaussian 系の)効果を生み出す傾向があります。これにより、専門家(あるいは普通のユーザーでさえ)がこの値を調整して、'自分にとって良い' フィルタを見つけるのが簡単になります。右は、特定の '名前付き' Cubic フィルタ の B,C 値の表です。'Hermite' は 'Keys' フィルタファミリの一部を形成しない唯一の組み込み cubic フィルタであることを覚えておいてください。それはまた、すべての BC Cubic フィルタの中で最も小さなサポート('1.0')を持ち、負のローブを含みません。'[Robidoux](#robidoux)' と '[RobidouxSharp](#robidoux_sharp)' フィルタは 'Mitchell' に非常に似ていますが、調査の結果ではなく、円筒型フィルタ としての特別な用途のために数学的に決定されました。'[Robidoux](#robidoux)' フィルタは 汎用 Distort 演算子(下記を参照)が使うデフォルトフィルタです。 | | | フィルタ | B
ぼかし | C
Keys α
---|---|---
Hermite | 0.0 | 0.0
Spline | 1.0 | 0.0
Catrom | 0.0 | 1/2
Mitchell | 1/3 | 1/3
Robidoux | 0.3782 | 0.3109
Robidoux
Sharp | 0.2620 | 0.3690
Robidoux
Soft | 0.6796 | 0.1602
| 'Parzen' ウィンドウフィルタは 'Spline' フィルタをそのウィンドウ関数として使います。そのため、このウィンドウフィルタを B,C エキスパートオプションで再定義できます。これがどれだけ有用か、そして結果として得られるウィンドウ Sinc(または Jinc)にどんな効果があるかは不明で、推奨されません。
---|---

円筒型フィルタ - Distort 用

すでに何度か触れてきたように、Distort 演算子 は、リサイズ演算子 とはやや異なる方法で画像をリサンプリングするためにフィルタ設定を使います。具体的には、Distort は、'サンプル点' とソース画像のサンプリング領域内の実際のピクセルとの間の '半径' 距離を使ってフィルタを適用し、各ピクセルの重みを、したがってサンプル点での最終的な色を決定します。対照的に Resize は、直交整列したフィルタを使って画像を 2 回処理します。一度は X 方向に、それから再び Y 方向に。それはこうして単純な矩形の画像リサイズに限られ、仮想ピクセル の使用を伴いません。つまり、Distort は 'Box' 形ではなく '円筒' 形を生み出すようにフィルタを適用し、回転や任意の方向への可変スケーリング(伸縮)を含む、X 軸や Y 軸に沿うだけでない自由形式の画像歪み変形を可能にします。このため、フィルタ自体がしばしば調整される、あるいはこのタイプの用途のために特別に設計される必要があります。

補間円筒型フィルタ

ここでは '[Box](#box)' フィルタを使い、同等の ResizeDistort 演算子で単一ピクセル画像を 30 倍に拡大します。

  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](#box)' フィルタが円筒型フィルタとして使われると、円(あるいは 3 次元では円筒)が得られます。しかし、フィルタの扱われ方のために、2 つのピクセルが(等しく)サンプリングされて完璧な中間調のグレーを生み出す領域がいくつか得られます。円筒型 box フィルタは、ソース画像を、混合(加算ではない)される重なり合う円形ピクセルのセット全体に変換すると考えることができます。ここに、拡大のための '円筒型 Box' フィルタを使って画像を拡大した結果の、よりカラフルな例を示します… |

  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 つのピクセルの 'box' あるいは '平均' 混合になります。

_

ここに、いくつかの補間フィルタの比較を示します。オーバーシュートとアンダーシュートが見えるように、グレーの色が使われています。上の行は直交リサイズを使い、下の行は円筒型歪み変形を使っています。

  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]
Box | [IM Output]
[IM Output]
Triangle | [IM Output]
[IM Output]
Hermite | [IM Output]
[IM Output]
Lagrange | [IM Output]
[IM Output]
Catrom
---|---|---|---|---

フィルタが適用される 2 つの異なる方法によって、結果が似てはいるものの、内部的にも外部的にも(リンギング)異なるスタイルの アーティファクト が生成されることが分かります。内部アーティファクトは特に 'Triangle' フィルタで顕著です。ただし、補間フィルタは歪み変形された画像の極端な縮小には特に良くないが、拡大には非常に良いことを覚えておいてください。

円筒型 Gaussian

直交 'resize' と円筒型 'distort' の形の間で結果に違いを生まない唯一のフィルタは、特別な '[Gaussian](#gaussian)' フィルタです… |

  magick xc:red -bordercolor yellow -border 1 \
          -filter Gaussian   +distort SRT 33,0  -normalize  dot_distort.jpg

[IM Output]
これは実際、このフィルタの特別な性質の一つ(分離可能性として知られる)であり、多くの円筒型リサンプリング実装がそれをデフォルトフィルタとして使う理由の一つです。それは元の EWA 論文のデフォルトでしたが、結果も非常にぼやけています。ImageMagick も distort が最初に実装されたときにそれを使いましたが、もう使っていません。直交リサイズの場合と同様に、'Gaussian' フィルタは、特別な 'rings' 画像に適用したときでさえ、結果画像にまったく エイリアシングアーティファクト を生み出しません。しかしその代償は、実際にはほとんどあるいはまったく歪み変形が関与していなくても、ぼやけた結果です。同様に、Sigma エキスパートコントロール の議論で示したように、このフィルタを一種の補間フィルタとしても使えます。 | _IM v6.6.5-0 の時点で、IM は 画像歪み変形 にデフォルトでこのフィルタを使わなくなりました。代わりに、よりシャープな結果を生み出すように特別に設計された別のフィルタ '[Robidoux](#robidoux)' フィルタが使われます。

いずれにせよ、このバージョン以前は、その実装の誤りにより歪み変形も非常にぼやけていました。古いバージョンをお持ちで 画像歪み変形 を使いたい場合はアップグレードしてください。

_
---|---
| _IM v6.6.7-6 より前は、IM は円筒型 Gaussian に、1/2 ではなく、1/sqrt(2) すなわち約 0.707 というやや大きな 'sigma' 値を使っていました。これはやや多くぼやけた結果をもたらし、それは起こりうる エイリアシングアーティファクト を減らすためでした。

これは、円筒型 Box フィルタ のより大きなサポートを Gaussian フィルタに渡すという、ある研究論文の推奨に従ったことで生じた誤りでした。提示された理由は、Gaussian が本質的にぼかした box であるというものでした。違います。Gaussian はぼかした box ではなく、ぼかしたインパルスです。このバージョンはその誤りを取り除き、これは今や、gaussian フィルタが使われるとき、resize でも distort でも同等の結果が得られるべきであることを意味します。

私個人としては、このやや大きな sigma 値を使うと、線画の拡大を行うときに、エイリアシングした対角エッジに沿った 'ブロッキング' アーティファクトを確かに滑らかにすると感じています。しかしそれは特殊な場合です。

_
---|---

ウィンドウ Jinc 円筒型フィルタ

[IM Output] Jinc() 関数(不正確に 'Bessel' フィルタと呼ばれることがある)は、円筒型フィルタリング操作で使うための '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 の場合の Distort とフィルタ

理想的には、no-op の歪み変形はまったく同じ画像を返すべきです。しかし、これまでの例で見たように、これは実際には起こらないかもしれません。リサイズ(2 パス 1 次元)フィルタ: Lanczos(Sinc-Sinc)、Lanczos2、Catrom、Hermite、Triangle、そして他の多くのリサイズフィルタはこの性質を持ちます。画像がスケーリングされなければ、ピクセルパターンは正確に保たれます。一方で、Gaussian、Cubic、Quadratic のようなスムージングあるいはぼかしフィルタは、ほぼ no-op の場合に適用されると画像をぼかします。リサイズフィルタのデフォルトである Mitchell-Netravali でさえ、いくらかのぼかしを含むことに注意してください。それは基本的に B-スプライン 'Cubic' スムージングフィルタと、Cubic の 2 ローブ sinc 相当の Catmull-Rom フィルタの混合だからです。 | _リサイズ演算子はデフォルトで、no-op の場合に何もしないように自身を短絡します。そのため、フィルタを明示的に指定しない限り、'noop' リサイズを生成できません。

Distort は no-op の場合に決して短絡しません。これは、歪み変形のスケーリングが 'no-op' の場合を通過しうるアニメーションでの一貫性を保証するためです。これは典型的に resize では懸念されないことです。

_
---|---
多くのリサイズフィルタが no-op の場合に画像を保つ一方で、円筒型(distort)法は基本的に決して完璧な no-op の歪み変形を生み出しません。どんな no-op の distort も、画像自体が歪められなくても、少なくとも最小限に画像の色を歪めます。何が起こるかというと、円筒型フィルタを使うことで、直交近傍ピクセルの寄与が対角近傍ピクセルのものと異なります。それらは本質的に、ルックアップ点(no-op の場合は実際のピクセルを中心とする)から異なる距離にあります。'Jinc' 関数は、直交近傍の寄与を対角近傍のものと打ち消し合うことで、この色の歪みを減らそうとします。それは実際、その数学的定義の一部です。最悪の場合、'ピクセルレベルのハッシュ' では、すべての対角ピクセル近傍がすべての直交ピクセル近傍と異なります。この場合、フィルタの重み付けは寄与を打ち消すのではなく強めます。その結果、このタイプの画像は、'ピクセルレベルのハッシュ' を含むどんな画像の no-op の歪み変形に対しても、非常に深刻な色の歪みを生み出す傾向があります。ここでは例えば、この特別な性質を実際に使って、画像からハッシュパターンを除去します。スケーリングは使われず、画像に 2 次元の '畳み込み' を適用する歪み変形だけです。

  magick -size 100x100 pattern:gray50  hash.png
  magick hash.png -filter Lanczos -distort resize 100% hash_removed.png

| [IM Output] | | [IM Output]
---|---|---|---

| _ハッシュの知覚されるグレーレベルが、ハッシュの全体的なグレーレベルよりはるかに暗い理由は、人間の色知覚 が働く方法のためです。

修正は、線形 RGB 色空間でリサイズしていることを IM に伝えるために、上記に '-set colorspace RGB' を含めることです。色空間補正を伴うリサイズ を参照してください。

_
---|---
上記は実際には、Jinc 系のカーネル関数を使った 畳み込み に相当します。しかしご覧の通り、Jinc 関数の特別な性質(この場合は EWA Lanczos、すなわち Jinc ウィンドウ化 Jinc)は、元画像に強く存在していたハッシュパターンを完全に除去しました。それが今や残っている唯一の部分は、画像本体を囲む 'abyss'(仮想ピクセルの寄与なし)が結果に影響しうるエッジに沿った部分です。ウィンドウ Jinc フィルタの実際のローブ数も、結果に多大な影響を及ぼします。2 ローブでは、'ピクセルレベルのハッシュ' は、鈍くされたりぼかされたりはするものの、保たれる傾向があります。 |

  magick hash.png -filter Lanczos2 -distort resize 100% hash_2_lobes.png

Jinc 関数に適用されるウィンドウ手法の寄与も、この効果に大きな影響を及ぼします。場合によっては、ハッシュパターンをさらに強めることさえあります。[IM Output]
こうして、no-op の歪み変形のためにフィルタが生成する色の歪みを最小化するように、distort フィルタをどうチューニングするかという問題が生じます。Nicolas Robidoux がこれを行うことに決めた方法は、直交エッジを可能な限り保つ傾向のある blur(フィルタカーネルのサポートの再スケーリング)を選択することでした。

円筒型 Lanczos フィルタ

さて、上で議論したように "Lanczos" は通常、フィルタの重み付けとウィンドウ化の両方に使われる 'Sinc()' 関数として定義されます。しかし EWA 円筒型フィルタとして使われると、重み付け関数の両方が 'Jinc()' 関数で置き換えられます。つまり、(他の線形ウィンドウフィルタの場合のように)重み付け関数が置き換えられるだけでなく、ウィンドウ関数も置き換えられ、Jinc ウィンドウ化 Jinc の重み付け関数を生み出します。そのため、'円筒型 Lanczos' は同じローブ数(デフォルト 3)の "Jinc ウィンドウ化 Jinc" を選択します。この技法は、インタラクティブ(局所的)画像ワーピング に関する論文(24 ページ)で Andreas Gustafsson によって最初に提唱されました。彼は具体的に、'Lanczos2D' と名付けた 2 ローブの円筒型 Lanczos(Jinc ウィンドウ化 Jinc)フィルタを使いました(次を参照)。これは単に、平面(EWA)状況への明白な拡張でした。ゆえに同じ名前が使われています。これに関する詳細は、BC-splines 議論のこの投稿 を参照してください。

Lanczos2 - 2 ローブ Lanczos

便宜上、この 2 ローブ版は、単に '**Lanczos2**' と名付けられ、特に歪み変形での使用のために IM v6.6.4-10 に含まれました。それは実際、'filter:lobes=2' エキスパート設定を持つ円筒型 'Lanczos'(Jinc-Jinc)フィルタにすぎません。上のグラフ を参照してください。IM フィルタは適宜 Sinc()Jinc() 関数の使用を自動的に切り替えるので、それは '2D'(円筒型)用途専用ではありません。resize にも使えます(Sinc-Sinc 関数として)が、おそらく少し小さすぎて、さまざまな他の cubic 関数と実質的に同等になるため、お勧めしません。

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

Jinc() 関数をウィンドウ化すると、直交リサイズ結果での類似のウィンドウ化 Sinc() 関数よりも、はるかにぼやけた EWA distort 結果(特に細い線で)になることが観察されました。これは特に軽度の歪み変形の場合に当てはまりました。基本的に、Jinc() 関数はいくつかの特別な性質を持ち、Jinc() 関数をウィンドウ化すると、それらの特定の望ましい性質が台無しになります。いくらかの計算を行い、ローレンシャン大学の数学教授 Nicolas Robidoux は、3 ローブの円筒型 Lanczos のわずかにシャープな版を導き出すことができ、それは今や '**LanczosSharp**' として利用でき、画像の歪み変形の問題をある程度修正しました。しかし、結果として得られるフィルタは依然として、ウィンドウ Jinc 円筒型フィルタ の、低レベルの 'ピクセルハッシュ' パターンの強いぼかしを持っています。

Lanczos2 シャープ化

[IM Output] 同じ問題は 'Lanczos2' フィルタでより深刻だったので、Nicolas はわずかに大きな Blur エキスパートコントロール を使って、よりシャープな '**Lanczos2Sharp**' フィルタも生み出しました。これは、'no distort' の場合に垂直または水平の線に対して最小限のぼかししか持たないフィルタをもたらしました。このシャープ化されたフィルタは、ゼロ点のわずかなシフトをもたらし、それが今や約 '1.1684' に位置します。これは大したことないように見えるかもしれませんが、ほとんどあるいはまったく歪み変形のない画像に対してフィルタが生成するぼかしの量に、大きな違いをもたらします。

Lanczos Radius

[IM Output] これは、使われるローブの数(デフォルトで 3)が整数のサポート半径に収まるようにぼかされた(シャープ化された)EWA Lanczos フィルタです。つまり、3 ローブの EWA Lanczos(ウィンドウ Jinc に基づく)が、半径ちょうど 3 のサポートを持つようにシャープ化されます。ローブエキスパートコントロール を使って同じ結果を達成できますが、それは Jinc 関数の既知のゼロ交差に基づく調整を伴うため、行うのが簡単な計算ではありません。Nicolas は、その計算をする必要がなく、この非常に具体的にシャープ化されたフィルタを試せるように、このフィルタの追加を推奨しました。将来: Jinc ウィンドウ化 Jinc フィルタへの blur 係数の表。
参照としてローブ数を含める。

Robidoux 円筒型フィルタ

[IM Output] 奇妙なことに、実験は、Mitchell-Netravali フィルタを円筒型フィルタとして使うと、'no distort' の場合にほぼ同等の 'シャープ' な結果を生み出すことを示していました。しかも、そのフィルタは円筒型フィルタとしての使用とは何の関係もありません。なぜなら、それは直交(resize)フィルタリングのための '社会的研究' によって選ばれたからです。'Mitchell' フィルタは、通常の ウィンドウ Jinc フィルタ が円筒型にフィルタリングされた画像で破壊する、低レベルの 'ピクセルハッシュ' パターンを保つのに特に優れていました。Nicolas はその後、奇妙な偶然により、'Mitchell' が上で議論した 'シャープ化された' 形の 'Lanczos2' フィルタに極めて近いことを発見しました。これが今度は、彼が垂直(および水平)の線を完璧に保つ Keys Cubic フィルタ を開発することにつながりました。また、この新しいフィルタは、cubic 関数が Jinc 関数より計算が非常に安いため、より少ない計算コストでそれを行います。この cubic フィルタは IM に '**Robidoux**' フィルタとして、IM v6.6.5-0 の時点で追加され、特に最小限の歪み変形しかない画像に対するその最小ぼかしの性質のために、Distort とその 楕円加重リサンプリング 法が使うデフォルトフィルタでもあります。それが使うのに '最良の' フィルタだと言っているわけではなく、Nicolas でさえ他のフィルタを使うのが好きですが、それは非常に良い妥協です。ちょうど 'Mitchell' が直交(テンソル)リサイズの良い妥協であるように。私はこのフィルタを、Mitchell-Netravali 調査 によって生成された "Cubics Map" にマークしたので、それが '[Mitchell](#mitchell)' フィルタにどれほど密接に関連しているかが分かります。それは実際、直交にリサイズされた画像にも、円筒型に歪み変形された画像にも、それなりのフィルタになるでしょう。

Robidoux Sharp 円筒型フィルタ

'**RobidouxSharp**' フィルタは、'[Robidoux](#robidoux)' フィルタのわずかにシャープな版ですが、結果がシャープすぎると感じる人もいます。それは、"no-distort" の場合に、純粋な黒と白のピクセルを含む画像を最小の誤差で保つように特別に設計されています。具体的には、直交近傍ピクセルの重み付けが、'no-distort' の場合の対角近傍ピクセルの負の重み付けと正確に一致するようにします。偶然により、'[Mitchell](#mitchell)' フィルタは '[Robidoux](#robidoux)' フィルタと '[RobidouxSharp](#robidoux_sharp)' フィルタのほぼちょうど中間に落ち、すべて Cubic Keys ファミリのフィルタに属します。そのため、ユーザーはこれら 3 つのフィルタのいずれかを選んで、ほぼ 'no-distort' の状況での結果のぼかし-シャープさをコントロールできます。このフィルタの詳細については、IM フォーラムの BC-splines 議論を参照してください。

Robidoux Soft 円筒型フィルタ

これははるかに後で追加され、見てきた他の円筒型フィルタとは非常に異なります。そう、それは画像のアップサイズや拡大により有用にするためにはるかにぼやけており、それがレンガ造りの建物の写真でいくらかの階段効果を避けることを可能にします。これに関する詳細は、BC-splines 議論のこの投稿、そして 写真処理フォーラムの議論 のこの議論を参照してください。

円筒型フィルタのまとめ

Nicolas Robidoux は、EWA における Jinc フィルタの適切なスケーリング に関する長く、進行中のフォーラム議論で、円筒型フィルタについて次のようにまとめています… Robidoux が柔らかすぎ、RobidouxSharp がエイリアシングしすぎる場合は、ほぼ中間である Mitchell(distort Resize で)を試すことをお勧めします。

JPEG は(離散)コサイン変換を伴うため、フーリエの考察に基づくフィルタ(Lanczos 系。Sinc での resize でも Jinc での distort でも)が、一般に '滑らかな関数の良い近似' に基づくもの(Keys cubic に基づくもの: Robidoux、Mitchell、RobidouxSharp、CatRom。resize でも distort でも)より良い結果を出すことに、私は驚きません。その利点は、PNG(フーリエ領域を通して情報を破壊しない)では小さくなるようです。


Nicolas にはもっと言いたいことがあります。あまりに多いので、彼は自身のセクション Nicolas Robidoux によるリサンプリング を持っており、それは今や独立した広範なページになっています。

Magic Kernel Sharp 2013 + 2021

Magic Kernel Sharp は、John Costella によって開発された画像リサイズアルゴリズムで、もともと 2013 年に Facebook のプロジェクトのために作られました。それはリサイズしながら画像の鮮明さを高める 3 タップのシャープ化ステップを含み、高速かつ効率的にしています。この版は、開発以来 Facebook によってサーバーサイドの画像リサイズに使われてきました。2021 年、Costella は Magic Kernel Sharp を精緻化してその精度を向上させ、少なくとも 9 ビットの精度を提供し、シャープ化要件をより良く満たしました。この更新された版は、Facebook、Instagram、そして pica リサイズエンジンや RedKetchup 画像圧縮器のような他のアプリケーションで引き続き採用され、優れた忠実度で高品質な画像リサイズを保証しています。


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

上記のさまざまなセクションで、さまざまなフィルタをさまざまな方法で改変できるようにする、多数の特別な 'エキスパート' コントロールを紹介しました。これらのエキスパート設定は、グローバル Define 設定(または同等の Set オプション)を使って定義します。すべてのエキスパートオプションの完全な要約は、"[-filter](https://imagemagick.org/command-line-options/#filter)" についての IM コマンドラインオプションリファレンスページ にあります。"[-filter](https://imagemagick.org/command-line-options/#filter)" 設定は実際には、与えられた '名前付き' リサイズフィルタを定義するように、エキスパートコントロールを適切にルックアップして設定するためにのみ使われます。これらの設定は、特定のリサイズまたは歪み変形の画像処理操作のためにフィルタがセットアップされるときに、上で指定したデフォルト値を上書きします。 "[-filter](https://imagemagick.org/command-line-options/#filter)" 設定 'Point' は、上記のすべてのフィルタセットアップを完全にバイパスし、スケーリングされていない '最近傍' の直接ルックアップ(resize)、あるいは補間ルックアップ(distort)に退化します。こうして、この名前付きフィルタ設定は、スケーリングされた画像ルックアップフィルタを完全にオフにします。
さて、それらは利用できますが、最後に一点だけ述べておきたいと思います。

あなたが専門家でない限り(あるいは単に遊んでいるのでない限り)-- それらを使わないのが最善です!

画像処理の専門家はほとんどおらず、フィルタが何をするか、それらを変更することがフィルタリング手法にどう影響するかを正確に知らない限り、あなたがしそうなのは、画像処理の有効性を破壊し、見栄えの悪い結果を生み出すことだけです。特に、あなたのテストケース以外の画像で。これは、ユーザーがそれらを使うべきでないと言っているわけではなく、多くの IM 使用例がそれらを利用していますが、それは通常、何らかの特殊効果を提供するために行われます。特別なオプションが使われるとき、その使用理由も説明されており、その効果のために与えられたレシピに従うべきです。もちろん、それらを使うのは歓迎で、それらを利用することで、非常に興味深く、非常に珍しい効果を生成できます。

'verbose' フィルタコントロール

"filter:verbose" 設定は、他のフィルタコントロールを把握し理解する上で、おそらくあなたの最良の友です。例えば、Lanczos フィルタが Sinc ウィンドウ化 Sinc サポート 3 として定義されていることを検証できます。

  magick null: -filter Lanczos -define filter:verbose=1 \
          -resize 2    null:    | grep '^#'

[IM Text]

内部的には、Lanczos フィルタは、はるかに計算負荷の高い三角関数ライブラリ関数で定義される完全な 'Sinc' 関数ではなく、高速な多項式相当の 'SincFast'(4 ローブ)関数で定義されていることに注意してください。ここでは、Lanczos フィルタが、円筒型(EWA アルゴリズム)"-distort" フィルタとして使われるとき、Jinc ウィンドウ化 Jinc フィルタとして定義されることが分かります。

  magick null: -filter Lanczos -define filter:verbose=1 \
          -distort SRT 0   null:   | grep '^#'

[IM Text]

'filter:verbose' 設定は、さまざまなエキスパート設定の使用により、最終的な結果のフィルタが正確に何であるかをユーザーが確認できる唯一の方法です。フィルタ設定の '#' でコメントされたヘッダの後に、フィルタによって生成された一連のデータ点が返されます。これらは特にフィルタのデータをグラフ化するために提供されており、テスト画像の結果から推測することなく、フィルタが何を生成しているかをさらに検証し確認できます。例えば、Welch ウィンドウ化 Sinc フィルタのデータを抽出します…

  magick null: -filter Welch -define filter:verbose=1 \
          -resize 2 null:  > filter_welch.dat

あるいは、上記で使われた生の Welch ウィンドウ関数を、ウィンドウ関数を 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

Blackman ウィンドウ関数を直接フィルタとして使います(v6.3.6-3 より前に IM が誤ってやったように)。

  -define filter:filter=Blackman
  -define filter:support=4.0

ウィンドウ関数は、未定義のとき 'Box' をデフォルトとします。'Box' ウィンドウ関数は、基底フィルタ関数のウィンドウ化を行わない結果になります。例えば、'Gaussian' フィルタはデフォルトで 'Box' ウィンドウ関数を持ちます。box ウィンドウ関数が持つ唯一の効果は、関数のウィンドウ化された領域のクリッピングです。上の フィルタサポートエキスパートコントロール を参照してください。次を使って生の Jinc 関数の使用を強制します('Box' ウィンドウ化を明示的に設定)…

  -define filter:filter=Jinc
  -define filter:window=Box
  -define filter:lobes=3

結果として得られるウィンドウフィルタの最初の 8 ローブだけにクリップされた、12 ローブの 'Lanczos' ウィンドウフィルタ…

  -filter Lanczos
  -define filter:win-support=12
  -define filter:support=8

これは、結果として得られるウィンドウ Sinc フィルタのウィンドウ変調された 'テール'(12 まで)を無視する(8 でサポートをクリップ)ことで、約 4 倍高速にします。ただし、これはサポートクリッピングの結果として、いくらかの余分だが軽微なアーティファクトをもたらすかもしれません。Gaussian を使って画像を 'ぼかす'!これは -gaussian 5x2 操作に相当しますが、no-op の distort を使います!

  -filter Gaussian
  -define filter:sigma=2
  -define filter:support=5
  -distort SRT 0

注: これには -resize を使えません。なぜなら、操作を短絡して、操作がまったく実行されない結果になるかもしれないからです。'Mitchell-Netravali' 調査から別のフィルタを作成します。

  -filter Cubic
  -define filter:b=0.5
  -define filter:c=0.5

α 値 0.4 で自分自身の 'Keys Cubic' フィルタを作成します…

  -filter Cubic
  -define filter:c=0.4

Nicholas Robidoux が 'Interpolating EWA Filters' を探究する間に作成したこの奇妙なフィルタ

  -define filter:blur=.7071067811865475
  -define filter:c=.49257366
  -define filter:b=2.089813051319261
  -filter Cubic

画像を拡大するのに使われると、ピクセルは Blend に似ているが、正方形の代わりにダイヤモンドを使う方式で、ダイヤモンドのようなパターンに変換されます。エキスパートオプションのどんな使用も、あなた自身の責任です。それらは本番使用を意図したものではなく、難解な、あるいはそうでなければ不可能なリサイズ関数を探究したり生成したりする方法としてのものです。使用は自己責任で!

リサイズフィルタのまとめ

以下は、ImageMagick で利用できる上記のすべてのフィルタを研究し、再コーディングし、文書化した後の、私自身の個人的な見解です。私が間違っているかもしれないと思う、あるいは意見を表明したい場合は、IM フォーラムであなたの見解を表明し、私に応答するよう招待していただきたいと思います。補間フィルタ、例えば 'Hermite' は、画像を大きく拡大するときに理想的で、最終結果に最小限のぼかししか生み出しませんが、出力はしばしば後処理でより人為的にシャープ化できます。Gaussian 系ぼかしフィルタ、例えば 'Mitchell' は、基本的に線画や漫画のような画像で構成される画像に最も適しています。特別な フィルタブラー設定 を使って、画像に対するフィルタの ぼかしエイリアシング 効果をコントロールできます。ウィンドウ Sinc/Jinc フィルタLagrange 相当は、実世界の画像で、特に画像を縮小するときに使うのに最良のフィルタです。それらはすべて基本的な結果が非常に似ています。より大きなサポート、あるいはもっと良いのはローブ数の設定は、一般によりよい結果を生み出しますが、より多くの リンギング 効果も得るかもしれず、しかも計算コストが高くなります。Cubic フィルタ は、固定サポート(通常 2.0)の、速くて単純なフィルタの寄せ集めで、'Hermite' の滑らかな補間フィルタ、定性的に評価された画像拡大用の 'Mitchell'、非常にぼやけた Gaussian 系の '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]

上記は 補間フィルタ から始まり、Gaussian ぼかしフィルタ へと続きます。これらのフィルタがどれだけぼかしを生み出すか、そしてそうすることで元画像の 'エイリアシング' を除去するかを示しています。これらのフィルタはリンギングを生み出しません。2 行目は 3 つの ウィンドウ Sinc フィルタ から始まり、それらが生み出しうる強いリンギング効果を示しています。これらのフィルタは本当は画像の縮小用に設計されており、拡大用ではないことを覚えておいてください。これはデフォルトの '補間' 設定を使う 'Lagrange' と、'Catrom' 補間 cubic フィルタへと続きます。最後の画像は 'Mitchell' フィルタで、'専門家' が主観的に画像の拡大に使う最良の '理想的な' フィルタだと合意したものを示しており、最終結果に 4 つの リサンプリングアーティファクト すべてが最小限に存在します。私自身も彼らの見解に同意しますが、それは拡大に限ってのことです。これが、'Mitchell' が IM の使うデフォルトの '拡大' フィルタである理由です。縮小… エイリアシング 効果のアイデアを得るために、ここでは先ほど作った 大きなリング画像 の切り出し(サイズ 105x105 ピクセル)を縮小し、同じ 12 の代表的なフィルタがそれぞれどんな種類のモアレ効果を生成するかを見ます。

  magick rings_crop.png -filter {_filter_type_} -resize 100x {_result_}

[IM Output]

ご覧の通り、補間フィルタ フィルタは非常に強くエイリアシングしたモアレ効果を持ち、それはこれらが生み出すブロッキングアーティファクトの副作用として生じます。一方で、Gaussian ぼかしフィルタ のぼかしアーティファクトは、結果画像からそのブロッキングモアレ効果をすべて除去しましたが、結果画像に全体的なぼかし(不鮮明な線)を伴います。'[Gaussian](#gaussian)' フィルタ自体は、その無限(IIR)フィルタが フィルタサポート設定 によってクリップされることで生じる、かろうじて気づくほどのエイリアシング効果を示しますが、それは非常に軽微です。一方で、ウィンドウ Sinc フィルタ は、3 つの代表的なフィルタすべてでほぼ等しい強度の円形のモアレ効果を持つ、非常にシャープな見た目の画像を生み出します。これは、これらのフィルタが生み出すリンギングアーティファクトが干渉パターンを生成することによって生じます。最後に、cubic フィルタも、負のローブのリンギングによってのみですが、いくつかの非常に軽いモアレ効果を示します。'[Mitchell](#mitchell)' フィルタは、最も少ないリンギング効果を生み出します。'Mitchell' は、ほぼすべてのリサイズアーティファクトから非常に軽微な効果を生成することに注意してください。つまり、格子状モアレ - エイリアシング/ブロッキング、円形状モアレ - リンギング、そして線のぼかしです。しかし、すべてのアーティファクトは非常に最小限のレベルにあり、それがそれを良いオールラウンドフィルタにしています。ここに別の比較を示しますが、今度はより小さい 小さなリング画像 を強く縮小します。

  magick rings_sm_orig.gif -filter {_filter_type_} -resize 100x {_result_}

[IM Output]

ご覧の通り、補間フィルタ は多くの エイリアシングアーティファクト を生み出し、Gaussian ぼかしフィルタ は他より多くの線をぼかす傾向があります。しかし、他のすべてのフィルタはそれなりの仕事をする傾向があります。

最良のフィルタ?

それは、あなた自身が見つけ出す必要のあるものです。しかし多くの場合、それはどんなタイプの画像とリサイズを行っているかに依存します。画像を拡大する場合、'Mitchell' はおそらく使える中でほぼ最良のフィルタであり、一方、基本的にどの ウィンドウフィルタ(デフォルトは 'Lanczos')も、特に何らかの低レベルパターンが関与する場合、画像の縮小に良いです。しかし、パターンはないが多くの直線(GIF 透明度など)がある場合は、強いリンギング効果を避けるために、シャープ化された Gaussian フィルタ、あるいは再び 'Mitchell' を使う方が良いかもしれません。'Lagrange' フィルタも、特に大きな フィルタサポート設定 を伴うと、画像の縮小に非常に良いです。興味のある方には、IM ユーザー議論のトピック リサイズ後の画質を比較する方法? を見ることをお勧めします。これは基本的に、"最良のフィルタ" を定量的に決定する方法はなく、定性的あるいは主観的な "最良のフィルタ" しかないことを示しています。選択はあなた次第であり、選択は ImageMagick の重要な機能です。

IM のデフォルトフィルタ…

こうした理由から、'Mitchell' は拡大、そして透明度を含む画像やパレット(あるいはカラーマップ)を含む画像の縮小のためのデフォルトフィルタです。しかし、それ以外のすべての場合、つまり通常の画像(典型的には写真)の縮小には 'Lanczos' が使われます。Distort では、フィルタ設定は、実際の歪み変形が起こらないときに画像のぼかしを最小化するように特別に設計された 'Robidoux' フィルタをデフォルトとします。もちろん、これらの選択を上書きできます。

Nicolas Robidoux

Nicolas Robidoux は、画像リサイズから絶対的に最良の結果を得ようとすることについて、もっと多くを語り推奨する画像処理の専門家です。あまりに多いので、彼は自身のセクションを持っています…
Nicolas Robidoux によるリサンプリング