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函式的使用很簡單,只需指定最大和最小閾值即可。如下:
-
#coding=utf-8
-
import cv2
-
import numpy as np
-
img = cv2.imread("D:/lion.jpg", 0)
-
img = cv2.GaussianBlur(img,(3,3),0)
-
canny = cv2.Canny(img, 50, 150)
-
cv2.imshow('Canny', canny)
-
cv2.waitKey(0)
-
cv2.destroyAllWindows()
首先,由於Canny只能處理灰度圖,所以將讀取的影象轉成灰度圖。
用高斯平滑處理原影象降噪。
呼叫Canny函式,指定最大和最小閾值,其中apertureSize預設為3。
處理結果如下:
更多
這個程式只是靜態的,在github上有一個可以在執行時調整閾值大小的程式。其程式碼如下:
-
import cv2
-
import numpy as np
-
def CannyThreshold(lowThreshold):
-
detected_edges = cv2.GaussianBlur(gray,(3,3),0)
-
detected_edges = cv2.Canny(detected_edges,lowThreshold,lowThreshold*ratio,apertureSize = kernel_size)
-
dst = cv2.bitwise_and(img,img,mask = detected_edges) # just add some colours to edges from original image.
-
cv2.imshow('canny demo',dst)
-
lowThreshold = 0
-
max_lowThreshold = 100
-
ratio = 3
-
kernel_size = 3
-
img = cv2.imread('D:/lion.jpg')
-
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
-
cv2.namedWindow('canny demo')
-
cv2.createTrackbar('Min threshold','canny demo',lowThreshold, max_lowThreshold, CannyThreshold)
-
CannyThreshold(0) # initialization
-
if cv2.waitKey(0) == 27:
-
cv2.destroyAllWindows()
原地址在此,其中還有其他的初級影象處理的程式碼,大夥可以去看看。後續文章將介紹更多的OpenCV的函式使用,以及視訊的處理。
參考資料:
1、《Opencv2 Computer Vision Application Programming Cookbook》
2、《OpenCV References Manule》
如果覺得本文寫的還可以的話,請輕點“頂”,您的支援是我寫下去的動力之一。未完待續。。。如有錯誤請指正,本人會虛心接受並改正!謝謝!