OpenCV 4.12.0
開源計算機視覺
載入中...
搜尋中...
無匹配項
使用形態學操作提取水平和垂直線

上一個教程: 擊中或擊不中變換
下一個教程: 影像金字塔

原始作者Theodore Tsesmelis
相容性OpenCV >= 3.0

目標

在本教程中,您將學習如何

  • 應用兩種非常常見的形態學運算子(即膨脹和腐蝕),並建立自定義核,以提取水平和垂直軸上的直線。為此,您將使用以下OpenCV函式

    • erode()
    • dilate()
    • getStructuringElement()

    在一個示例中,您的目標是從樂譜中提取音符。

理論

形態學操作

形態學是一組影像處理操作,它基於預定義的結構元素(也稱為核)處理影像。輸出影像中每個畫素的值是基於輸入影像中相應畫素與其鄰域的比較。透過選擇核的大小和形狀,您可以構建對輸入影像中特定形狀敏感的形態學操作。

最基本的兩種形態學操作是膨脹和腐蝕。膨脹在影像中物件的邊界上新增畫素,而腐蝕則恰好相反。新增或移除的畫素數量分別取決於用於處理影像的結構元素的大小和形狀。通常,這兩種操作遵循的規則如下:

  • 膨脹:輸出畫素的值是落入結構元素大小和形狀範圍內的所有畫素的最大值。例如,在二值影像中,如果落入核範圍內的任何輸入影像畫素被設定為值1,則輸出影像的相應畫素也將被設定為1。後者適用於任何型別的影像(例如灰度、BGR等)。
二值影像上的膨脹
灰度影像上的膨脹
  • 腐蝕:腐蝕操作則相反。輸出畫素的值是落入結構元素大小和形狀範圍內的所有畫素的最小值。請看下面的示例圖:
二值影像上的腐蝕
灰度影像上的腐蝕

結構元素

如上所示,通常在任何形態學操作中,用於探測輸入影像的結構元素是最重要的部分。

結構元素是一個只包含0和1的矩陣,它可以是任意形狀和大小。通常它比被處理的影像小得多,而值為1的畫素定義了鄰域。結構元素的中心畫素,稱為原點,標識了目標畫素——即正在處理的畫素。

例如,下圖展示了一個7x7大小的菱形結構元素。

一個菱形結構元素及其原點

結構元素可以有許多常見的形狀和大小,例如線形、菱形、圓盤形、週期線形和圓形。您通常會選擇與輸入影像中要處理/提取的物件具有相同大小和形狀的結構元素。例如,要在影像中查詢線條,可以建立一個線性結構元素,稍後您將看到。

程式碼

本教程的程式碼如下所示。

解釋 / 結果

此處獲取影像。

載入影像

灰度化

灰度到二值影像

輸出影像

現在我們準備應用形態學操作,以提取水平和垂直線,從而將音符從樂譜中分離出來,但首先讓我們初始化為此目的將使用的輸出影像。

結構元素

正如我們在理論部分所闡述的,為了提取我們想要的物件,我們需要建立相應的結構元素。由於我們要提取水平線,為此目的的相應結構元素將具有以下形狀:

在原始碼中,這由以下程式碼片段表示:

對於垂直線,同樣適用,其相應的結構元素為:

同樣,這表示如下:

邊緣細化 / 結果

如您所見,我們已經接近目標了。然而,此時您會注意到音符的邊緣有些粗糙。因此,我們需要對邊緣進行細化以獲得更平滑的結果。