ImageMagick 範例 --
重採樣濾鏡

索引
ImageMagick 範例前言與索引
重採樣假影 - Resize 的效果如何?
區塊效應、  振鈴效應、  鋸齒、  模糊
 
重採樣濾鏡
重採樣濾鏡(續)
 
Nicolas Robidoux 的重採樣(子章節)
在這裡,我們將深入探討 Resize 和圖像扭曲的底層面向,探討用於確定結果圖像中每個像素最終顏色的重採樣濾鏡。這是一個廣泛、長期研究且經常充滿意見和個人觀點而非任何確切定性事實的領域,因為不可能確定什麼構成完美的調整大小圖像。這是一個已被證實的事實,並且成為了一個永遠不會結束的廣泛研究領域。建議您閱讀並理解調整大小和縮放運算符

重採樣假影- IM Resize 的效果如何

圖像調整大小必須應對一個非常困難的問題。如何將一個值陣列縮小或放大成一個更小或更大的值陣列,使其在我們眼中看起來更舒服。在嘗試這樣做的過程中,很多事情都可能出錯,但它們可以歸結為四個基本類別...

區塊效應

基本上,如果您僅透過複製像素來放大圖像,您將會建立更大的矩形像素區塊。事實上,使用「-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 中內建了一種方案,即放大運算符。

振鈴效應

振鈴效應是您經常在靠近銳利邊緣的非常低質量的 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 度的次要振鈴。這次使用圓柱濾鏡(透過扭曲調整大小操作),顯示了它與調整大小運算符使用的更常見的兩遍正交對齊(張量)濾鏡的不同之處。

  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 輸出] 有關產生強烈摩爾紋的調整大小圖像的一些示例,請參閱維基百科,摩爾紋頁面。檢查調整大小是否會產生鋸齒問題的經典方法是縮小環形圖像(見右圖)。當在任何比例下應用任何形式的調整大小時,此圖像通常會顯示摩爾紋效應。網絡瀏覽器在顯示此類圖像時尤其會顯示此類摩爾紋效應,因為它們使用的是超快(但通常很差)的調整大小技術。
在這裡,我展示了使用強烈鋸齒的「-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]
採樣
[IM Output]
縮放
[IM Output]
調整大小
如您所見,所有調整大小方法確實產生了一些摩爾紋效應,儘管 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]
採樣
[IM Output]
縮放
[IM Output]
調整大小
如您所見,即使是輕微的調整大小也會顯示調整大小運算符可能具有的任何鋸齒。實際上,如果您仔細觀察,您甚至可能會在原始未縮放的原始起始圖像裁剪中看到非常輕微的摩爾紋效應,這是由於僅使用密度適合在計算機屏幕上顯示的光柵圖像而產生的。也就是說,此測試圖像在顯示由縮小圖像引起的鋸齒效應方面有多麼敏感。

模糊處理

大多數人都熟悉使用「-resize」產生模糊的效果。事實上,這可能是對任何調整大小圖像最主要的抱怨,而且理由很充分。通常,非常小的調整大小會傾向於產生模糊的圖像,再次調整大小只會使情況變得更糟。問題在於,當您調整圖像大小時,您正在更改存儲為「網格」或像素陣列(稱為「光柵」)的圖像,以適應完全不同的像素「網格」。除了非常特殊的情況外,這兩個「網格」不會匹配,因此,必須修改圖像數據以使其適應這種新的點模式。基本上,不可能直接調整圖像大小並期望它出來很好,儘管可以實現合理的結果。結果通常是像素數據略微模糊。調整大小算法越好,銳利邊緣的模糊就越少。然而,一些調整大小濾鏡,特別是專門為放大圖像而設計的濾鏡,通常會添加比必要更多的模糊。這是為了消除如上所示的「塊狀」偽影。對於圖像縮小,模糊邊緣通常用於避免銳利邊緣處的「振鈴」偽影,並減少可能的鋸齒效應。然而,這是一種窮人的妥協,IM 試圖極力避免這種妥協。即便如此,仍然可以使用特殊的專家濾鏡模糊設置來調整濾鏡提供的模糊程度。但是請注意,雖然小於 1.0 的數字應該會減少模糊,但它也可能使情況變得更糟,具體取決於所使用的確切濾鏡和調整大小比率。無法保證。
在 IM v6.3.6-3 之前,濾鏡模糊設置被稱為「-support」,這非常容易誤導它的實際作用。此選項已被棄用,不再可用。
修復調整大小造成的模糊效果的更好方法是使用銳化運算符重新過濾圖像。有關更多詳細信息,請參閱銳化調整大小的圖像

IM 調整大小與其他程序

Bart van der Wolf 在... 提供了 IM 預設調整大小運算符與許多其他程序在調整真實世界圖像大小方面的實際比較。
縮減採樣範例
具體來說,總之,對於 IM 調整大小...
雖然銳化量因人而異,但沒有鋸齒偽影會產生最乾淨、最自然的圖像。
他還繼續研究「環」測試,以直接比較各種 Photoshop 調整大小方法與 ImageMagick...
縮減採樣方法
這些文章表明了正確調整大小(並使用正確的過濾方法)對圖像處理的重要性。我們將在下一節中更詳細地介紹這一點。

重採樣濾鏡

-filter」設定是控制「影像縮放」和「通用扭曲運算子」如何運作以產生最少 重採樣失真 的清晰結果的關鍵。這在 1980 年代後期是一個深入研究的主題,Paul Heckbert 是這個領域的主要研究人員,他製作並公開發布了他的「zoom」影像縮放程式。這個程式成為今天使用的大多數影像縮放程式的始祖,儘管許多後來的程式實作得很差,因為它很容易出錯。例如,看看測試 網頁瀏覽器如何縮放影像 的結果。在許多方面,這些濾鏡與 影像卷積,甚至 模糊核心 密切相關。它們甚至會遇到類似的問題。然而,濾鏡的設計目的是在縮放或扭曲影像時改善最終結果的外觀。濾鏡的名稱是過去一個世紀(或更長時間)以來影像處理專家和數學家的「名人錄」。它們通常不是濾鏡的描述,而只是首先發布濾鏡(或濾鏡系列)或對該濾鏡進行最多研究的人的標籤。然而,這使得我們很難知道「Lagrange」濾鏡(以約瑟夫·路易斯·拉格朗日命名)是否比「Catrom」濾鏡(以艾德溫·卡特莫爾和拉斐爾·羅姆命名)更好。在這裡,我將解釋濾鏡的主要方面。學習這些東西並不重要,但我決定將我在完成這個領域的研究後學到的東西整理成一份摘要,作為 IM 縮放濾鏡系統重大改進和擴展的一部分(IM 6.3.7-1)。特別感謝 Fred Weinhaus 在重新開發縮放濾鏡期間對研究的幫助。他特別渴望添加「Lagrange」系列濾鏡,這在這次改進之前的 IM 縮放中並不存在。還要感謝 Nicolas Robidoux,他的數學幫助解決了 通用扭曲運算子 中的一個重大缺陷,並開發了 圓柱濾鏡,它產生了比 縮放運算子 更好的結果。

濾鏡如何運作

當你縮放影像時,你基本上是在嘗試根據原始來源影像中的像素來確定新影像中每個像素的正確值。然而,這些新的像素與舊像素的位置並不完全匹配,因此需要以某種方式確定這些像素的正確值。我們要做的是嘗試使用原始來源像素值的一些加權平均值來確定新像素的良好值。圍繞新像素位置的實際像素形成了一個貢獻值的「鄰域」。這個鄰域越大,縮放速度就越慢。這是一種稱為 卷積 的技術。每個實際相鄰像素(稱為「樣本」)對生成最終像素的貢獻量由加權函數決定。這就是你可以使用「-filter」設定選擇的「濾鏡」。該濾鏡又通常具有一個理想的鄰域大小,稱為濾鏡的「支援」,但也稱為其「窗口」。預先定義的二維「濾鏡」也稱為「卷積核」。
FUTURE: some diagrams may be helpful here
這些加權函數或「濾波器」的設計是一項非常複雜的業務,涉及一些複雜的數學、頻率分析,甚至傅立葉變換。如果你對此感興趣,可以從維基百科:奈奎斯特-香農採樣定理開始。但是,你真的不需要深入了解現有的濾波器及其對圖像的影響。

濾波器

插值濾鏡

最簡單的調整大小濾波器函數類型是插值方法。這些方法採用來源圖像中特定像素位置的顏色值,並根據周圍像素的顏色嘗試簡單地確定該位置圖像的邏輯顏色值。由於只涉及固定且最少數量的像素,因此這種類型的濾波器是一種非常快速的調整圖像大小或扭曲圖像的方法。但是,這也是該濾波器的缺點,因為它不會將大量像素合併在一起以形成比原始圖像小得多的圖像。反過來,這可能會導致強烈的鋸齒和摩爾紋效應。插值通常僅用於「點」採樣圖像,當圖像縮放未知或不需要時。例如,當旋轉圖像或輕微扭曲時,圖像的縮放或大小不會改變,因此插值可以產生合理的結果,儘管不是非常準確的結果。有關更多信息,請參見 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 輸出] 以下是此濾鏡加權函數的圖表,您可以從中看出為何它被稱為「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]
方塊-1
[IM Output]
方塊-2
[IM Output]
方塊-3
[IM Output]
方塊-4
[IM Output]
方塊 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]
方塊+1
[IM Output]
方塊+2
[IM Output]
方塊+3
[IM Output]
方塊+4
[IM Output]
方塊+5
縮放運算子 在放大時也會產生類似的結果,但會進行一些像素顏色混合,除非以整數比例因子放大。

三角形

三角形」或「雙線性」插值濾鏡只是將最近鄰插值更進一步。它不會像「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]
三角形-1
[IM Output]
三角形-2
[IM Output]
三角形-3
[IM Output]
三角形-4
[IM Output]
三角形
如您所見,由於角落像素與原始影像的角落幾乎完全匹配,因此它們更加明顯,但在中間位置,由於附近像素都與新生成的像素不完全匹配,您會得到整個鄰域的平均顏色。棋盤像素模式的結果是傾向於淡入淡出平均的灰色。但是,由於“*支持*鄰域”較大,因此放大影像時會涉及更多像素。因此在生成添加到影像的像素時會產生顏色的平均化。

  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]
三角形+1
[IM Output]
三角形+2
[IM Output]
三角形+3
[IM Output]
三角形+4
[IM Output]
三角形+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 輸出] 在右側,我繪製了各種插值濾鏡的圖表,除了「Point」,它實際上是未縮放的「Box」濾鏡(純粹的「最近鄰居」插值)的一個非常特殊的情況。其他插值濾鏡包括「Hermite」,其結果與三角形非常相似,但在放大時會產生更平滑的圓角,從而使漸變過渡更平滑。點擊右側的圖表可查看這三個濾鏡函數的圖表。
[IM 輸出]Lagrange」濾鏡被稱為「通用」插值濾鏡。通過改變「支持」大小(請參閱下面的支持專家設置),它可以生成之前查看的所有插值濾鏡(「Hermite」除外)。默認設置(拉格朗日階數 3 濾鏡(支持=2.0),如右圖中的紫色線所示)提供了一個合理的「三次」濾鏡。它運行良好,儘管漸變變化會導致放大時出現一些明顯的阻塞效應,但對於點陣圖影像和線條圖,這可能是一件好事。稍後將詳細介紹其他拉格朗日濾鏡階數。[IM 輸出] Catrom」(Catmull-Rom)濾鏡是一種廣為人知的標準三次濾鏡,常用作插值函數,並且以相同名稱提供。該濾鏡產生相當清晰的邊緣,但在影像大規模放大時不會產生「Lagrange」濾鏡可能產生的明顯漸變變化。它基本上等同於內置的「銳化調整大小」(請參閱銳化調整大小的影像),儘管有些人認為它太過銳利,並且不提供任何銳化控制。讓「Catrom」濾鏡更有趣的是,它幾乎與 2 葉「Lanczos」濾鏡相同,後者可能是最常用的加窗 Sinc 濾鏡(見下文)。我們稍後還會在三次濾鏡中更詳細地介紹這個濾鏡。

插值法與 IM 的插值設定

IM 的插值設定用於在運算子中產生影像的未縮放「點」查找,例如 FX 自訂運算子(「-fx」)和 顏色查找替換運算子(「-clut」),以及一些較舊的 圓形扭曲函數,這些函數基於這些簡單的插值調整大小濾鏡。但是,它們目前使用單獨的程式碼實作,並且也有不同的設定名稱。這些 插值設定包括:實作「」(或未縮放的「方塊」)濾鏡的「最近鄰」,以及用於取得未縮放「三角形」濾鏡的「雙線性」。題外話:目前,平滑三角形濾鏡「Hermite」尚未直接實作為 插值設定,這很可惜,因為它是一個相當不錯的插值濾鏡。

高斯模糊濾鏡

在傅立葉變換到頻域的複雜數學中,調整大小濾鏡旨在去除可能存在的任何高頻雜訊。這種雜訊是由真實世界影像採樣到像素中引起的,當您調整影像大小時,該雜訊會以鋸齒和摩爾紋效應的形式出現。因此,高斯鐘形曲線成為調整大小或重新採樣濾鏡的自然早期候選者,因為它是真實世界效應的理想模型。

高斯

[IM 輸出] 高斯濾鏡是一種非常特殊的濾鏡,它在頻域中產生相同的「鐘形曲線」形狀。這使得它作為影像濾鏡非常有用,因為它可以高度可控的方式保證很好地去除這種高頻雜訊。但是,如果您檢查濾鏡圖,您會發現距離採樣點一個像素處有一個非零值。事實上,這是一個相當高的值。這會導致個別像素大量模糊,即使實際上沒有執行調整大小也是如此。例如,我在這裡使用高斯濾鏡調整了標準 IM 標誌的大小,然後再次使用普通的 IM 濾鏡(在這種情況下為「Lanczos」,我們稍後會看到)

  magick logo:  -filter Gaussian  -resize 150x logo_gaussian.png
  magick logo:                    -resize 150x logo_normal.png
[IM Output]
高斯
[IM Output]
正常調整大小
如果仔細觀察,您會發現左側「高斯」濾鏡處理過的影像比正常調整大小的影像更模糊。特別是關於魔杖周圍和巫師帽上的小星星的細節。影像的這種模糊是您為去除影像縮小中的所有 鋸齒效應以及影像放大中的所有 區塊效應而付出的代價。它也永遠不會產生任何 振鈴效應(完美應用時)。但所有這些都是以最終影像極度 模糊為代價的。
事實上,在進行大規模放大時,此濾鏡會產生圓點,而不是方形點。例如,我在這裡使用一個點在中心大大放大 3x3 像素的影像。

  magick xc:red -bordercolor yellow -border 1 \
          -filter Gaussian   -resize 99x99  -normalize dot_gaussian.jpg
[IM Output]
如您所見,一個像素會放大成完美的圓點。只有高斯和類高斯濾鏡才能做到這一點。

高斯西格瑪專家控制

您可以使用特殊的專家選項 "-define filter:sigma={value}" 直接控制高斯濾波器,以指定高斯曲線的實際「sigma」值。 默認情況下,此值為「0.5」,它也與 方框濾波器 的大小相同。 在許多方面,您可以將高斯濾波器視為本質上的「模糊方框」。 添加此專家選項是為了允許創建非常非常小的高斯模糊,而無需減少 濾波器的支持 範圍(見下文)。 但是,增加「sigma」可能會導致濾波器被裁剪。 因此,當增加「sigma」值時,默認「支持」(2.0)也會增加相似的量。 這只會在默認「sigma」值增加時發生。 支持專家設置 可用於覆蓋此自動效果,但通常沒有必要。
filter:sigma」專家選項僅適用於 高斯濾波器。 沒有其他濾波器會受到此專家控制的影響。

可以使用 模糊濾波器專家控制 實現對其他濾波器的更通用的控制,我們將在後面介紹。

其他類似高斯的濾鏡

[IM 輸出] 如果您研究右側的比較圖,您將看到「二次」濾波器以及稍微複雜的「Spline」濾波器很好地遵循了「高斯」濾波器的加權曲線。 由於它們是多項式函數,因此計算速度也要快得多,這就是它們最初發明的原因。 雖然「二次」比 高斯濾波器 模糊一點,但「Spline」濾波器更模糊,等效的 Sigma 設置大約為「0.65」。 這使得「Spline」濾波器成為未經修改提供的最模糊的濾波器。 檢查圖表,您會發現,像 高斯濾波器 而不像 插值濾波器,它們在距採樣點 1.0 處具有非零值。 這會導致附近的像素混合它們的顏色,並且是您看到的模糊的原因。 「Spline」濾波器在 1.0 距離處具有最高值,在任何調整大小(或扭曲)的圖像中產生最大量的模糊。 這種額外的模糊消除了大規模放大中可能存在的任何「阻塞」效應的最後一點。 並且可以與 銳化調整大小的圖像 技術一起使用來放大線條圖,而結果中幾乎沒有「階梯效應」。 比較圖中也顯示了「Mitchell」濾波器。 此濾波器在距採樣點 1.0 處也有一些模糊,這也使得該濾波器略微模糊,很像我們之前看到的其他濾波器。 但是,它的曲線中也有一些負加權,雖然會產生 振鈴 效應(請參閱後面的 窗口 Sinc 濾波器),但在銳邊附近抵消了模糊。

濾鏡支援專家控制

高斯濾波器被稱為 IIR(無限脈衝響應)濾波器,這僅僅意味著它使用的響應“曲線”永遠不會達到零。也就是說,無論您距離採樣點有多遠,距離很遠的像素仍然會對結果產生一些非零貢獻。從數學角度來看,這實際上是一件好事,因為這意味著結果在數學上更加完美。在實際應用中,這非常糟糕,因為無限濾波器要求您使用原始圖像中每個像素的加權平均值來生成目標圖像中的每個新像素。這意味著使用此濾波器完美地調整大圖像的大小將需要很長時間。但是,對於“Gaussian”濾波器,距離採樣點大約 2 個像素(其默認“sigma”設置的 4 倍)以外的任何東西通常對最終結果產生的影響很小,因此通常可以忽略。甚至 3 倍的 sigma 通常也被認為是合理的。此範圍稱為濾波器的“支持窗口”,是程序對濾波器的實際限制。如果您真的想,可以使用特殊的專家設置“-define filter:support={value}”來更改濾波器的“支持”。
例如,這裡我使用較小的支持值 1.25 或 sigma 值的 2-1/2 倍(參見右側的結果圖)調整單個像素的圖像大小。這當然小於通常接受的最小值 3 倍 sigma 值。


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 個像素。當此支持“窗口”在圖像上滑動時,每個進入或離開的像素都將生成濾波器“曲線”的突然“變化”。也就是說,結果中輕微抖動的原因。也就是說,在這些點上,根據濾波器加權曲線,正在添加或移除像素以進行平均。這反過來會在調整大小的圖像中產生四個這樣的“抖動”或“之字形”,當單個白色像素進入/離開支持範圍時,外部邊緣上會出現兩個初始抖動,而當第二個黑色像素(進行三個像素加權平均)進入/離開支持範圍時,會出現第二對抖動。如果濾波器中沒有這樣的突然“停止”,也就是說,濾波器在支持限制設置處變為零,那麼您將看不到“抖動”,並且您將沒有可見的效果。使用設置為整數或半整數的支持大小(例如“Gaussian”濾波器的默認“支持”設置為“2.0”)將始終確保每當一個新像素進入支持範圍時,另一個像素正在離開,因此始終有相同數量的像素作為該平均值的一部分。這將消除兩個“中心”抖動,但不會消除外部的初始抖動,標記支持限制。即使濾波器中的陡峭斜率變化(不連續性)(例如您從三角形拉格朗日濾波器獲得的)也會在生成的圖像中產生可見的偽影。
在 IM v6.3.6-3 之前,高斯濾波器的“支持”設置為此“1.25”值,從而在放大圖像中產生振鈴效應(如上所示)。因此,將 Gaussian 的“支持”更改為“1.5”,以確保始終對相同數量的像素進行平均,並減少較小的步長。

從 IM v6.6.5-0 版本開始,高斯濾波器的預設「support」設定已增加到「2.0」。這對濾波器的整體速度影響不大,但實際上使「停止」不存在。它還簡化了此濾波器其他特殊用途的濾波器編碼,特別是針對 EWA 失真可變模糊映射

但請注意,如果您使用非常大的「support」設定,那麼當然需要對更多像素進行平均,從而使調整大小操作變慢,而結果沒有任何實際改進。只有 加窗 Sinc/Jinc拉格朗日 濾波器通常可以使用大於 2.0 的「support」視窗產生更好的結果。請記住,這些是「專家」選項,因此您更有可能使用這些選項使事情變得更糟而不是更好。也就是說,為什麼它們不是簡單的命令列選項,而是通過特殊的「-define」選項提供的。當然,歡迎您像我上面所做的那樣玩,以便嘗試更好地理解事物,而 IM 提供這些選項以便您可以做到這一點。

濾鏡模糊專家控制

可以使用特殊的專家選項「-define filter:blur={value}」來調整濾波器提供的模糊量。「1.0」的值產生預設動作,而較小和較大的值會調整整體「模糊度」。基本上,這會沿 X 軸(像素到採樣點的距離)線性放大或縮小濾波器的曲線,並且通常會使濾波器整體變得更加模糊或更不模糊。使用較小的設定會導致濾波器的函數(及其「support」視窗)變小。對於 高斯類高斯 濾波器,效果就像您將濾波器的「sigma」值(預設值=0.5)乘以這個「模糊」因子一樣。此設定還會按相同數量放大或縮小濾波器的 「support」視窗 以防止裁剪,但可以使用 「support」專家濾波器設定 來覆蓋此設定。例如,在這裡,我使用 類高斯樣條濾波器 使用三種不同的「模糊」設定來調整圖像大小。

  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」濾波器結果的整體模糊度。由於「support」視窗的大小也會按 濾波器模糊 設定進行縮放,因此使用非常小的縮放值可能會導致重新取樣「遺漏」所有像素,或僅生成零加權像素。結果將生成規則的「黑色」線條或塊。例如...

  magick rose: -define filter:blur=0.1 -filter Gaussian \
          -resize 100x100  rose_black_bars.png
[IM Output]
增加「support」視窗的大小(在它按模糊縮放之前)可能有助於防止這些效應,但由於大多數濾波器只會為落在其「自然」「support」範圍之外的像素生成零加權,因此它不適用於所有濾波器。唯一通常會在整個「support」範圍內生成有用的非零值的濾波器是 方框濾波器Sinc/Jinc 加窗濾波器。當濾波器「support」變得太小而無法始終找到至少一個要採樣的像素時,在 圓柱濾波器 中可以看到類似的效果。 拉格朗日濾波器 使用 「support」專家濾波器設定 來確定適合「support」視窗的適當「階數」,從而變形成各種其他形式(見下文)。
在濾波器中使用包含負加權(基本上是我們接下來要看的任何濾波器)的不良支持設定會產生反向銳化和反轉效果,以及不成比例的更強鋸齒效應。在極少數情況下,它甚至會產生無限加權顏色(在 IM 的普通非 HDRI 版本中被鉗制為純黑色和白色)。

建議在將此特殊選項與任何濾波器一起使用時要謹慎和專業。
在 IM v6.3.6-3 之前,選項「-support」錯誤地設置了「filter:blur」定義,這非常容易誤導其實際作用。此選項已被棄用,並且不再可用。

高斯插值器濾波器變體

[IM 輸出]模糊控制值為「0.75」的類高斯濾波器,或對高斯濾波器使用西格瑪控制值為「0.375」將產生一種我稱為**高斯插值器**的變體。這種銳化的像插值濾波器一樣具有相似的特性的高斯濾波器,我們在上面已經看過了。但它不包含任何在放大的圖像中可能很明顯的急停或其他漸變變化。在這方面,它很像「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]
高斯
==> [IM Output]
高斯插值器
(blur=0.75 或 sigma=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]
高斯插值器
(blur=0.75 或 sigma=0.375)

加窗 Sinc 濾鏡

Sinc 濾波器

數學已證明用於調整圖像大小的理想濾波器(使用 2 通道“張量”調整大小技術)是 Sinc() 函數。(請參閱奈奎斯特-香农采样定理)。[IM 輸出] Sinc() 在數學上是完美的,具有一些我想指出的特殊功能。首先,在與濾波器的加權函數的每個整數距離處,它都變為零。這一點非常重要,因為這意味著濾波器不會過度模糊圖像(與高斯濾波器不同)。這也意味著,如果在不調整大小的情況下對圖像進行重新採樣(“無操作”調整大小),則圖像完全不受濾波器的影響。因此,它是一個插值濾波器,儘管它非常複雜。Jinc() 函數與 Sinc() 密切相關,並且具有使其可用作二維濾波的濾波器的特性,例如通用圖像扭曲運算符所使用的。稍後在圓柱濾波器中將詳細介紹此函數。現在請注意,它也可以用作加窗 Jinc 濾波器的基函數。Sinc()Jinc() 濾波器與我們之前看到的濾波器之間的另一個主要區別是,許多權重都是負數。也就是說,它們將從圖像中每個像素的最終顏色中減去一些附近的顏色像素。這似乎有點奇怪,但它可以使物體的邊緣更加銳利。當然,任何負權重通常都需要被沿曲線更遠處的更多正權重所抵消,這會產生您看到從採樣點延伸很長的波浪狀函數。這些額外的正(和負)權重“波瓣”會在包含非常強烈的顏色邊界的圖像中造成振鈴效應,例如在高對比度線條圖或邊界(例如紅色的屋頂到藍色的天空)中。如果基於這些函數的濾波器使用不當,這些振鈴效應會變得更加明顯。

加窗函數

遺憾的是,此函數也是 IIR(無限脈衝響應)函數,也就是說,它的影響一直持續到無窮大,就像之前的高斯濾波器一樣。這意味著要使用“Sinc”,您需要生成圖像中每個像素(及其他像素)的加權平均值,以便為目標圖像中的每個新像素創建最佳表示。這非常昂貴,因此無法實際使用這些完美的濾波器。並不是說您想要產生振鈴效應。但與高斯濾波器不同,“Sinc”函數並非僅在距採樣點很短的距離內逐漸減小到接近零。事實上,即使在距採樣點 10 個像素處(見上圖),您也可以獲得對最終結果的明顯影響。但是,使用支持距離為 10 的濾波器調整圖像大小需要對最終結果中的每個像素平均至少 20x20 或 400 個像素。這將導致調整大小非常慢。因此,不建議使用原始形式的“Sinc”濾波器,而且幾乎從未使用過,儘管通過使用專家濾波器控制,IM 並不會阻止您這樣做,如果您真的想這樣做的話。建議和提供的是“加窗”形式的 Sinc 函數,這些函數是由圖像處理專家開發的,可用於將無限 Sinc(和 Jinc)函數“限制”為更實際的大小。這些加窗濾波器包括以下濾波器:“Blackman”、“Bohman”、“Hann”、“Hamming”、“Lanczos”、“Kaiser”、“Welch”、“Bartlett”和“Parzen”。

加窗濾波器的工作原理

[IM 輸出] 舉例來說,右圖顯示了三個函數(點擊可放大檢視)。紅色函數是數學上理想的「Sinc()」函數,它會延伸到無限大。綠色函數是「漢明窗」(Hann)函數(基於簡單的「Cosine()」曲線)。它會與「Sinc()」函數相乘,以調變濾波器中較遠的組成部分,使其在支撐窗口的邊緣達到零(或接近零)(此濾波器的預設距離為 4.0 個像素單位)。基本上,通過為「-filter」選項選擇「Hann」,實際上就是在選擇「Hann()」「窗函數」來調變「加權函數」,例如「Sinc()」(或「Jinc()」)。因此,「窗口濾波器」實際上是兩個函數。一個是「Sinc」或「Jinc」函數(取決於圖像處理運算符),另一個是您選擇用作濾波器的「窗函數」。(請參閱下面的進階濾波器控制)。
在 v6.3.6-3 之前,IM 犯了一個嚴重的錯誤,即直接使用窗函數作為濾波器的加權函數。這反過來又導致所有這些濾波器(除了 Lanczos)在用於調整大小時都會產生嚴重的混疊圖像。因此,IM 用戶經常誤解或很少使用這些濾波器。現在這個問題已經解決了。

各種加窗濾鏡

[IM 輸出] 右圖是 IM 在撰寫本文時可用的所有窗函數的圖表(之後又添加了更多)。是的,有很多窗函數,因為窗函數一直是許多信號處理專家深入研究的主題。所有窗口濾波器函數通常都會用於調變 Sinc(或 Jinc)加權函數,使用 3 或 4 作為 Sinc 的支撐(3 或 4 個波瓣),具體取決於所使用的窗函數的類別(見下文)。例如,「Blackman」窗函數將使用 4 個波瓣,而「Lanzcos」將使用 3 個波瓣。這取決於您的 IM 版本,因此如果您想確定,請查看詳細濾波器專家選項。如您所見,所有窗口濾波器函數都會產生原始「Sinc()」函數的靜音形式,該函數也會顯示出來。除了特定濾波器產生的振鈴量之外,一個窗口濾波器與另一個窗口濾波器之間通常幾乎沒有區別。可能最好的窗口濾波器之一是「Lanczos」。而其他人則信誓旦旦地推薦「Blackman」、「Bohman」、「Hann」(餘弦錐形鐘形函數)、「Hamming」(餘弦鐘形函數變體)、「Cosine」(單個餘弦波瓣)作為窗函數。所有這些函數的公式都基於使用 Sinc 或正弦/餘弦函數,據說這確保了函數將具有良好的頻率響應。其他窗函數包括「Welch」(拋物線)、「Parzen」(三次樣條)、「Kaiser」(貝索函數)和可能是最簡單的「Bartlett」(三角形或線性)。通常,創建這些函數是為了簡單和快速計算,儘管它們通常被認為具有較差的「頻率響應」。此外,許多這些窗函數本身就被用作重採樣濾波器。例如,「Bartlett」(它可能是所有窗函數中最奇怪的一個)實際上與「Triangle」濾波器以及「Bilinear」插值濾波器使用的數學函數相同。所有函數(「Bartlett」除外)都構成了兩大類窗函數。
  • 一種錐形「鐘形」曲線,例如「Hamming」、「Hann」、「Kaiser」、「Blackman」、「Bohman」和「Parzen」。
  • 還有一種非遞減的「波瓣」型窗函數,它會快速下降到零,然後被窗口的支撐「截斷」,例如「Lanczos」、「Welch」和「Cosine」。
如果你研究上面的窗函數圖,你可以看到兩種濾波器樣式的形狀有何不同。然而,這兩類窗函數似乎不如使用三角函數定義的曲線得到的整體「頻率響應」重要。遞減的「鐘形」窗函數將在 Sinc 加權函數(或圓柱形(扭曲)重採樣中的 Jinc 函數)的 4 個波瓣上使用波瓣支撐。非遞減的「波瓣」型窗函數默認使用 3 個波瓣支撐。由於窗函數滾降的差異,這導致兩種窗函數之間大致相等。這也意味著,默認情況下,非遞減窗函數將比遞減窗函數略快。濾波器應該具有的默認波瓣數在 IM 論壇討論中進行了討論,請參閱添加餘弦窗函數?。當然,如果你願意,你可以更改任何調整大小濾波器的波瓣支撐,甚至是一般的支撐。它們都差不多,只是在產生的振鈴和阻塞效應的數量上有非常小的差異。[IM 輸出]右邊是相同的窗函數,但根據函數的遞減/非遞減性質,使用 IM 定義的默認波瓣支撐。正如你所見,在前兩個波瓣(影響最大的主要波瓣)上,任何濾波器之間的差異都非常小,並且在該範圍內都顯示出非常相似的「滾降」。然而,函數的排序並沒有太大變化,「Welch」和「Parzen」仍然處於兩個極端,而「Lanczos」則正好落在所得曲線滾降的中間。[IM 輸出]右邊是使用者使用上述默認值選擇這些窗函數時將提供的加窗 sinc 濾波器。正如你所見,最終的加權曲線都非常相似,並且正如預期的那樣,它們都夾在「Welch」和「Parzen」的兩個極端之間。你可以在維基百科,窗函數上查看這些不同窗函數的更詳細定義和圖表,以及它們在傅立葉頻譜中的結果。
總之:我沒有發現這些不同窗函數之間的結果有很大差異。此外,我閱讀的研究論文的結果似乎更多是對其適用性的定性意見,而不是任何具體的東西。我的感覺是,幾乎可以使用任何窗函數,但如果要我選擇一個,最好還是堅持使用最流行的「Lanczos」窗函數。它位於上述所有濾波器的中間,具有良好的頻譜響應,並且通常是作為重採樣濾波器的不錯選擇。另一方面,一位一直致力於 ImageMagick 重採樣濾波器的圖像處理專家不同意這種觀點。不過,他選擇濾波器更多地基於特定圖像的確切要求。你可以在Nicolas Robidoux 推薦的技術中看到他的建議和評論。

Lanczos 濾鏡

我們已經多次提到「Lanczos」濾波器。它可能是最著名的 窗口濾波器,位於我們見過的窗口濾波器範圍的中間。基本上,它不會「滾降」得太快或太慢,並且在傅立葉變換結果中具有良好的頻率響應。基本上,「Lanczos」是任何濾波器工作的良好起點,並且已在最近的 窗口化 Jinc 圓柱濾波器(見下文)的開發中得到廣泛應用。「Lanczos」濾波器基本上使用 Sinc() 函數的第一個「波瓣」來對 Sinc() 函數進行窗口化。也就是說,濾波器的加權函數用於設置濾波器自己的窗口函數。許多人認為這是選擇它而不是許多其他窗口化 Sinc 濾波器的充分理由。雖然幾乎沒有真正的證據表明它是最好的,但它是一個可靠的中檔濾波器。默認情況下,IM 將「Lanczos」濾波器定義為具有 3 個「波瓣」。這樣做的原因是因為窗口函數本身是「未錐化的」,因為它只是一個被截斷的單一波瓣,函數的第一個過零點與窗口支持限制重合。請參閱上面的 窗口濾波器如何工作[IM 輸出] 然而,2 波瓣「Lanczos2」濾波器(Lanczos 默認波瓣數為 2,為了便於用戶選擇而添加)也被發現很受歡迎,因為它可以避免窗口化 Sinc 濾波器可能產生的正 振鈴偽影。「Catrom」(實際上是「Catmull-Rom 濾波器」)幾乎與「Lanczos2」濾波器完全相同,但由於它是一個 三次濾波器,因此在數學上生成速度要快得多。然而,這通常不是 IM 在處理圖像之前緩存濾波器值的方式的問題。話雖如此,在 IM 論壇上的一個漫長的 討論 似乎表明,對於正交(張量)大小調整,4 波瓣「Lanczos」實際上更適合縮小圖像,同時防止具有非常精細圖案的物體圖像中的 摩爾紋,但代價是產生更多的 振鈴

波瓣中的窗口大小

As I mentioned, the underlying Sinc (and Jinc) filter function is actually infinite in size. Though by default IM limits them using the specified windowing funtion to a much smaller, more practical size. However there may be some situations where you really want to try and get a much better, more exact resizing of the image using a much larger, and slower window (support) size. That can even be done quite simply using the Filter Support expert control, just as we did for Gaussian-like filters. The windowing function itself will (in most cases) reduce the Sinc (and Jinc) to zero over the support setting range. But as the windowing function is scaled to fit the 'support' window, the resulting filter function will also change. [IM Output] For example, to the right I have graphed the 'Lanczos' windowed filters, against the Sinc() function as a reference, using various 'support' settings from 2 to 8. Note that the actual size of the filter is limited by the actual support size used. The smaller the 'support' the faster the filter, but the less exactly the function follows the mathematically ideal Sinc() function. Look closely at each of the graphed curves. The 'green' (support=2) curve only has the main central peak, plus one negative 'lobe' (Equivelent to a 'Lanczos2' filter). After this the function is just zero, and not used. The next 'purple' (support=3, and the default 'Lanczos' filter) curve, has a much larger first negative 'lobe', then a smaller positive 'lobe'. This continues on with more lobes being added, as the support size increases by integer increments. The additional lobes are smaller and smaller in height, producing less and less influence on the final result, but with the initial 'lobes' becoming higher (more influence, and hence more Ringing effects). For best effect you would use a support setting, to generate a filter with that many up/down 'lobes' in it. That is, you would have the windowing function, and thus the 'support' of the filter, end at a 'zero-crossing'. However while the Sinc() function has 'lobe' (zero-crossings) at integer 'support' settings, the Jinc() weighting function does not. This presents a problem for users wanting to adjust the support window for a filter being used with the Distort Operator. In fact, Jinc() has 'zero crossings' at highly irrational numbered positions. These zero crossings are very difficult to work out without being a mathematics expert. To make it easier to set a filter in terms of the number of 'lobes' another special setting was created, "-define filter:lobes={integer}". If the filter is being used by a 2 dimensional image resampling operator such as the General Distortion Operator, which generally the use of Jinc() as the base function, it will look up a table of the first 20 zero crossings for the filter, and set the 'support' setting to that value. This means you don't have to try to find the appropriate support setting for the Jinc() function, just specify the number of lobes you want to use. Because of this it is better to specify Windowed Sinc or Jinc filters in terms of the number of 'lobes' you want the filter to contain, rather than specifying a more direct 'support' setting. If neither Sinc() or Jinc() functions are used for the filter definition, then the the 'filter:lobes' setting is used to calculate the appropriate 'support' setting for the filters usage. Note however that a 'filter:support' setting will override any 'filter:lobes' setting given, so it is better to only define the 'filter:lobes' expert option, especially if using the General Distortion Operator.

Lagrange 濾鏡

正如「高斯」濾波器是一個數學上速度較慢的函數(由於 IM 對結果的緩存,這並不影響整體速度),Sinc/Jinc 窗口濾波器 由於需要計算用於加權函數和窗口函數的三角函數,因此計算速度更慢且更複雜。然而,「Lagrange」濾波器會生成分段三次多項式函數來逼近窗口濾波器。(請參閱 維基百科:拉格朗日多項式)。正如 窗口濾波器 可以根據 支持設置 進行調整,「Lagrange」濾波器也將根據該設置進行自我調整。默認的 支持 設置 2.0 會生成「Lagrange」濾波器(3 階)。此濾波器非常適合放大和縮小圖像,具有最小的 阻塞振鈴 效果,並且沒有 模糊 效果。
支持專家控制 實際上是在定義應使用的拉格朗日濾波器的「階數」。也就是說,默認的 2.0 支持拉格朗日濾波器會生成 3 階拉格朗日濾波器(階數 = 支持 × 2 - 1,因此支持 = 2.0 => Lagrange-3 濾波器)。這就是為什麼您實際上只能使用半整數大小的設置的原因。

因此,要獲得 4 階拉格朗日濾波器,您可以使用選項
  -define filter:support=2.5
[IM 輸出] 如果使用較大的支援範圍設定,'Lagrange'濾鏡會產生加窗 Sinc 濾波器,而不需要複雜的三角函數計算,甚至不需要額外的加窗函數。支援範圍設定越大,濾鏡越接近Sinc() 函數,但計算速度也越慢。(請參見左側較大支援範圍 Lagrange 濾鏡的圖表)。
[IM 輸出] 使用較小的支援範圍設定和 'Lagrange' 濾鏡可以模擬大多數的插值濾波器。也就是說,支援範圍大小為 '0.5' 將會產生 'Box' 濾鏡,而 '1.0' 則會產生 'Triangle' 濾鏡。支援範圍設定僅限於以半整數進行調整,使用任何其他支援範圍係數並不會產生太大的效果。
[IM 輸出] 另一半的半整數支援 Lagrange 濾波器(產生偶數階)會產生一組非常不連續的濾鏡加權,與 'Box' 濾鏡非常相似,它們可能會產生一些強烈的區塊調整大小偽影。另一方面,對於小規模調整大小,這可以確保圖像在非常小的調整大小調整中保持清晰。這些「偶數」階 'Lagrange' 濾鏡實際上突出了使用此濾鏡的主要缺點,即加權函數不是「平滑」漸變。在大規模放大中,這意味著您可以在生成的漸變中看到明顯的變化。然而,除了在那些極端情況下,這很少會成為問題。基本上,它表示一個濾鏡,無論當前 '支援範圍' 設定的大小如何,它都會普遍地創建適合當前設定的濾鏡。它是一個自加窗調整大小濾鏡。
'Lagrange' 濾鏡直到 IM 版本 v6.3.7-1 才被完整定義和使用。

三次濾鏡

由於許多影像專家試圖找到一種更好且計算速度更快的影像調整大小濾鏡,因此發展出一系列濾鏡,並被稱為三次濾波器。這些濾鏡與前面顯示的Lagrange 濾波器非常相似,並且由一組較小的固定分段組成。然而,與 Lagrange 濾波器不同的是,這些片段被設計成組合在一起形成一條平滑的曲線,以減少銳利的區塊效應。[IM 輸出] 左圖顯示了 IM 中預先定義的四個此類「平滑」三次濾波器,它們以用於調整大小濾波器而聞名。'Spline' 濾鏡(也用作一般 'Cubic' 濾鏡函數的別名和預設設定)模擬了高斯模糊濾鏡。這條曲線也稱為「B 樣條」插值曲線,也常用於通過點集合繪製平滑線條。它也經常被用於動畫中的相機和物體運動,以產生通過用戶提供的控制點的平滑流動。還顯示了 'Catrom',或更準確地說是「Catmull-Rom 濾鏡」或「Keys 三次卷積」,它產生了一種平滑的非模糊形式的插值濾波器。然而,它可能會稍微過衝。它本質上是一個理想的自銳化濾鏡,因此也是常用於基本雙三次插值的函數。最後是 'Hermite' 三次濾波器,它是一種平滑的三角形插值濾波器,它將在輸入座標處平滑地變慢(滾降)。基本上,它會在保留原始圖像中平坦「顏色級別」的同時,使銳利的邊緣變圓。

三次濾波器系列

以上是最常見的具名三次曲線濾波器,但它們也屬於特定的三次濾波器家族。「B-Spline 家族」基本上等同於對結果進行不同程度的模糊化處理。通常範圍從非常模糊的「Spline」濾波器到邊緣圓潤但塊狀的「Hermite」濾波器。然後是「Cardinal 家族」,它產生的濾波器在塊狀振鈴偽影之間取得平衡,而「Catmull-Rom 濾波器」(「Catrom」)則由此演變而來,成為這些偽影之間的平衡折衷方案。這兩個家族後來合併形成了「Keys 三次濾波器家族」,它將「Catmull-Rom 濾波器」(Keys α = 0.5)與「B-Spline 三次濾波器」(Keys α = 0.0)聯繫起來。Keys 家族濾波器還具有保留圖像中可能存在的任何線性(仿射)漸變的特殊屬性。只有當圖像包含強烈的顏色變化而不是平滑的顏色漸變時,Keys 家族濾波器的振鈴模糊效應才會發揮作用。對種類繁多的濾波器感到困惑嗎?你當然會感到困惑。其他人也是如此!問題在於,濾波器的結果通常非常主觀,取決於圖像以及您使用的「家族」的限制。什麼是好的濾波器實際上取決於您問誰、您是在放大還是縮小以及您正在處理什麼圖像。在某些方面,它仍然是令人困惑的。我花了兩年多的時間摸索、閱讀和擺弄各種濾波器,才想出這個總結的開頭,即使是現在它仍在不斷發展。圖像大小調整是一個非常主觀的領域,很難(實際上已經證明是不可能的)以任何真正的方式量化。沒有「完美」的大小調整這回事。

Mitchell-Netravali 濾波器

在這種情況下,Don P. Mitchell 和 Arun N. Netravali 發表了一篇論文,名為「電腦圖學中的重建濾波器」,其中制定了兩個變數,分別是「B」(用於「B 樣條」曲線)和「C」(用於「Cardinal」曲線,相當於「Keys」濾波器的 α 值)。利用這兩個值,您可以產生任何平滑擬合(連續一階導數)的分段三次濾波器。[IM 輸出]更重要的是,他們隨後調查了一組 9 位圖像處理專家,而不是僅僅依靠自己的意見,來對使用不同的 B 和 C 值稍微放大圖像所產生的偽影進行分類。調查結果如右圖所示。「綠色」區域表示專家認為可以接受的結果值,而其他區域則產生各種類型的偽影。這張圖像很重要,因為它真實地顯示了各種偽影與可以產生的各種不同類型濾波器之間的關係。您也可以從結果中看出,「Keys」濾波器系列之所以如此重要,是因為它是產生優質三次濾波器的最佳方法之一。它的濾波器基本上落在圖像處理專家認為「可接受」的區域中的一條直線上。根據這項調查,Mitchell 和 Netravali 確定最佳濾波器是「Keys」系列濾波器,它落在可接受區域的中間,使用 B、C 值為 1/3、1/3。此濾波器現在稱為「Mitchell-Netravali 濾波器」,在 IM 中作為「Mitchell」濾波器設置提供。基本上,它是所有調整大小偽影的折衷方案。它也是 IM 圖像放大的預設濾波器。所有內置的「命名」三次濾波器:「Mitchell」、「Robidoux」、「Catrom」、「Spline」和「Hermite」;也在上圖中標出,顯示了這些專家對這些特定濾波器的看法。圖中還顯示了代表「B 樣條」、「Cardinal」和「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」系列濾鏡(沿著 Mitchell-Netravali 概覽圖中的虛線)。請記住,「c」等同於 Keys 的 α 設定,而「b」可以視為三次樣條「模糊」設定。這些專家設定為使用者提供了一個很好的方法來「微調」他們的影像調整大小,以獲得他們想要的效果(無論他們是使用 調整大小 還是 扭曲)。「b」設定比較容易理解。只需將「b」視為「模糊度」即可。b=0 的值是非常銳利(Catmull-Rom 濾鏡),它往往會產生負晕 振鈴效應 和一些 鋸齒或摩爾紋 效果。b=1 的值往往會產生過度模糊(樣條或類似高斯)的效果。這使得專家(甚至普通使用者)可以輕鬆調整此值,以找到適合他們的濾鏡。
右側是一個表格,其中列出了專門「命名」的 三次濾鏡 的 B、C 值。請記住,「Hermite」是唯一不屬於「Keys」濾鏡系列的內建三次濾鏡。它也是所有 BC 三次濾鏡中支援最小的(「1.0」),並且不包含負波瓣。「Robidoux」和「RobidouxSharp」濾鏡與「Mitchell」非常相似,但它們不是概覽的結果,而是透過數學方式確定,專門用作 圓柱濾鏡。「Robidoux」濾鏡是 通用扭曲運算子 使用的預設濾鏡(見下文)。  
濾鏡 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)有什麼影響,尚不清楚,也不推薦使用。

圓柱濾鏡- 用於扭曲

正如我們已經多次提到的,扭曲運算子 使用濾鏡設定來重新取樣影像的方式與 調整大小運算子 略有不同。具體來說,扭曲 使用「樣本點」與來源影像取樣區域內實際像素之間的「徑向」距離來應用濾鏡,以確定每個像素的權重,從而確定樣本點的最終顏色。相比之下,調整大小 使用正交對齊的濾鏡對影像進行兩次處理。一次在 X 方向,然後再次在 Y 方向,因此它僅限於對影像進行簡單的矩形調整大小,並且不涉及使用 虛擬像素。也就是說,扭曲 應用濾鏡以產生「圓柱形」形狀,而不是「盒子」形狀,以便允許影像的自由形式扭曲,包括旋轉和在任何方向上的可變縮放(拉伸和壓縮),而不僅僅是沿 X 或 Y 軸。因此,濾鏡本身通常需要調整,或者專為這種用法而設計。

插值圓柱濾鏡

在這裡,我使用“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]
調整大小
[IM Output]
扭曲
如您所見,當“Box”濾波器用作圓柱濾波器時,您會得到一個圓形(或在 3 維中為圓柱)。但是,由於濾波器的處理方式,您會在某些區域中對兩個像素進行(相等地)採樣以產生完美的中間灰色。您可以將圓柱形框式濾波器視為將源圖像轉換為一整套重疊的圓形像素,這些像素被混合(而不是添加)在一起。以下是一個更豐富多彩的示例,說明了使用“圓柱形框”濾波器放大圖像的結果...

  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)。這確保了濾波器始終能在圓形採樣區域(對角線)中至少找到一個源像素。這是任何圓柱形濾波器的最小實用支持尺寸。

沒有其他濾波器有這個覆蓋問題,需要增加支持。
如果支持度至少不是“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 或更大的支持下,每次重新採樣將是至少兩個像素的“框”或“平均”混合。


以下是多種插值濾波器的比較。使用灰色,以便您可以看到上沖和下沖。頂線使用正交調整大小,而底線使用圓柱形失真。

  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]
Hermite
[IM Output]
[IM Output]
拉格朗日
[IM Output]
[IM Output]
Catrom
您可以看到結果是如何相似的,但具有不同風格的偽影(內部和外部(振鈴))通過兩種不同的方式應用濾波器生成。在“Triangle”濾波器中,內部偽影尤其明顯。但是請記住,插值濾波器對於失真圖像的極端縮小(縮小)並不是特別好,但它們對於放大(放大)非常有用。

圓柱高斯

在正交“調整大小”和圓柱形“扭曲”形式之間產生無差異結果的一個濾波器是特殊的“高斯”濾波器...

  magick xc:red -bordercolor yellow -border 1 \
          -filter Gaussian   +distort SRT 33,0  -normalize  dot_distort.jpg
[IM Output]
這實際上是此濾波器的特殊屬性之一(稱為可分離性),也是許多圓柱形重新採樣實現使用它作為默認濾波器的原因之一。它是原始 EWA 論文的默認值,但其結果也非常模糊。ImageMagick 在首次實現失真時也使用了它,但現在不再使用了。正如正交調整大小一樣,“Gaussian”濾波器在生成的圖像中絕對不會產生鋸齒偽影,即使您將其應用於特殊的“環”圖像也是如此。但這樣做的代價是結果模糊,即使實際上幾乎沒有或根本沒有失真。類似於Sigma 專家控制中的討論,您也可以將此濾波器用作一種插值濾波器。
從 IM v6.6.5-0 開始,IM 不再默認使用此濾波器進行圖像失真。而是使用專門設計用於產生更清晰結果的另一個濾波器“Robidoux”。

無論如何,在此版本之前,由於實作上的錯誤,扭曲效果也非常模糊。如果您使用的是舊版本,並且想要使用影像扭曲,請升級。

在 IM v6.6.7-6 之前,IM 會對圓柱高斯濾鏡使用稍大的「sigma」值,即 1/sqrt(2) 或約 0.707,而不是 1/2。這會導致結果稍微模糊一些,這是為了減少可能的鋸齒瑕疵

這是一個錯誤,它是因為遵循了一篇研究論文的建議,將圓柱盒狀濾鏡的較大支持度傳遞給高斯濾鏡。提出的理由是,高斯濾鏡本質上是一個模糊的盒子。但事實並非如此。高斯濾鏡是一個模糊的脈衝,而不是一個模糊的盒子。這個版本修正了這個錯誤,這意味著現在在使用高斯濾鏡時,使用調整大小或扭曲應該會得到相同的結果。

我個人發現,在放大線條圖時,使用這個稍大的 sigma 值確實可以消除鋸齒對角線邊緣上的任何「塊狀」瑕疵。但這是一個特例。

窗口化 Jinc 圓柱濾鏡

[IM 輸出] Jinc() 函數(有時被不準確地稱為「Bessel」濾波器)是用於圓柱濾波操作的「Sinc」等效項。 雖然與 Sinc() 非常相似且密切相關,但它設計用於使用徑向或圓柱距離過濾矩陣值,而不是僅在正交(軸對齊)方向上過濾。 如果你查看提供的 Jinc() 函數圖,你會發現它的第一個「零交叉」(代表第一個鄰近環)落在 1.0(對於正交鄰居)和 2 的平方根之間。 也就是說,零交叉的近似值為「1.2196699」。 Jinc() 函數的工作原理是,如果採樣點等於實際像素值,則 Jinc() 函數會為稍微靠近的正交相鄰像素分配一個正值,然後為稍微遠一點的對角相鄰像素分配一個類似的負值,依此類推,因為它在二維數值矩陣中移動得更遠。 因此,當不執行縮放(失真)時,理論上鄰居的貢獻應該相互抵消。 這就是為什麼 Jinc 濾波器在數學上是方形陣列圓柱重採樣的最佳解決方案,因此也是 失真 橢圓重採樣方法 (EWA) 的「理想」濾波器。 這並不是說從人類的角度來看它是一個「完美」的濾波器。 因此,在使用 失真運算符 時選擇任何 加窗濾波器,會將普通的「Sinc()」函數替換為等效的「Jinc()」函數。 由於 Jinc() 函數的零交叉位於非整數位置,因此根據上面為 加窗 Sinc 濾波器 引入的特殊 旁瓣支持設置 來指定濾波器支持非常重要。 使用「加窗 Jinc」濾波器的最大問題是當源圖像包含像素級雜湊圖案時(例如「pattern:gray50」提供的,請參閱 內建圖案)。 在這種情況下,所有正交鄰居都與對角鄰居不同,因此圖像會被「Jinc()」函數嚴重模糊。 然而,當使用「加窗 Jinc」濾波器時,幾乎所有其他圖案(例如線條、邊緣、角落)都保持非常清晰銳利,這使其仍然是一個很好的功能。 這個「問題」可能是一件好事,因為這意味著二維圓柱 Jinc 衍生濾波器可以用作從圖像中去除強像素雜湊類型圖案的方法,例如由 色彩減少抖動 生成的那些,而不會對圖像其餘部分的清晰度產生太大影響。 也就是說,它可以用作「抖動去除方法」(見下文)。

無操作情況下的失真和濾波器

理想情況下,無操作失真應該返回完全相同的圖像。 但正如你在前面的例子中看到的,這實際上可能不會發生。 調整大小(兩遍一維)濾波器:Lanczos(Sinc-Sinc)、Lanczos2、Catrom、Hermite、Triangle 和許多其他調整大小濾波器確實具有此屬性。 如果圖像未縮放,則像素圖案會完全保留。 另一方面,平滑或模糊濾波器(例如 Gaussian、Cubic 和 Quadratic)在應用於幾乎無操作的情況時會模糊圖像。 請注意,即使是調整大小濾波器默認值 Mitchell-Netravali 也包含一些模糊,因為它基本上是 B 樣條「三次」平滑濾波器和三次雙瓣 sinc 等效 Catmull-Rom 濾波器的混合。
調整大小運算符默認會自行短路,以便在無操作的情況下不執行任何操作。 因此,除非你明確指定一個濾波器,否則你將無法生成「無操作」調整大小。

失真永遠不會在無操作的情況下短路,這是為了確保失真縮放可能通過「無操作」情況的動畫的一致性。 這在調整大小的情況下通常不是問題。

雖然許多調整大小濾鏡在無操作的情況下會保留圖像。但圓柱形(扭曲)方法基本上永遠不會產生完美的無操作扭曲。任何無操作扭曲至少會最小程度地扭曲圖像的顏色,即使圖像本身沒有扭曲。發生這種情況是因為使用圓柱形濾鏡時,正交相鄰像素的貢獻將不同於對角線相鄰像素的貢獻。它們與查找點(在無操作情況下以實際像素為中心)的距離本質上是不同的。“Jinc”函數試圖通過抵消正交鄰居和對角線鄰居的貢獻來減少這種顏色失真。也就是說,實際上是其數學定義的一部分。在最壞的情況下,“像素級雜訊”,每個對角線像素鄰居都不同於每個正交像素鄰居。在這種情況下,濾鏡權重將增強而不是消除貢獻。因此,對於包含“像素級雜訊”的任何圖像的無操作扭曲,這種类型的圖像往往會產生非常嚴重的顏色失真。例如,在這裡我實際上使用此特殊屬性從圖像中刪除雜訊圖案。不使用縮放,僅對圖像應用二維“卷積”扭曲。

  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]
因此出現瞭如何調整扭曲濾鏡以最大程度地減少濾鏡為無操作扭曲產生的顏色失真的問題。Nicolas Robidoux 決定這樣做的方式是選擇一種模糊(重新調整濾鏡核心的支持),以盡可能地保留正交邊緣。

圓柱形 Lanczos 濾鏡

現在正如上面討論的,“Lancoz”通常被定義為同時使用“Sinc()”函數作為濾鏡的加權和加窗。但是,當用作 EWA 圓柱形濾鏡時,兩個加權函數都將被“Jinc()”函數替換。也就是說,不僅加權函數被替換(就像其他線性加窗濾鏡一樣),而且它還替換了加窗函數,產生了 Jinc 加窗 Jinc 加權函數。因此,“圓柱形 Lanczos”將選擇具有相同波瓣數(默認值為 3)的“Jinc 加窗 Jinc”。這種技術最早由 Andreas Gustafsson 在關於交互式(局部)圖像扭曲的論文中提出(第 24 頁)。他特別使用了一個 2 葉圓柱形 Lanczos(Jinc 加窗 Jinc)濾鏡,他將其命名為“Lanczos2D”(見下文)。這僅僅是對平面(EWA)情況的明顯延伸。因此使用相同的名稱。有關此內容的更多信息,請參閱BC 樣條討論中的帖子

Lanczos2 - 2 葉 Lanczos

為了方便起見,這個雙瓣版本被簡稱為「Lanczos2」,並已納入 IM v6.6.4-10 中,專門用於扭曲效果。它實際上只是一個帶有「filter:lobes=2」進階設定的圓柱形「Lanczos」(Jinc-Jinc)濾波器。請參閱上圖,由於 IM 濾波器會根據需要自動在 Sinc()Jinc() 函數之間切換,因此它不僅適用於「2D」(圓柱形)用途。它也可以用於調整大小(作為 Sinc-Sinc 函數),但我不推薦這樣做,因為它可能有點太小,而且實際上等同於其他各種立方函數。

LanczosSharp - 稍微銳化的 Lanczos

據觀察,對 Jinc() 函數進行加窗處理會導致 EWA 扭曲結果比正交調整大小結果(尤其是細線)中的類似加窗 Sinc() 函數模糊得多。對於輕微的扭曲尤其如此。基本上,Jinc() 函數具有一些特殊性質,而對 Jinc() 函數進行加窗處理會破壞這些特定且理想的性質。經過一番計算,勞倫森大學數學教授 Nicolas Robidoux 找到了一種稍微銳化的三瓣圓柱形 Lanczos 版本,現在稱為「LanczosSharp」,在某種程度上解決了扭曲圖像的問題。然而,生成的濾波器仍然具有加窗 Jinc 圓柱濾波器對低階「像素雜訊」模式的強烈模糊效果。

銳化的 Lanczos2

[IM 輸出]Lanzcos2」濾波器中也存在同樣的問題,而且更加嚴重,因此 Nicolas 還使用稍大的模糊進階控制製作了一個更銳利的「Lanczos2Sharp」濾波器。這使得在「無扭曲」的情況下,垂直或水平線的濾波器模糊度最小。這種銳化的濾波器會導致零點發生微小偏移,使其現在位於大約「1.1684」處。這看起來可能不多,但對於扭曲程度很小或沒有扭曲的圖像來說,它會對濾波器產生的模糊量產生巨大的影響。

Lanczos 半徑

[IM 輸出]這是一個經過模糊(銳化)處理的 EWA Lanczos 濾波器,因此使用的瓣數(預設為 3)適合整數支持半徑。也就是說,一個 3 瓣 EWA Lanczos(基於加窗 Jinc)被銳化到恰好具有半徑 3 的支持。您可以使用瓣數進階控制來達到相同的效果,但由於它涉及基於 Jinc 函數的已知零交叉點進行調整,因此計算起來並不容易。Nicolas 建議添加此濾波器,這樣您就不需要進行該計算,並且可以測試這個經過特殊銳化的濾波器。*未來:Jinc 加窗 Jinc 濾波器的模糊因子表。*
*包括瓣數作為參考。*

Robidoux 圓柱濾波器

[IM 輸出] 奇怪的是,實驗顯示,將 Mitchell-Netravali 濾波器作為圓柱濾波器使用時,在「無扭曲」的情況下產生了幾乎等效的「銳利」結果。然而,該濾波器與其作為圓柱濾波器的用途沒有關係,因為它是通過「社會研究」為正交(調整大小)濾波選擇的。「Mitchell」濾波器特別擅長保留低級別的「像素雜湊」模式,而普通的 加窗 Jinc 濾波器 會在圓柱濾波圖像中破壞這些模式。然後,Nicolas 發現了一個奇怪的巧合,即「Mitchell」非常接近於上面討論的「Lanzcos2」濾波器的「銳化」形式。這反過來又促使他開發了一種 Keys 三次濾波器,它可以完美地保留垂直(和水平)線條。此外,這種新濾波器的計算成本更低,因為三次函數的計算成本比 Jinc 函數低得多。從 IM v6.6.5-0 開始,這個三次濾波器已作為「Robidoux」濾波器添加到 IM 中,並且也是 扭曲 及其 橢圓加權重採樣 方法使用的默認濾波器,特別是因為它對於只有最小扭曲的圖像具有最小模糊特性。也就是說,並不是說它是「最好的」濾波器,即使 Nicolas 也喜歡使用其他濾波器,但它是一個很好的折衷方案,就像「Mitchell」對於正交(張量)調整大小來說是一個很好的折衷方案一樣。我在由 Mitchell-Netravali 調查 生成的「三次映射」上標記了這個濾波器,這樣您就可以看到它與「Mitchell」濾波器的關係有多密切。事實上,對於正交調整大小或圓柱扭曲的圖像來說,它都是一個合理的濾波器。

Robidoux 銳利圓柱濾波器

RobidouxSharp」濾波器是「Robidoux」濾波器的稍微銳化的版本,儘管有些人覺得結果太銳利了。它專門設計用於在「無扭曲」的情況下以最小的誤差保留包含純黑白像素的圖像。具體來說,在「無扭曲」的情況下,正交相鄰像素的權重與對角相鄰像素的負權重完全匹配。巧合的是,「Mitchell」濾波器幾乎正好位於「Robidoux」濾波器和「RobidouxSharp」濾波器之間,並且都屬於 三次 Keys 濾波器系列。因此,用戶可以從這三個濾波器中選擇任何一個來控制近「無扭曲」情況下結果的模糊-銳度。有關此濾波器的詳細信息,請參閱 IM 論壇上的 BC 樣條 討論。

Robidoux 柔和圓柱濾波器

這是後來添加的,與之前看到的其他圓柱濾波器有很大不同。是的,它更加模糊,使其更適用於放大圖像,這使得它可以避免磚砌建築照片上的某些階梯效應。有關此內容的更多信息,請參閱 BC 樣條討論中的這篇文章,以及來自 照片處理論壇討論的此討論

圓柱濾波器總結

Nicolas Robidoux 在關於 EWA 中 Jinc 濾波器的正確縮放 的長期且持續的論壇討論中,將此作為圓柱濾波器的總結...
如果 Robidoux 太過柔和而 RobidouxSharp 太過失真,我建議您嘗試 Mitchell(使用扭曲調整大小),它幾乎介於兩者之間。

由於 JPEG 涉及(離散)餘弦變換,因此基於傅立葉考慮因素的濾波器(Lanczoses 等,無論是使用 Sinc 調整大小還是使用 Jinc 扭曲)通常比基於「平滑函數的良好近似」的濾波器(基於 Keys 三次函數:Robidoux、Mitchell、RobidouxSharp、CatRom,無論是調整大小還是扭曲)表現更好,這並不奇怪。這種優勢在 PNG(不會透過傅立葉域破壞資訊)中似乎較小。

Nicolas 有更多話要說。他有很多話要说,以至於他擁有自己的章節 Nicolas Robidoux 的重採樣,現在這是一個獨立且內容豐富的頁面。

專家濾鏡控制

在上述各個章節中,我介紹了大量的特殊「專家」控制項,這些控制項允許您以各種方式修改各種濾波器。您可以使用 全域定義設定(或等效的 設定選項)來定義這些專家設定。「-filter」的IM 命令列選項參考頁面中提供了所有專家選項的完整摘要。「-filter」設定實際上僅用於查詢和設定適當的專家控制項,以便定義給定的「命名」調整大小濾波器。這些設定將在為特定調整大小或扭曲影像處理操作設定濾波器時,覆蓋上述預設值。
-filter」設定「Point」完全繞過上述所有濾波器設定,並退化為未縮放的「最近鄰居」直接查找(調整大小)或內插查找(扭曲)。因此,這個命名濾波器設定實際上完全關閉了縮放影像查找濾波器。
現在,雖然它們可用,但我还是要說最後一點。
除非您是專家(或只是在玩)——否則最好不要使用它們!
很少有人是影像處理專家,除非您確切知道濾波器的作用以及更改它們如何影響濾波方法,否則您可能會破壞影像處理的有效性,並產生難看的結果。尤其是在測試案例以外的影像中。這並不是說使用者不應該使用它們,許多 IM 範例確實使用了它們,但通常是為了提供一些特殊效果。當使用特殊選項時,也會說明其使用原因,您應該堅持使用該效果的配方。當然,歡迎您使用它們,並且您可以透過使用它們來產生一些非常有趣且非常不尋常的效果。

「詳細」濾波器控制

設定「filter:verbose」可能是您找出和理解其他濾波器控制項的最佳幫手。例如,您可以驗證 Lanczos 濾波器是否根據支援 3 的 Sinc 視窗化 Sinc 定義。

  magick null: -filter Lanczos -define filter:verbose=1 \
          -resize 2    null:    | grep '^#'
[IM Text]
請注意,在內部,Lanczos 濾波器是根據快速多項式等效「SincFast」(4 葉)函數定義的,而不是根據計算密集程度更高的三角函數庫函數定義的完整「Sinc」函數。在這裡,我們看到 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 之前錯誤地做的那樣)。

  -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
一個 12 瓣的「Lanczos」加窗濾波器,裁剪到所得加窗濾波器的前 8 個瓣...

  -filter Lanczos
  -define filter:win-support=12
  -define filter:support=8
這使其速度提高了大約四倍,方法是忽略(在 8 處裁剪支援)所得加窗 sinc 濾波器的加窗「尾部」(到 12)。然而,由於支援裁剪,這可能會導致一些額外的但很小的偽影。使用 Gaussian 來「模糊」影像!這相當於 -gaussian 5x2 操作,但使用無操作扭曲!

  -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 在探索「插值 EWA 濾波器」時建立了這個奇怪的濾波器

  -define filter:blur=.7071067811865475
  -define filter:c=.49257366
  -define filter:b=2.089813051319261
  -filter Cubic
用於放大影像時。像素會轉換為菱形圖案,其方案類似於混合,但使用菱形而不是正方形。任何使用專家選項的風險均由您自行承擔。它們並非用於生產用途,而是用於探索或產生棘手或不可能的調整大小函數的方法。使用風險自負!

調整大小濾波器摘要

以下是我在研究、記錄和整理 ImageMagick 中所有可用濾鏡後,個人的觀點。如果您認為我可能有誤,或想表達您的意見,歡迎您在 IM 論壇上發表您的看法,並邀請我回覆。 插值濾鏡(例如「Hermite」)非常適合用於大幅放大圖像,因為它們在最終結果中產生的模糊最少,儘管輸出通常可以在後製中進一步人工銳化。 高斯模糊濾鏡(例如「Mitchell」)最適合主要由線條繪製和卡通圖像組成的圖像。您可以使用特殊的 濾鏡模糊設定 來控制濾鏡對圖像的 模糊鋸齒 效果。 窗口正弦/Jinc 濾鏡Lagrange 等效濾鏡是處理真實世界圖像的最佳選擇,尤其是在縮小圖像時。它們的基本結果都非常相似。更大的支持度,或者更好的波瓣數量設定,通常會產生更好的結果,儘管您也可能會得到更多 振鈴 效果,但計算成本更高。 三次濾鏡 是一組速度快且簡單的濾鏡,具有固定的支持度(通常為 2.0),它可以產生從「Hermite」平滑插值濾鏡、質量評估為「Mitchell」的圖像放大濾鏡、非常模糊的高斯模糊「Spline」濾鏡,或使用「Catrom」的銳利窗口正弦類型濾鏡。通常,如果調整大小的結果可以接受,就不要再做任何調整,因為您更有可能使情況變得更糟,而不是更好。

濾鏡比較

放大...為了進行最終比較,我在這裡展示了 12 個代表性調整大小濾鏡的選集。圖像是在深灰色背景上,將一個像素寬線條中的鋸齒邊緣放大的結果。原始圖像本身就「有鋸齒」,因此您應該能夠看到各種濾鏡如何有效地消除任何現有的鋸齒效果。

  magick -size 10x6 xc:grey20 +antialias -draw 'fill white line 4,0 5,5' \
          -filter {filter_type} -resize 100x   {result}
[IM Output]
以上內容從 插值濾鏡 開始,接著是 高斯模糊濾鏡,顯示這些濾鏡產生了多少模糊,並在此過程中消除了原始圖像中的「鋸齒」。這些濾鏡不會產生振鈴。第二行從三個 窗口正弦濾鏡 開始,顯示它們可能產生的嚴重振鈴效應。請記住,這些濾鏡實際上是用於縮小圖像的,而不是放大圖像。接下來是使用其預設「插值」設定的「Lagrange」和「Catrom」插值三次濾鏡。最後一張圖像是「Mitchell」濾鏡,顯示了「專家」們主觀認為用於放大圖像的最佳「理想」濾鏡,在最終結果中呈現了最少的四種 重新採樣偽影。我個人也同意他們的發現,但僅適用於放大。這就是為什麼「Mitchell」是 IM 使用的預設「放大」濾鏡的原因。 縮小...為了瞭解 鋸齒 效果,我在這裡縮小了我們之前製作的 大環圖像 的裁剪區域(大小為 105x105 像素),以查看 12 個代表性濾鏡中的每一個產生了什麼樣的摩爾紋效果。

  magick rings_crop.png -filter {filter_type} -resize 100x {result}
[IM Output]
如您所見,內插濾鏡會產生非常嚴重的鋸齒狀摩爾紋,這是由其產生的區塊效應所導致的副作用。另一方面,高斯模糊濾鏡 的模糊效應會消除結果影像中的所有區塊狀摩爾紋,但會導致結果影像產生一般的模糊(線條模糊)。「高斯」濾鏡本身確實會顯示由於其無限(IIR)濾鏡被 濾鏡支援設定 裁剪而導致的幾乎難以察覺的鋸齒效應,但這是非常輕微的。另一方面,加窗 Sinc 濾鏡 會產生非常銳利的影像,並帶有圓形摩爾紋,在所有三個代表性濾鏡中強度大致相同。這是由這些濾鏡產生的振鈴效應所導致的,會產生干涉圖樣。最後,立方濾鏡也會顯示一些非常輕微的摩爾紋,但僅僅是由於負波瓣振鈴。 「Mitchell」濾鏡產生的振鈴效應最小。請注意,「Mitchell」確實會從幾乎所有調整大小的偽像中產生非常小的影響。也就是:網格狀摩爾紋(鋸齒/區塊)、圓形摩爾紋(振鈴)和線條模糊。然而,所有這些偽像都處於非常小的程度,這就是為什麼它是一個很好的全方位濾鏡。這是另一個比較,但這次是將 較小的環形影像 大幅縮小。

  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 的重新取樣.