OpenCV Python - 邊緣檢測



這裡的邊緣指的是影像中物體的邊界。OpenCV 有一個 **cv2.Canny()** 函式,透過實現 Canny 演算法來識別影像中各種物體的邊緣。

Canny 邊緣檢測演算法是由 John Canny 開發的。根據該演算法,物體的邊緣是透過執行以下步驟確定的:

第一步是減少影像中的噪聲畫素。這是透過應用 5X5 高斯濾波器來實現的。

第二步涉及找到影像的強度梯度。第一階段的平滑影像透過應用 Sobel 運算元進行濾波,以獲得水平和垂直方向的一階導數(Gx 和 Gy)。

均方根值給出邊緣梯度,導數的反正切比給出邊緣的方向。

$$\mathrm{邊緣梯度G\:=\:\sqrt{G_x^2+G_y^2}}$$

$$\mathrm{角度\:\theta\:=\:\tan^{-1}(\frac{G_{y}}{G_{x}})}$$

獲得梯度幅值和方向後,對影像進行全掃描以去除可能不構成邊緣的任何不需要的畫素。

下一步是使用 minval 和 maxval 閾值執行滯後閾值化。小於 minval 和 maxval 的強度梯度是非邊緣,因此被丟棄。介於兩者之間的畫素根據其連通性被視為邊緣點或非邊緣點。

所有這些步驟都由 OpenCV 的 cv2.Canny() 函式執行,該函式需要輸入影像陣列以及 minval 和 maxval 引數。

示例

以下是 Canny 邊緣檢測的示例。相應的程式如下所示:

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
img = cv.imread('lena.jpg', 0)
edges = cv.Canny(img,100,200)
plt.subplot(121),plt.imshow(img,cmap = 'gray')
plt.title('Original Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(edges,cmap = 'gray')
plt.title('Edges of original Image'), plt.xticks([]), plt.yticks([])
plt.show()

輸出

Canny Edge
廣告

© . All rights reserved.