簡體   English   中英

如何使用FFT卷積執行形態侵蝕

[英]How to perform morphology erosion using FFT Convolution

我嘗試使用FFT卷積計算形態侵蝕。 我知道侵蝕是擴張的雙重操作。 第一個問題是我不能像往常一樣使用0作為背景。 所以我偏向我的價值觀。 設0.1代表背景,1.0代表前景。 將背景反轉為前景並使用結構元素執行FFT卷積(使用scipy.signal.fftconvolve),我獲得了無法進一步解釋的結果。 我知道我應該以某種方式確定解決方案的閾值,然后再次求逆。 怎么做?

我的2D信號A:

1 1 0 1 1
1 1 1 1 1
0 1 1 1 0
1 1 1 1 1
1 1 0 1 1

結構元素B:

0 1 0
1 1 1
0 1 0

侵蝕(A,B):

0 0 0 0 0
0 1 0 1 0
0 0 1 0 0
0 1 0 1 0
0 0 0 0 0

使用FFT卷積inv(A):

0.1 0.1 1.0 0.1 0.1
0.1 0.1 0.1 0.1 0.1
1.0 0.1 0.1 0.1 1.0
0.1 0.1 0.1 0.1 0.1
0.1 0.1 1.0 0.1 0.1

和B:

0.1 1.0 0.1
1.0 1.0 1.0
0.1 1.0 0.1

結果如下:

0.31 1.32 1.32 1.32 0.31
1.32 0.72 1.44 0.72 1.32
1.32 1.44 0.54 1.44 1.32
1.32 0.72 1.44 0.72 1.32
0.31 1.32 1.32 1.32 0.31

接下來是什么? 歸一化/閾值然后求逆?

最好的祝福

通過在頻域中相乘並逆變換回實空間來執行卷積后,必須將結果的閾值設置為高於特定值。 根據J.Kukal,D.Majerova,A.Prochazka的白皮書《 帶有球形蒙版的灰度圖像的膨脹和腐蝕》,該閾值對於膨脹而言>0.5 ,對於腐蝕而言,其閾值為>m-0.5 ,其中m為結構元素的體積( B中的1的數目,在這種情況下為5)。

簡而言之:此代碼將給您預期的結果。

from scipy.signal import fftconvolve
import numpy as np
def erode(A,B):
    thresh = np.count_nonzero(B)-0.5
    return fftconvolve(A,B,'same') > thresh

這可以在任何維度上工作,並且可以准確地再現scipy.ndimage.binary_erosion的結果-至少,我已經在2D和3D中對其進行了測試。

至於這里發布的另一個答案,它對侵蝕的預期結果提出了質疑:這取決於邊界條件。 此處編寫的scipy.ndimage.binary_erosion和自定義erode(A,B)函數均假定輸入A的所有邊緣都可能發生腐蝕-即在腐蝕之前用0填充A。 如果您不喜歡這種邊界條件-例如,如果您認為應該將其視為反射的邊界條件-那么應該考慮自己使用np.pad(A,np.shape(B)[0],'reflect')填充數組np.pad(A,np.shape(B)[0],'reflect') 然后,您需要在以后取消填充結果。

我對這里的細節很了解,因為我寫了一個更全面的答案,關於如何使用頻率空間卷積對您提出的另一個問題同時進行腐蝕擴張,但是我認為在這里為所有尋求答案的人提供一個結論性的答案是值得的。

我的答案來得很晚,但我仍然給出答案。

  • Erode(A,B)是錯誤的。 這應該是答案:

1 0 0 0 1

0 1 0 1 0

0 0 1 0 0

0 1 0 1 0

1 0 0 0 1

  • 侵蝕/膨脹是等級運算,更具體而言是最小/最大運算,但絕對不是卷積。 因此,您無法使用FFT執行它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM