2011-03-01 46 views
8

我想平滑二值化圖像的輪廓,並認爲侵蝕是最好的方式。我知道正常的工作方式是使用cvDilate(src,dst,0,iter);其中0是3x3矩陣。擴張/侵蝕修改內核選項

問題是3x3矩陣在我的圖像中造成深度侵蝕。我如何用2x2矩陣或任何小於默認3x3矩陣的東西來進行腐蝕。

回答

21

這裏有供您參考使用的結果不同的內核:

enter image description here

Saludos!

1

使用C API,您可以使用函數CreateStructuringElementEx()創建任何類型和大小的專用IplConvKernel對象。如果您使用C++ API(函數dilate()),則用於擴展的結構元素是任何您需要的矩陣(Mat)。

+0

在這個函數中,CreateStructuringElementEx,參數3和4(x_anchor和y_anchor)不知道什麼意思。它的內核默認偏移量。我把0和0,是否正確? – 2011-03-01 16:12:06

+0

這些參數定義了內核的主要像素,用於知道如何應用它。它通常在一個圓形或正方形的中心。它可能未被用於更多奇特的內核形式。 – 2011-03-01 16:16:17

3

如果您的目標是讓二值化圖像具有平滑邊緣,那麼如果您有原始圖像,則最好在執行二值化之前使用像cvSmooth()那樣的高斯模糊。

也就是說,你並不限於3x3內核。 cvDilate()需要CreateStructuringElementEx生成的IplConvKernel,您可以製作具有該功能的任何(矩形)形狀的結構元素。 但是,結構元素相對於必須具有整數座標的錨點起作用,所以如果使用2x2矩陣,則矩陣不能以像素爲中心。所以在大多數情況下,最好使用具有奇數行和列的結構元素。

你可以做的是創建一個3x3的結構元素,其中僅中心值和正上方的值,下,左和向右邊是1像這樣:

0 1 0 
1 1 1 
0 1 0 

,而不是默認:

1 1 1 
1 1 1 
1 1 1 

第一個內核將使一些稍微平滑的邊緣。

3

這裏有一個快速和骯髒的方法來告訴你,膨脹/腐蝕是否會爲你工作:

  • 上採樣圖像。
  • 侵蝕(擴張,打開,關閉,等等)可以用用最小的過濾器(通常爲3×3)
  • 縮減像素採樣返回到原始圖像尺寸
0

Errosion和擴張矩陣應該是奇數階

- 2×2的矩陣不能用於

卷積矩陣應該是順序1 * 1 3 * 3 5 * 5 7 * 7的。 ..但ODD

嘗試應用緊密 - 侵蝕,然後擴張圖像操作 - 使用cvMorpologyEx()函數

1

內核與所有1的是一個低通濾波器的卷積。膨脹濾波器用3x3區域中最暗的像素替換3X3區域中的每個像素。腐蝕過濾器用3x3區域中最輕的像素替換3X3區域中的每個像素。那就是如果你的背景很亮,而你的前景物體很暗。如果你翻轉你的背景和前景,那麼你也會翻轉你的擴張和侵蝕過濾器。

此外,如果您想執行「打開」操作,則執行侵蝕,然後進行擴張。相反,「密切」手術是一種擴張,然後是侵蝕。打開傾向於去除孤立的像素塊,並關閉往往填補空洞。