您好,登錄后才能下訂單哦!
這篇文章主要介紹“Python如何實現Opencv cv2.Canny()邊緣檢測”,在日常操作中,相信很多人在Python如何實現Opencv cv2.Canny()邊緣檢測問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Python如何實現Opencv cv2.Canny()邊緣檢測”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
Canny邊緣檢測是一種流行的邊緣檢測算法。它是由約翰F開發的,是一個多階段的算法;
Canny邊緣檢測大致包含4個步驟:
降噪(使用高斯濾波去除高頻噪聲);
計算邊緣梯度和方向(SobelX、SobleY核在水平方向和垂直方向對平滑后的圖像進行濾波,找到每個像素的邊緣梯度和方向);
非最大抑制(在得到梯度大小和方向后,對圖像進行全掃描,去除任何不需要的像素,這些像素可能不構成邊緣。檢查像素是否在其梯度方向的鄰域中是局部最大值。否則,將被抑制(歸零)。簡而言之,得到的結果是一個具有“細邊”的二值圖像。
滯后閾值(決定哪些邊是真正的邊,哪些不是。為此需要兩個閾值minVal和maxVal,任何強度梯度大于maxVal的邊都肯定是邊,小于minVal的邊肯定是非邊,因此丟棄。位于這兩個閾值之間的邊根據其連通性被分類為邊或非邊。如果它們連接到“確定邊緣”像素,則它們被視為邊緣的一部分。否則,它們也會被丟棄。)
選擇滯后閾值minVal和maxVal是得到正確結果的關鍵。
原始圖 VS Canny檢測效果圖如下:
# Canny邊緣檢測是一種流行的邊緣檢測算法。它是由約翰F開發的,是一個多階段的算法; # Canny邊緣檢測大致包含4個步驟: # # 1.降噪(使用高斯濾波去除高頻噪聲); # 2. 計算邊緣梯度和方向(SobelX、SobleY核在水平方向和垂直方向對平滑后的圖像進行濾波,找到每個像素的邊緣梯度和方向); # 3. 非最大抑制(在得到梯度大小和方向后,對圖像進行全掃描,去除任何不需要的像素,這些像素可能不構成邊緣。檢查像素是否在其梯度方向的鄰域中是局部最大值。否則,將被抑制(歸零)。簡而言之,得到的結果是一個具有“細邊”的二值圖像。 # 4. 滯后閾值(決定哪些邊是真正的邊,哪些不是。為此需要兩個閾值minVal和maxVal,任何強度梯度大于maxVal的邊都肯定是邊,小于minVal的邊肯定是非邊,因此丟棄。位于這兩個閾值之間的邊根據其連通性被分類為邊或非邊。如果它們連接到“確定邊緣”像素,則它們被視為邊緣的一部分。否則,它們也會被丟棄。) # # 選擇滯后閾值minVal和maxVal是得到正確結果的關鍵。 import cv2 from matplotlib import pyplot as plt img = cv2.imread("zly.jpg", 0) edges = cv2.Canny(img, 80, 200) plt.subplot(121), plt.imshow(img, cmap="gray") plt.title("Original Image"), plt.xticks([]), plt.yticks([]) plt.subplot(122), plt.imshow(edges, cmap="gray") plt.title("Edge Image"), plt.xticks([]), plt.yticks([]) plt.show()
參考 https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_imgproc/py_canny/py_canny.html#canny
步驟:
彩色圖像轉換為灰度圖像(以灰度圖或者單通道圖讀入)
對圖像進行高斯模糊(去噪)
計算圖像梯度,根據梯度計算圖像邊緣幅值與角度
沿梯度方向進行非極大值抑制(邊緣細化)
雙閾值邊緣連接處理
二值化圖像輸出結果
""" cv2.Canny(image, # 輸入原圖(必須為單通道圖) threshold1, threshold2, # 較大的閾值2用于檢測圖像中明顯的邊緣 [, edges[, apertureSize[, # apertureSize:Sobel算子的大小 L2gradient ]]]) # 參數(布爾值): true: 使用更精確的L2范數進行計算(即兩個方向的倒數的平方和再開放), false:使用L1范數(直接將兩個方向導數的絕對值相加)。 """ import cv2 import numpy as np original_img = cv2.imread("qingwen.png", 0) # canny(): 邊緣檢測 img1 = cv2.GaussianBlur(original_img,(3,3),0) canny = cv2.Canny(img1, 50, 150) # 形態學:邊緣檢測 _,Thr_img = cv2.threshold(original_img,210,255,cv2.THRESH_BINARY)#設定紅色通道閾值210(閾值影響梯度運算效果) kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(5,5)) #定義矩形結構元素 gradient = cv2.morphologyEx(Thr_img, cv2.MORPH_GRADIENT, kernel) #梯度 cv2.imshow("original_img", original_img) cv2.imshow("gradient", gradient) cv2.imshow("Canny", canny) cv2.waitKey(0) cv2.destroyAllWindows()
可調整閾值大小的程序
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("qingwen.png") 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()
到此,關于“Python如何實現Opencv cv2.Canny()邊緣檢測”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。