2012-08-29 84 views
5

我的問題很簡單。這可能太簡單了。但是,在我的一個項目中,我使用以下幾行來擴展二進制圖像。正在用3x3結構元素執行兩次形態膨脹,結果元素與6x6結構元素相同?

cv::dilate(c_Proj, c_Proj, Mat(), Point(), 2); 

這基本上是擴大與3x3矩形結構元素的二進制圖像。從最後一個參數,你可以看到我進行2次迭代此操作,這相當於:

cv::dilate(c_Proj, c_Proj, Mat(), Point(), 1); 
cv::dilate(c_Proj, c_Proj, Mat(), Point(), 1); 

我的問題是這樣的: 而是進行兩次迭代的,如果我使用的6x6結構只執行一次迭代元素,就準確性和性能而言,這與上面的代碼等價嗎?它是否更快,因爲圖像只迭代一次?

回答

6

擴張用相同的內核可以用兩個卷積運算來表示:

("YourImage" convolve "DilationKernel") convolve "DilationKernel" 

由於卷積的特性,這種操作equivelant到:

"YourImage" convolve ("DilationKernel" convolve "DilationKernel") 

3×3內核的卷積本身會導致5x5矩陣,所以你的6x6假設是錯誤的。

在性能方面,有很多需要考慮的問題。在我以前的實習中,我們的目標是儘可能使用小內核,因爲更大內核的性能損失。經驗法則是小內核在映像上運行得更快,因爲只需使用CPU寄存器即可存儲和檢索它們,而無需訪問L1或L2高速緩存。另外如果你的內核適合寄存器,你可以很容易地使用SSE指令。

卷積的並行化是另一回事,我沒有太多關於它的實用信息。所以我不知道如果使用並行化實現,這個經驗事實仍然存在。

+0

謝謝你指出這個錯誤。我仍在尋找性能比較。我想我可能必須設計自己的方法來比較兩種操作 – masad

0

您必須自己衡量性能,但使用6x6元素進行擴張應該更快,這似乎合乎邏輯。 Wikipedia這是二元膨脹是聯想。這意味着如果一個3x3矩形擴大了另一個這樣的矩形給出一個6x6矩形,那麼實際上兩個3x3擴張相當於一個擴大6x6。

+2

爲什麼「這看起來合乎邏輯」?一個天真的實現將不得不看每個像素6 * 6鄰居,或2 * 3 * 3像素。 6 * 6> 2 * 3 * 3 – Niki

+0

@nikie,你是對的。雖然對於矩形結構元素,但可以使用前綴總和進行優化。我對圖像形態學中使用的算法不太熟悉。 –