天天看點

OpenCV系列 | 邊緣檢測(Canny)

OpenCV 提供了許多邊緣檢測濾波函數,包括 Laplacian()、Sobel()、Scharr() 等。這些濾波函數都會将非邊緣區域轉為黑色,将邊緣區域轉為白色或其他飽和的顔色。但是這些函數都很容易将噪聲錯誤地識别為邊緣。

是以為了緩解将噪聲錯誤地識别為邊緣這個問題,可以在找到邊緣之前對圖像進行模糊處理。OpenCV 也提供了許多模糊濾波函數,包括 blur() (簡單算數平均)、medianBlur()、GaussianBlur() 等。

而本文主要講述的 Canny 邊緣檢測算法則是使用的高斯濾波器進行去噪,然後再計算梯度,在邊緣上使用 NMS ,之後在檢測到的邊緣使用雙門檻值去除假陽性,最後還會分析所有的邊緣及其之間的連接配接,以保證真正的邊緣并消除不明顯的邊緣。

以一張青蛙圖檔為例,示範代碼的運作過程:

OpenCV系列 | 邊緣檢測(Canny)
frog_gray = cv2.imread('frog.png',cv2.IMREAD_GRAYSCALE)
median_intensity = np.median(frog_gray)
lower_threshold = int(max(0,(1.0-0.33)*median_intensity))
upper_threshold = int(min(255,(1.0+0.33)*median_intensity))
frog_Canny = cv2.Canny(frog_gray,lower_threshold,upper_threshold)
plt.imshow(frog_Canny,cmap='gray')
plt.show()
           
OpenCV系列 | 邊緣檢測(Canny)