我想平滑二值化圖像的輪廓,並認爲侵蝕是最好的方式。我知道正常的工作方式是使用cvDilate(src,dst,0,iter);其中0是3x3矩陣。擴張/侵蝕修改內核選項
問題是3x3矩陣在我的圖像中造成深度侵蝕。我如何用2x2矩陣或任何小於默認3x3矩陣的東西來進行腐蝕。
我想平滑二值化圖像的輪廓,並認爲侵蝕是最好的方式。我知道正常的工作方式是使用cvDilate(src,dst,0,iter);其中0是3x3矩陣。擴張/侵蝕修改內核選項
問題是3x3矩陣在我的圖像中造成深度侵蝕。我如何用2x2矩陣或任何小於默認3x3矩陣的東西來進行腐蝕。
使用C API,您可以使用函數CreateStructuringElementEx()
創建任何類型和大小的專用IplConvKernel
對象。如果您使用C++ API(函數dilate()
),則用於擴展的結構元素是任何您需要的矩陣(Mat
)。
如果您的目標是讓二值化圖像具有平滑邊緣,那麼如果您有原始圖像,則最好在執行二值化之前使用像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
第一個內核將使一些稍微平滑的邊緣。
這裏有一個快速和骯髒的方法來告訴你,膨脹/腐蝕是否會爲你工作:
Errosion和擴張矩陣應該是奇數階
- 2×2的矩陣不能用於
卷積矩陣應該是順序1 * 1 3 * 3 5 * 5 7 * 7的。 ..但ODD
嘗試應用緊密 - 侵蝕,然後擴張圖像操作 - 使用cvMorpologyEx()函數
內核與所有1的是一個低通濾波器的卷積。膨脹濾波器用3x3區域中最暗的像素替換3X3區域中的每個像素。腐蝕過濾器用3x3區域中最輕的像素替換3X3區域中的每個像素。那就是如果你的背景很亮,而你的前景物體很暗。如果你翻轉你的背景和前景,那麼你也會翻轉你的擴張和侵蝕過濾器。
此外,如果您想執行「打開」操作,則執行侵蝕,然後進行擴張。相反,「密切」手術是一種擴張,然後是侵蝕。打開傾向於去除孤立的像素塊,並關閉往往填補空洞。
在這個函數中,CreateStructuringElementEx,參數3和4(x_anchor和y_anchor)不知道什麼意思。它的內核默認偏移量。我把0和0,是否正確? – 2011-03-01 16:12:06
這些參數定義了內核的主要像素,用於知道如何應用它。它通常在一個圓形或正方形的中心。它可能未被用於更多奇特的內核形式。 – 2011-03-01 16:16:17