OpenCV-Python-邊緣檢測


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/

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM