ImageMagick 範例 --
傅立葉變換
- 索引
-
ImageMagick 範例 序言與索引
-
簡介
-
傅立葉變換
-
ImageMagick 中的 FFT/IFT
-
傅立葉變換的特性
-
實際應用
-
進階應用
-
FFT 乘法與除法(低階範例 - 子頁面)
簡介
在圖像處理中,最難理解的概念之一就是傅立葉變換。這有兩個原因。首先,它在數學上比較進階;其次,產生的圖像與原始圖像不相似,難以解釋。儘管如此,利用傅立葉變換可以提供新的方法來進行熟悉的處理,例如增強亮度和對比度、模糊化、銳化和雜訊去除。但它也可以提供在普通圖像域中無法實現的新功能。這些功能包括反捲積(也稱為去模糊化),用於處理典型的相機失真,例如運動模糊和鏡頭失焦,以及使用歸一化互相關進行圖像匹配。本頁面的目標是嘗試解釋傅立葉變換的背景和簡化後的數學原理,並通過範例說明使用傅立葉變換可以進行的處理。如果您覺得這太難了,您可以跳過它,直接從 ImageMagick 中的 FFT/IFT 開始,重點關注其特性和範例。對於感興趣的人,可以在 傅立葉理論的直觀解釋 中找到另一個很好的簡單討論,包括與光學的類比。范德比爾特大學工程學院的講義對於更傾向於數學的人來說也非常有用:《一維和二維傅立葉變換》和《頻率濾波》。其他數學參考資料包括維基百科上的《傅立葉變換》、《離散傅立葉變換》和《快速傅立葉變換》以及《複數》。*感謝 Sean Burke 對原始演示代碼的貢獻,以及 ImageMagick 的創建者將其整合到 ImageMagick 中。這兩者都是英勇的努力。* 許多範例都使用了 HDRI 版本的 ImageMagick,這是為了保持變換後圖像的準確性。如果您想充分利用這些技術,建議您編譯一個個人 HDRI 版本。傅立葉變換
一張圖片通常由一個「像素」陣列組成,每個像素由一組值定義:紅、綠、藍,有時還有透明度。但在這裡,我們將忽略透明度。因此,紅色、綠色和藍色「通道」中的每一個都包含一組「強度」或「灰階」值。這被稱為「空間域」中的點陣圖像。這只是一種說法,即圖像由其在每個「位置」或「空間位置」上的「強度值」定義。但圖像也可以用另一種方式表示,稱為圖像的「頻域」。在這個域中,每個圖像通道都用正弦波表示。在這樣的「頻域」中,每個通道都有「振幅」值,這些值存儲在基於 X、Y「頻率」而不是 X、Y「空間」坐標的位置。由於這是一種數位表示,因此頻率是「最小」或單位頻率的倍數,而像素坐標表示該單位頻率的索引或整數倍數。這遵循「任何表現良好的函數都可以由正弦波的疊加(組合或總和)表示」的原理。換句話說,「頻域」表示只是存儲和複製「空間域」圖像的另一種方式。但是如何將圖像表示為「波」呢?圖像即波
好吧,如果我們從任何圖像中取一行或一列像素,並將其繪製出來(使用腳本「im_profile
」使用「gnuplot」生成),你會發現它看起來很像一個波。如果波動在間距和振幅上更規則,你會得到更像波形的東西,例如...
magick -size 20x150 gradient: -rotate 90 \ -function sinusoid 3.5,0,.4 wave.gif im_profile -s wave.gif wave_profile.gif |
![[IM Output]](wave.gif)

![[IM Output]](wave_profile.gif)
magick -size 1x150 gradient: -rotate 90 \ -function sinusoid 3.5,0,.25,.25 wave_1.png magick -size 1x150 gradient: -rotate 90 \ -function sinusoid 1.5,-90,.13,.15 wave_2.png magick -size 1x150 gradient: -rotate 90 \ -function sinusoid 0.6,-90,.07,.1 wave_3.png magick wave_1.png wave_2.png wave_3.png \ -evaluate-sequence add added_waves.png |
![[IM Output]](wave_1_pf.gif)

![[IM Output]](wave_2_pf.gif)

![[IM Output]](wave_3_pf.gif)

![[IM Output]](added_waves_pf.gif)
圖像中的二維波
上面顯示了一個如何使用多個正弦波逼近圖像單行的輪廓的示例。但是圖像是二維的,因此用於在「頻域」中表示圖像的波也必須是二維的。以下是一個這樣的二維波示例。該波具有多個組成部分。 圖像示例在 ImageMagick 中使用 FFT/IFT
實現注意事項
ImageMagick 使用了 FFTW 離散傅立葉變換函式庫,它需要將影像轉換為浮點數值(複數)並從中轉換回來,此功能最早是在 IM 版本 6.5.4-3 中實現的。為了讓它按照人們對影像的普遍預期運作,任何非正方形或維度為奇數的影像都會被填充(使用 虛擬像素)為以影像最大寬度或高度為邊長的正方形。為了讓「FFT 原點」能正確置中於影像中央,它也會被強制調整為偶數(2 的倍數)維度。這樣做的結果是,在套用反向傅立葉變換後,需要將影像裁剪回其原始維度以移除填充的部分。由於傅立葉變換是由「複數」組成的,因此變換的結果無法直接視覺化。所以,複數變換會以兩種形式之一分離成兩個分量影像。![]() 複數 實部/虛部 |
實部和虛部
「複數」的一般數學和數值表示法是由「實部」(a) 和「虛部」(b) 組成的浮點數值對。遺憾的是,這兩個數字可能包含負值,因此無法形成可視的影像。因此,這種表示法無法在一般版本的 ImageMagick 中使用,因為它會裁剪此類影像(請參閱下方範例中產生的效果)。但是,當使用 HDRI 版本的 ImageMagick 時,您仍然可以產生、使用,甚至儲存這種傅立葉變換影像的表示法。它們本身可能沒有用處,甚至無法作為影像觀看,但您仍然可以對它們套用許多數學運算。為了產生這種表示法,我們使用運算子的「加號」形式,「+fft
」和「+ift
」,並將在下方 以實部-虛部表示 FFT 中詳細討論。![]() 複數極座標形式 強度/相位 |
強度和相位
直接以數值表示「複數」的方式對影像處理來說不是很有用。但是藉由將這些值繪製在二維平面上,您可以將其轉換為由「強度」(r) 和「相位」(θ) 組成的極座標表示法。這種形式在影像處理中非常有用,特別是強度分量,它基本上指定了構成影像的所有頻率。「強度」分量只包含正值,並且直接映射到影像值。它沒有固定的值範圍,但除了 DC 或零頻率顏色外,這些值通常非常小。因此,強度影像通常看起來非常暗(幾乎是黑色的)。通常需要調整強度並對其強度值應用對數轉換,才能顯示出任何視覺細節。得到的「對數轉換」強度影像稱為影像的「頻譜」。但是請記住,應用於反向轉換的是「強度」影像,而不是「頻譜」影像。出現在影像中心「原點」的 DC(「直流電」的縮寫)或「零頻率」顏色,將是整個影像的平均顏色值。同樣,由於輸入影像不包含「虛部」,因此 DC 相位值也始終為零相位,產生純灰色。「相位」分量的範圍從 -π 到 +π。這首先會偏置到 0 到 2π 的範圍,然後縮放到從 0 到 QuantumRange 的實際影像值(由編譯時記憶體品質決定)。因此,零相位將具有純灰色值(適用於每個通道),而負相位將是純黑色('0
')值。請注意,純白色('QuantumRange
')幾乎但並不完全相同。使用正常的 FFT 運算符「+fft
」和「+ift
」可以產生影像的強度和相位 FFT 表示。這將首先在生成 FFT 影像及其反轉中討論。生成 FFT 影像及其反轉
(強度和相位)
現在,讓我們簡單地對 Lena 影像嘗試傅立葉變換往返。也就是說,我們只需執行正向轉換,然後立即應用反向轉換即可獲得原始影像。然後我們將比較結果以查看產生的品質水準。
|
![[IM Output]](../img_photos/lena.png)

![[IM Output]](lena_roundtrip.png)
![]() |
compare
」程式返回兩個影像差異程度的度量。在這種情況下,您可以看到總體差異非常小,約為 0.22%
。至少一個像素中的峰值差異約為(「PAE」,峰值絕對誤差)僅約為 1%
。您可以使用HDRI版本的 ImageMagick 來改進這一點。(請參閱下面的使用 HDRI 進行 FFT)。讓我們仔細看看在上述往返過程中生成的 FFT 影像。如同 約翰·M·布雷耶 對傅立葉變換所說... 我們通常不會顯示「相位」圖像,因為大多數看到它們的人不久後就會沉迷於迷幻藥,或者最終在西藏寺院中結束一生。請注意,「-fft
」運算符生成了兩張圖像,第一張圖像是「幅度」分量(是的,它幾乎是黑色的,中間只有一個彩色點),而第二張看起來幾乎是隨機的圖像,則包含了「相位」分量。PNG 圖像每個文件只能存儲一張圖像,因此實際上不需要輸出文件名中的「+adjoin
」或「%d
」,因為 IM 會處理這個問題。但是,為了完整性,我在上面包含了這些選項,以便明確說明我正在生成兩個獨立的圖像文件,而不是一個。有關更多詳細信息,請參閱編寫多圖像序列。由於生成了兩張圖像,因此幅度圖像(第零張圖像)會保存到「lena_fft_0.png
」中,而相位圖像(第二張圖像)則會保存到「lena_fft_1.png
」中。![]() ![]() |
為了防止因儲存 FFT 圖像而造成任何失真的可能性,最好根本不要將它們儲存到磁碟,而是在處理圖像時將它們保存在記憶體中。 如果您必須儲存,那麼最好使用 Magick 文件格式「 MIFF 」,以便以最高品質(位元深度)保留圖像。這種格式還可以在一個文件中儲存多個圖像。對於腳本工作,您也可以使用詳細的「TXT 」列舉像素格式。不要使用「 JPEG 」或「GIF 」圖像格式儲存它們。如果您必須將這些圖像儲存到文件中以供實際觀看,例如用於網路瀏覽器,請使用圖像格式「 PNG 」,並將「+depth 」重置為內部預設值(就像我們在這些範例中所做的那樣)。但是,它每個文件只能存儲一張圖像。「 TIFF 」文件格式也可以使用,但網路瀏覽器並不像 PNG 那樣廣泛接受,不過它允許每個文件包含多個圖像。 |
MIFF
」文件格式...
magick lena.png -fft +depth lena_fft.miff |
-write
」將它們儲存到完全不同的文件名中(請參閱寫入圖像)...
magick lena.png -fft +depth \ \( -clone 0 -write lena_magnitude.png +delete \) \ \( -clone 1 -write lena_phase.png +delete \) \ null: |
NULL:
」圖像格式來丟棄兩張仍然保存在記憶體中以供進一步處理的圖像。最後,我們再次讀取這兩張圖像,以便將其轉換回正常的「空間」圖像...FFT 過程中生成的兩張圖像都對修改非常敏感,即使是很小的更改也可能導致結果嚴重失真。因此,切勿將它們儲存為任何可能會扭曲這些值的圖像格式。重要的是要記住,從頻域恢復圖像時,需要同時使用這兩張圖像。因此,如果您打算將它們用於圖像重建,那麼儲存一張圖像並丟棄另一張圖像是沒有用的。僅顯示強度或相位的圖像
最後,讓我們嘗試僅從幅度分量或僅從相位分量重建圖像。
magick lena_fft_0.png -size 128x128 xc:'gray(50%)' \ -ift lena_magitude_only.png magick -size 128x128 xc:gray1 lena_fft_1.png -ift lena_phase_only.png |
![]() 僅限幅度 |
![]() 僅限相位 |
頻譜圖像
您會注意到幅度圖像(第一張或第零張圖像)看起來幾乎完全是黑色的。 它實際上不是,但對我們的眼睛來說,所有值都非常非常小。 這樣的圖像研究起來並不有趣,所以讓我們使用對數變換來增強結果,以生成“頻譜”圖像。 這是通過將強對數變換評估應用於歸一化“幅度”圖像來完成的。現在我們可以看到幅度圖像頻譜版本的細節。 您甚至可能會在頻譜圖像中看到一些特定的顏色,但通常這些顏色在頻譜圖像中並不重要。 更重要的是每個頻率的整體強度及其產生的模式。 因此,您可能還希望在增強後對頻譜圖像進行灰度化。 您需要使用多少對數增強取決於圖像,因此您應該調整它,直到獲得足夠的細節以清楚地看到圖像頻譜的模式。但是請記住,您不能將頻譜圖像用於反向“-ift ”變換,因為它會產生過亮的圖像。
|
![]() |
HDRI FFT 圖像
當我們將傅立葉變換的結果映射到圖像表示時,我們將值從浮點“複數”縮放並轉換為整數圖像值。 這自然會產生捨入誤差和其他“量子”效應,尤其是在較小的低頻幅度中。 如果準確性在您的圖像處理中很重要,那麼您將需要使用位元深度(例如 ImageMagick 的 Q32 或 Q64 位元版本),或者最好使用HDRI 版本 ImageMagick,以便將值存儲為浮點數。 當將 IM 的 HDRI 版本與傅立葉變換的幅度和相位表示一起使用時,幅度分量仍然都是正值,因此仍然可以如上所示使用,只是更加精確。 但是,相位分量仍將如前所示進行偏差和縮放。 換句話說,HDRI 中的幅度和相位表示完全相同,只是更加準確。例如,在這裡我使用HDRI 版本 ImageMagick來生成圖像的另一個“往返”轉換。
|
![]() |
![]() ![]() |
與浮點數相容的檔案格式包括「MIFF 」、「TIFF 」、「PFM 」和 HDRI 專用的「EXR 」檔案格式。但是您可能需要設定「-define quantum:format=floating-point 」才能使其運作。 |
FFT 作為實部和虛部
到目前為止,我們只看到了傅立葉變換影像的「幅度」和「相位」表示。但是,如果您已經編譯了HDRI 版本的 IM,則也可以使用浮點「實數」和「虛數」分量來處理影像。這是透過使用選項「+fft
」和「+ift
」的「加號」版本來完成的。例如,這裡我使用HDRI 版本的 IM來執行影像的「往返」FFT,但這次會產生實數/虛數影像。
|
![]() |
當您使用加號形式產生實數/虛數 FFT 影像時,必須使用 HDRI 版本。如果您不這樣做,大約有一半的值會是零,導致影像看起來「髒髒的」。例如...
|
![]() |
|
![]() 僅限實數 |
![]() 僅限虛數 |
傅立葉變換的性質
常數圖像的 FFT
讓我們示範其中的一些性質。首先,讓我們簡單地取一個恆定顏色的影像並取得其幅度。請注意,在這種情況下,幅度影像實際上是純黑色的,除了影像正中央、像素位置寬度/2、高度/2 處的一個彩色像素。這個像素是影像的零頻率或 DC(「直流電」)值,並且是不表示正弦波的一個像素。換句話說,這個值就是 FFT 常數分量!為了更清楚地看到這個像素,讓我們放大影像的該區域...
|
![]() |
![]() ![]() |
雖然 DC 值的「相位」並不重要,但它應該始終是「零」角度(相位顏色值為 50% 灰色)。如果未設定為 50% 灰色,則 DC 值將具有「非實數」分量,並且其值會根據給定的角度進行調製。 |
直流顏色的影響
在更典型的非恆定圖像中,DC 值是圖像的平均顏色。如果您將圖像完全模糊、平均或縮小到單個像素或顏色,通常應該獲得的顏色。例如,讓我們從「Lena」圖像的 FFT 中提取 DC 像素。
|
![[IM Output]](../img_photos/lena.png)

![[IM Output]](lena_magnitude.png)

![[IM Output]](lena_dc_zoom.gif)
例如,讓我們將「深粉色」DC 像素替換為其他顏色,例如更橙色的「番茄色」...
|
![]() |
正弦波圖像的頻譜
接下來,讓我們看一下具有 4 個週期的單個正弦(或餘弦)波圖像的光譜
magick -size 128x129 gradient: -chop 0x1 -rotate 90 -evaluate sine 4 \ sine4.png magick sine4.png -fft +delete \ -auto-level -evaluate log 100 sine4_spectrum.png |
![[IM Output]](sine4.png)

![[IM Output]](sine4_spectrum.png)
![]() ![]() |
以上漸變圖像的特殊創建方式是必要的,以確保生成的正弦波圖像在整個圖像中完美平鋪。 普通的「 漸變: 」圖像無法完美平鋪,因此由其生成的正弦波也無法完美平鋪。這種不完美平鋪的 FFT 變換將導致一系列不希望有的諧波,而不是傅立葉變換光譜中的單個「點」。有關此問題的更多詳細信息,請參閱生成完美漸變。 |
magick -size 128x129 gradient: -chop 0x1 -rotate 90 -evaluate sine 16 \ -write sine16.png -fft -delete 1 \ -auto-level -evaluate log 100 sine16_spectrum.png |
![[IM Output]](sine16.png)

![[IM Output]](sine16_spectrum.png)
小變大,大變小。
這是處理傅立葉變換時要記住的最重要的方面之一,因為它是從圖像中去除噪聲(小特徵)的關鍵,同時保留圖像的整體較大方面。讓我們通過繪製它們的原始幅度(不是對數譜)來仔細觀察這三個“頻率”。
|
![]() |
![[IM 輸出]](lena_spectrum.png)
![]() ![]() |
在生成過程中,FFT 算法僅生成圖像的左半部分。另一半是通過旋轉和複製生成的數據生成的。 將頻域圖像轉換回空間域圖像時,算法再次只查看圖像的左半部分。右半部分完全被忽略,因為它只是一個副本。 因此,當您(在後面的範例中)對 FFT 幅度圖像進行「陷波濾波」時,您只需要過濾幅度圖像的左側。您也可以忽略右半邊來節省一些工作量。但是為了清楚起見,我將「陷波」兩半。 |
直接產生 FFT 圖像
現在我們可以使用上述信息來實際生成正弦波的圖像。您需要做的就是創建一對黑色和 50% 灰度的圖像對,並添加具有適當幅度和相位的「點」。例如...
magick -size 128x128 xc:black \ -draw 'fill gray(50%) color 64,64 point' \ -draw 'fill gray(50%) color 50,68 point' \ -draw 'fill gray(25%) color 78,60 point' \ generated_magnitude.png magick generated_magnitude.png \ -auto-level -evaluate log 3 generated_spectrum.png magick -size 128x128 xc:gray50 generated_phase.png magick generated_magnitude.png generated_phase.png \ -ift generated_wave.png |
![[IM Output]](generated_spectrum.png)
![[IM Output]](generated_phase.png)

![[IM Output]](generated_wave.png)
![]() ![]() |
實際上,只需要第一個(最左側)「gray25」點來生成正弦波,因為 IFT 變換完全忽略了圖像的右半部分,因為這應該只是左半部分的旋轉鏡像。 |
![]() ![]() |
DC 值的相位必須具有「零角度」(50% 灰色)。如果您不確保這種情況,則 DC 色彩值將通過其非零相位進行調製,從而產生更暗、可能「裁剪」的圖像。 |
![]() ![]() |
相位中的其他像素可以是您喜歡的任何灰度級別,並且將有效地「滾動」圖像上的正弦波。同樣,只有最左側點的相位才真正重要。右側完全被忽略。只需確保中心 DC 相位像素保持 50% 灰色。 |
未來:使用 FFT 的 Perlin 雜訊產生器
垂直線的光譜
顯示細線和粗線的 FFT 光譜 演示圖像的 FFT 中小特徵如何變「大」,大特徵如何變「小」。將其鏈接到可以被視為具有單一諧波的「線」的正弦波。 旋轉線矩形圖案圖像的光譜
接下來,讓我們看看黑色背景中寬度為 8 高度為 16 的白色矩形的光譜。
magick -size 8x16 xc:white -gravity center \ -gravity center -background black -extent 128x128 rectangle.png magick rectangle.png -fft +delete \ -auto-level -evaluate log 100 rect_spectrum.png |
![[IM Output]](rectangle.png)

![[IM Output]](rect_spectrum.png)
magick rectangle.png -rotate 45 -gravity center -extent 128x128 \ -write rect_rot45.png -fft -delete 1 \ -auto-level -evaluate log 100 rect_rot45_spectrum.png |
![[IM Output]](rect_rot45.png)

![[IM Output]](rect_rot45_spectrum.png)
magick rectangle.png -rotate 45 -geometry +30+20 -extent 128x128 \ -write rect_rot45off.png -fft -delete 1 \ -auto-level -evaluate log 100 rect_rot45off_spectrum.png |
![[IM Output]](rect_rot45off.png)

![[IM Output]](rect_rot45off_spectrum.png)
平面圓形圖案圖像的頻譜
接下來,讓我們看一下具有白色平面圓形圖案的圖像的光譜,一種情況下直徑為 12(半徑為 6),另一種情況下直徑為 24(半徑為 12)。
magick -size 128x128 xc:black -fill white \ -draw "circle 64,64 64,70" -write circle6.png -fft -delete 1 \ -auto-level -evaluate log 100 circle6_spectrum.png magick -size 128x128 xc:black -fill white \ -draw "circle 64,64 64,76" -write circle12.png -fft -delete 1 \ -auto-level -evaluate log 100 circle12_spectrum.png |
![[IM Output]](circle6.png)

![[IM Output]](circle6_spectrum.png)
![[IM Output]](circle12.png)

![[IM Output]](circle12_spectrum.png)
高斯圖案影像的光譜
接下來,讓我們看看兩張影像的光譜,每張影像都有一個白色高斯圓形圖案,sigma 分別為 8 和 16
magick -size 128x128 xc:black -fill white \ -draw "point 64,64" -gaussian-blur 0x8 -auto-level \ -write gaus8.png -fft -delete 1 \ -auto-level -evaluate log 1000 gaus8_spectrum.png im_profile -s gaus8.png gaus8_pf.gif im_profile -s gaus8_spectrum.png gaus8_spectrum_pf.gif |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
magick -size 128x128 xc:black -fill white \ -draw "point 64,64" -gaussian-blur 0x16 -auto-level \ -write gaus16.png -fft -delete 1 \ -auto-level -evaluate log 1000 gaus16_spectrum.png im_profile -s gaus16.png gaus16_pf.gif im_profile -s gaus16_spectrum.png gaus16_spectrum_pf.gif |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
網格圖案圖像的頻譜
接下來,讓我們變換一張僅包含一組間隔 16x8 像素的網格線的影像。
magick -size 16x8 xc:white -fill black \ -draw "line 0,0 15,0" -draw "line 0,0 0,7" \ -write mpr:tile +delete \ -size 128x128 tile:mpr:tile \ -write grid16x8.png -fft -delete 1 \ -auto-level -evaluate log 100000 grid16x8_spectrum.png |
![[IM Output]](grid16x8.png)

![[IM Output]](grid16x8_spectrum.png)
更多光譜信息
如果您想了解更多有關光譜影像及其特性的信息,請訪問以下鏈接。實際應用
好的,既然我們已經介绍了基礎知識,那麼使用傅立葉變換的實際應用有哪些?可以完成的事情包括:1) 增加或減少影像的對比度,2) 模糊,3) 銳化,4) 邊緣檢測和 5) 雜訊去除。改變圖像的對比度 - 係數開根號
可以通過執行正向傅立葉變換、將幅度影像提高到冪,然後將其與反向傅立葉變換中的相位一起使用來調整影像的對比度。要增加對比度,可以使用略小於 1 的指數;要降低對比度,可以使用略大於 1 的指數。因此,讓我們首先使用 0.9 的指數增加 Lena 影像的對比度,然後使用 1.1 的指數降低對比度。
magick lena.png -fft \ \( -clone 0 -evaluate pow 0.9 \) -delete 0 \ +swap -ift lena_plus_contrast.png magick lena.png -fft \ \( -clone 0 -evaluate pow 1.1 \) -delete 0 \ +swap -ift lena_minus_contrast.png |
![[IM Output]](../img_photos/lena.png)

![[IM Output]](lena_plus_contrast.png)
![[IM Output]](../img_photos/lena.png)

![[IM Output]](lena_minus_contrast.png)
模糊圖像 - 低通濾波
傅立葉變換最重要的特性之一是空間域中的卷積等效於頻域中的簡單乘法。在空間域中,可以使用小的、方形的、簡單的卷積濾波器(內核)通過 -convole 選項對圖像進行模糊處理。這稱為低通濾波器。最簡單的濾波器只是一個等加權的方形陣列。也就是說,所有值都是 1,在應用卷積之前通過除以它們的總和進行歸一化。這相當於局部或鄰域平均值。另一個低通濾波器是由 -gaussian-blur 或 -blur 提供的高斯加權圓形濾波器。在頻域中,一種低通模糊濾波器只是一個被黑色包圍的恆定強度的白色圓圈。這類似於空間域中的圓形平均卷積濾波器。但是,由於空間域中的卷積等效於頻域中的乘法,因此我們只需要執行正向傅立葉變換,然後將濾波器與強度圖像相乘,最後執行反向傅立葉變換。我們注意到,小型卷積濾波器將對應於頻域中的大圓圈。乘法是通過 -composite 和 -compose 乘法設置來執行的。因此,讓我們嘗試使用兩種尺寸的圓形濾波器來做到這一點,一種直徑為 40(半徑為 20),另一種直徑為 28(半徑為 14)。
magick -size 128x128 xc:black -fill white \ -draw "circle 64,64 44,64" circle_r20.png magick lena.png -fft \ \( -clone 0 circle_r20.png -compose multiply -composite \) \ \( +clone -evaluate log 10000 -write lena_blur_r20_spec.png +delete \) \ -swap 0 +delete -ift lena_blur_r20.png magick -size 128x128 xc:black -fill white \ -draw "circle 64,64 50,64" circle_r14.png magick lena.png -fft \ \( -clone 0 circle_r14.png -compose multiply -composite \) \ \( +clone -evaluate log 10000 -write lena_blur_r14_spec.png +delete \) \ -swap 0 +delete -ift lena_blur_r14.png |
![]() ![]() ![]() ![]() |
![]() ![]() ![]() ![]() ![]() |
![]() ![]() ![]() ![]() ![]() |
magick circle_r20.png -blur 0x4 -auto-level gaussian_r20.png magick lena.png -fft \ \( -clone 0 gaussian_r20.png -compose multiply -composite \) \ \( +clone -evaluate log 10000 -write lena_gblur_r20_spec.png +delete \) \ -swap 0 +delete -ift lena_gblur_r20.png magick circle_r14.png -blur 0x4 -auto-level gaussian_r14.png magick lena.png -fft \ \( -clone 0 gaussian_r14.png -compose multiply -composite \) \ \( +clone -evaluate log 10000 -write lena_gblur_r14_spec.png +delete \) \ -swap 0 +delete -ift lena_gblur_r14.png |
![]() ![]() ![]() ![]() |
![]() ![]() ![]() ![]() ![]() |
![]() ![]() ![]() ![]() ![]() |
偵測圖像中的邊緣 - 高通濾波
在空間域中,從圖像中提取邊緣的高通濾波器通常以帶有正負權重的卷積實現,使得它們的總和為零。在頻域中,事情就簡單多了。這裡的高通濾波器只是低通濾波器的反轉版本。也就是說,低通濾波器亮的地方,高通濾波器就暗,反之亦然。所以在 ImageMagick 中,我們只需要 反轉 低通濾波器圖像即可。讓我們使用圓形圖像對 Lena 圖像應用高通濾波器。然後再使用純高斯曲線。
magick circle_r14.png -negate circle_r14i.png magick lena.png -fft \ \( -clone 0 circle_r14i.png -compose multiply -composite \) \ \( +clone -evaluate log 10000 -write lena_edge_r14_spec.png +delete \) \ -delete 0 +swap -ift -normalize lena_edge_r14.png magick -size 128x128 xc: -draw "point 64,64" -blur 0x14 \ -auto-level gaussian_s14i.png magick lena.png -fft \ \( -clone 0 gaussian_s14i.png -compose multiply -composite \) \ \( +clone -evaluate log 10000 -write lena_edge_s14_spec.png +delete \) \ -delete 0 +swap -ift -normalize lena_edge_s14.png |
![]() ![]() ![]() ![]() |
![]() ![]() ![]() ![]() ![]() |
![]() ![]() ![]() ![]() ![]() |
銳化圖像 - 高增益濾波
銳化圖像最簡單的方法是對其進行高通濾波(不進行歸一化拉伸),然後將其與原始圖像混合。
magick lena.png -fft \ \( -size 128x128 xc: -draw "point 64,64" -blur 0x14 -auto-level \ -clone 0 -compose multiply -composite \) \ -delete 0 +swap -ift \ lena.png -compose blend -set option:compose:args 100x100 -composite \ lena_sharp14.png |
![[IM Output]](../img_photos/lena.png)

![[IM Output]](lena_sharp14.png)
雜訊去除 - 陷波濾波
許多噪聲圖像都包含某種模式的噪聲。這種噪聲在頻域中很容易去除,因為模式顯示為幾個點或線的模式。回想一下,簡單的正弦波是一種重複的模式,在頻譜中僅顯示為 3 個點。為了消除這種噪聲,人們只需要(但遺憾的是)在幅度圖像中手動遮罩(或切除)點或線。我們通過轉換到頻域、創建頻譜的灰度版本、遮罩點或線、對其進行閾值處理、將二進制遮罩圖像與幅度圖像相乘,然後轉換回空間域來做到這一點。讓我們在 小丑圖像 上嘗試一下,該圖像包含對角條紋狀的抖動模式。首先,我們對小丑圖像進行變換,以創建其幅度和相位圖像。
magick clown_orig.jpg -fft \ \( +clone -write clown_phase.png +delete \) +delete \ -write clown_magnitude.png -colorspace gray \ -auto-level -evaluate log 100000 clown_spectrum.png |
![]() 原始影像 |
![]() |
![]() 頻譜 |
![]() 相位 |
magick clown_spectrum_edited.png clown_spectrum.png \ -compose difference -composite \ -threshold 0 -negate clown_spectrum_mask.png |
![[IM Output]](clown_spectrum_edited.png)

![[IM Output]](../img_photos/clown_spectrum_mask.png)
magick clown_magnitude.png clown_spectrum_mask.png \ -compose multiply -composite \ clown_phase.png -ift clown_filtered.png |
![[IM Output]](clown_orig.jpg)

![[IM Output]](clown_filtered.png)
結果非常好。但我們可以做得更好。正如您在前面的示例中所見,簡單的“圓形”對 FFT 圖像不是特別友好,所以讓我們稍微模糊一下遮罩...
|
![]() |
並過濾小丑,這次在內存中重新生成 FFT 圖像。
|
![]() |
我們甚至可以取原始圖像和結果圖像之間的差異,以創建一個顯示已去除噪聲區域的圖像。
|
![]() |
magick twigs.jpg -fft +delete -colorspace gray \ -auto-level -evaluate log 100000 twigs_spectrum.png |
![[IM Output]](twigs.jpg)

![[IM Output]](twigs_spectrum.png)
magick twigs_spectrum_edited.png twigs_spectrum.png \ -compose difference -composite \ -threshold 0 -negate twigs_spectrum_mask.png |
![[IM Output]](twigs_spectrum_edited.png)

![[IM Output]](../img_photos/twigs_spectrum_mask.png)
magick twigs.jpg -fft \ \( -clone 0 twigs_spectrum_mask.png -compose multiply -composite \) \ -swap 0 +delete -ift twigs_filtered.png |
![[IM Output]](twigs.jpg)

![[IM Output]](twigs_filtered.png)