當我進行邊緣檢測時,我通常首先使用高斯濾波器:
img_blur = scipy.ndimage.gaussian_filter(img,2,truncate = 2.25)
然后是梯度過濾器:
Ix= scipy.ndimage.convolve(im, dx)
Iy = scipy.ndimage.convolve(im, dy)
其中 dx 和 dy 是水平和垂直方向的兩個濾波器。然后我將計算邊緣:
edges = Ix**2 Iy**2
我的問題是有沒有辦法將高斯濾波器和梯度濾波器組合成一個濾波器?讓我們將此過濾器稱為 f,我可以執行以下操作:
f= scipy.scipy.ndimage.gaussian_filter(img,2,truncate = 2.25) scipy.ndimage.convolve(im, dx)
? 我知道這不是一個合法的表達方式,但是有沒有辦法正確實作這個過濾器,或者有沒有其他過濾器具有相同的效果?我分別做水平和垂直過濾器,所以 f 一次只需要一個方向。這個過濾器需要經過另一個卷積才能得到最終結果,也就是說它需要經過另一個
result = scipy.ndimage.convolution(img,filter)
得到最終結果。
uj5u.com熱心網友回復:
只需將它們的內核卷積在一起,就可以將兩個連續應用的過濾器組合成一個過濾器。
因此,您可以將高斯與每個梯度過濾器結合起來,形成兩個組合的高斯梯度過濾器,但是......
你不想這樣做,因為梯度過濾器非常快速 簡單,而高斯過濾器是一個更復雜的操作。組合的高斯梯度濾波器也是一個復雜的操作。應用兩個(慢)組合過濾器會比應用單個高斯過濾器后跟兩個梯度要慢。
事實上,我們所說的所有過濾器都是可分離的。梯度過濾器僅在一個方向(水平或垂直)上運行,而其他過濾器(高斯和組合)最有效地實作為兩個過濾器應用程式,一個水平和一個垂直。
因此,在組合過濾器時,如果您要注意有效地實作組合過濾器,那么您實際上會用 4 個方向過濾器應用程式(高斯 X、高斯 Y、梯度 X、梯度 Y)換取 4 個較慢的方向過濾器應用程式(CombinedX X,組合X Y,組合Y X,組合Y Y)。這些速度較慢,因為您不再有任何快速 簡單的漸變通道。
uj5u.com熱心網友回復:
你不能。convolve過濾器使用前一個的結果。要計算卷積的值,您需要模糊的鄰居值。當您將 2 個過濾器應用于 1 個影像時,有時您可以將它們組合起來。您在 2 個不同的影像上應用 2 個過濾器。
從理論上講,您可以在第一步中找到第二步的一些實作。實際上,我以前從未見過類似的東西。你可以自己寫。為了有效實施,您需要使用更多面向硬體的語言(例如 C )并使用 SIMD 指令以加快實施速度。
Sembei 在評論中提出正確的問題。為什么要在 1 個過濾器中運行?也許我們可以建議其他方法來解決您的問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/505702.html
標籤:Python 图像处理 信号处理 scipy.ndimage
上一篇:如何根據自定義蒙版裁剪影像
