OpenCV 4.12.0
開源計算機視覺
載入中...
搜尋中...
無匹配項
拉普拉斯運算元

上一個教程: Sobel 導數
下一個教程: Canny 邊緣檢測器

原始作者Ana Huamán
相容性OpenCV >= 3.0

目標

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

  • 使用 OpenCV 函式 Laplacian() 實現 *拉普拉斯運算元* 的離散模擬。

理論

  1. 在上一教程中,我們學習瞭如何使用 *Sobel 運算元*。其原理是,在邊緣區域,畫素強度會顯示出“跳躍”或劇烈變化。獲取強度的第一個導數時,我們觀察到邊緣的特徵是出現最大值,如下圖所示
  1. 那麼……如果我們取二階導數會發生什麼呢?

您會發現二階導數為零!因此,我們也可以使用此標準來嘗試檢測影像中的邊緣。但是,請注意零點不僅會出現在邊緣(它們實際上也可能出現在其他無意義的位置);這可以透過在需要時應用濾波來解決。

拉普拉斯運算元

  1. 從上面的解釋中,我們可以推斷出二階導數可以用於 *檢測邊緣*。由於影像是“2D”的,我們需要在兩個維度上取導數。在這裡,拉普拉斯運算元就派上用場了。
  2. 拉普拉斯運算元 定義為

    \[Laplace(f) = \dfrac{\partial^{2} f}{\partial x^{2}} + \dfrac{\partial^{2} f}{\partial y^{2}}\]

  3. 拉普拉斯運算元在 OpenCV 中透過函式 Laplacian() 實現。事實上,由於拉普拉斯運算元使用了影像的梯度,它在內部呼叫 *Sobel* 運算元來執行其計算。

程式碼

  1. 此程式的作用是什麼?
    • 載入影像
    • 透過應用高斯模糊來去除噪聲,然後將原始影像轉換為灰度圖
    • 將拉普拉斯運算元應用於灰度影像並存儲輸出影像
    • 在視窗中顯示結果

解釋

宣告變數

載入源影像

降噪

灰度化

拉普拉斯運算元

  • 引數為
    • src_gray:輸入影像。
    • dst: 目標(輸出)影像
    • ddepth:目標影像的深度。由於我們的輸入是 CV_8U,我們將 ddepth 定義為 CV_16S 以避免溢位。
    • kernel_size:內部應用的 Sobel 運算元的核大小。在此示例中我們使用 3。
    • scaledeltaBORDER_DEFAULT:我們保留其預設值。

將輸出轉換為 CV_8U 影像

顯示結果

結果

  1. 編譯上述程式碼後,我們可以透過提供影像路徑作為引數來執行它。例如,使用以下輸入:
  1. 我們得到以下結果。請注意,樹木和奶牛的輪廓近似清晰(除了強度非常相似的區域,例如奶牛頭部周圍)。此外,請注意樹木後面(右側)房屋的屋頂被顯著標記。這是因為該區域的對比度較高。