1. 程式人生 > >Python-OpenCV教程 Canny邊緣檢測

Python-OpenCV教程 Canny邊緣檢測

本篇文章介紹如何用OpenCV-Python來使用Canny運算元。

提示:

  • 轉載請詳細註明原作者及出處,謝謝!
  • 本文介紹使用OpenCV-Python實現基本的濾波處理
  • 本文不介詳細的理論知識,讀者可從其他資料中獲取相應的背景知識。筆者推薦清華大學出版社的《影象處理與計算機視覺演算法及應用(第2版) 》。

原型

OpenCV-Python中Canny函式的原型為:

edge = cv2.Canny(image, threshold1, threshold2[, edges[, apertureSize[, L2gradient ]]]) 

必要引數:

  • 第一個引數是需要處理的原影象,該影象必須為單通道的灰度圖;
  • 第二個引數是閾值1;
  • 第三個引數是閾值2。

其中較大的閾值2用於檢測影象中明顯的邊緣,但一般情況下檢測的效果不會那麼完美,邊緣檢測出來是斷斷續續的。所以這時候用較小的第一個閾值用於將這些間斷的邊緣連線起來。

可選引數中apertureSize就是Sobel運算元的大小。而L2gradient引數是一個布林值,如果為真,則使用更精確的L2範數進行計算(即兩個方向的倒數的平方和再開放),否則使用L1範數(直接將兩個方向導數的絕對值相加)。

具體的演算法可參見清華大學出版社的《影象處理與計算機視覺演算法及應用(第2版) 》第二章,其中有Canny演算法的詳細描述及實現。

函式返回一副二值圖,其中包含檢測出的邊緣。

使用

Canny函式的使用很簡單,只需指定最大和最小閾值即可。如下:

  1. #coding=utf-8

  2. import cv2

  3. import numpy as np

  4. img = cv2.imread("D:/lion.jpg", 0)

  5. img = cv2.GaussianBlur(img,(3,3),0)

  6. canny = cv2.Canny(img, 50, 150)

  7. cv2.imshow('Canny', canny)

  8. cv2.waitKey(0)

  9. cv2.destroyAllWindows()

首先,由於Canny只能處理灰度圖,所以將讀取的影象轉成灰度圖。

用高斯平滑處理原影象降噪。

呼叫Canny函式,指定最大和最小閾值,其中apertureSize預設為3。

處理結果如下:

更多

這個程式只是靜態的,在github上有一個可以在執行時調整閾值大小的程式。其程式碼如下:

  1. import cv2

  2. import numpy as np

  3. def CannyThreshold(lowThreshold):

  4. detected_edges = cv2.GaussianBlur(gray,(3,3),0)

  5. detected_edges = cv2.Canny(detected_edges,lowThreshold,lowThreshold*ratio,apertureSize = kernel_size)

  6. dst = cv2.bitwise_and(img,img,mask = detected_edges) # just add some colours to edges from original image.

  7. cv2.imshow('canny demo',dst)

  8. lowThreshold = 0

  9. max_lowThreshold = 100

  10. ratio = 3

  11. kernel_size = 3

  12. img = cv2.imread('D:/lion.jpg')

  13. gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

  14. cv2.namedWindow('canny demo')

  15. cv2.createTrackbar('Min threshold','canny demo',lowThreshold, max_lowThreshold, CannyThreshold)

  16. CannyThreshold(0) # initialization

  17. if cv2.waitKey(0) == 27:

  18. cv2.destroyAllWindows()

原地址在此,其中還有其他的初級影象處理的程式碼,大夥可以去看看。後續文章將介紹更多的OpenCV的函式使用,以及視訊的處理。

參考資料:

1、《Opencv2 Computer Vision Application Programming Cookbook》

2、《OpenCV References Manule》

如果覺得本文寫的還可以的話,請輕點“頂”,您的支援是我寫下去的動力之一。未完待續。。。如有錯誤請指正,本人會虛心接受並改正!謝謝!