Canny邊緣檢測方法被譽為邊緣檢測的最優方法。
import cv2 import numpy as np
img = cv2.imread('handwriting.jpg', 0) edges = cv2.Canny(img, 30, 70) # canny邊緣檢測 cv2.imshow('canny', np.hstack((img, edges))) cv2.waitKey(0)
cv2.Canny()進行邊緣檢測,參數2、參數3表示最低和最高閾值。
Canny邊緣檢測
具體步驟如下:
1. 使用5x5高斯濾波消除噪聲:
邊緣檢測本身屬於銳化操作,對噪聲比較敏感,所以需要進行平滑處理。高斯濾波的具體內容參考前篇:OpenCV-Python教程9-平滑圖像
2. 計算圖像梯度的方向:
首先使用Sobel算子計算兩個方向上的梯度Gx和Gy,然后算出梯度的方向:
保留這四個方向上的梯度:0°、45°、90°、135°
3. 取局部最大值:
在四個角度方向上取局部最大值
4. 滯后閾值
經過前面三步,剩下0和可能的邊緣梯度值。通過設定兩個閾值來篩選閾值:
- 像素點的值大於最高閾值,那肯定是邊緣(上圖A)
- 像素值小於最低閾值,那肯定不是邊緣
- 像素值介於兩者之間,如果高於最高閾值的點連接,也算邊緣。所以C算,B不算
Canny推薦的高低閾值比在 2 : 1 到 3 : 1 之間
先閾值分割后檢測
很多情況下,先閾值分割后再檢測邊緣,效果會更好:
# 先閾值分割后檢測 _, thresh = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU) edges = cv2.Canny(thresh, 30, 70) cv2.imshow('canny', np.hstack((img, thresh, edges))) cv2.waitKey(0)
參考地址:http://ex2tron.wang/opencv-python-edge-detection/