Python實(shí)現(xiàn)Opencv cv2.Canny()邊緣檢測(cè)
這篇博客將介紹Canny邊緣檢測(cè)的概念,并利用cv2.Canny()實(shí)現(xiàn)邊緣檢測(cè);
- Canny邊緣檢測(cè)是一種流行的邊緣檢測(cè)算法。它是由約翰F開(kāi)發(fā)的,是一個(gè)多階段的算法;
- Canny邊緣檢測(cè)大致包含4個(gè)步驟:
- 降噪(使用高斯濾波去除高頻噪聲);
- 計(jì)算邊緣梯度和方向(SobelX、SobleY核在水平方向和垂直方向?qū)ζ交蟮膱D像進(jìn)行濾波,找到每個(gè)像素的邊緣梯度和方向);
- 非最大抑制(在得到梯度大小和方向后,對(duì)圖像進(jìn)行全掃描,去除任何不需要的像素,這些像素可能不構(gòu)成邊緣。檢查像素是否在其梯度方向的鄰域中是局部最大值。否則,將被抑制(歸零)。簡(jiǎn)而言之,得到的結(jié)果是一個(gè)具有“細(xì)邊”的二值圖像。
- 滯后閾值(決定哪些邊是真正的邊,哪些不是。為此需要兩個(gè)閾值minVal和maxVal,任何強(qiáng)度梯度大于maxVal的邊都肯定是邊,小于minVal的邊肯定是非邊,因此丟棄。位于這兩個(gè)閾值之間的邊根據(jù)其連通性被分類為邊或非邊。如果它們連接到“確定邊緣”像素,則它們被視為邊緣的一部分。否則,它們也會(huì)被丟棄。)
選擇滯后閾值minVal和maxVal是得到正確結(jié)果的關(guān)鍵。
1. 效果圖
原始圖 VS Canny檢測(cè)效果圖如下:
2. 源碼
# Canny邊緣檢測(cè)是一種流行的邊緣檢測(cè)算法。它是由約翰F開(kāi)發(fā)的,是一個(gè)多階段的算法; # Canny邊緣檢測(cè)大致包含4個(gè)步驟: # # 1.降噪(使用高斯濾波去除高頻噪聲); # 2. 計(jì)算邊緣梯度和方向(SobelX、SobleY核在水平方向和垂直方向?qū)ζ交蟮膱D像進(jìn)行濾波,找到每個(gè)像素的邊緣梯度和方向); # 3. 非最大抑制(在得到梯度大小和方向后,對(duì)圖像進(jìn)行全掃描,去除任何不需要的像素,這些像素可能不構(gòu)成邊緣。檢查像素是否在其梯度方向的鄰域中是局部最大值。否則,將被抑制(歸零)。簡(jiǎn)而言之,得到的結(jié)果是一個(gè)具有“細(xì)邊”的二值圖像。 # 4. 滯后閾值(決定哪些邊是真正的邊,哪些不是。為此需要兩個(gè)閾值minVal和maxVal,任何強(qiáng)度梯度大于maxVal的邊都肯定是邊,小于minVal的邊肯定是非邊,因此丟棄。位于這兩個(gè)閾值之間的邊根據(jù)其連通性被分類為邊或非邊。如果它們連接到“確定邊緣”像素,則它們被視為邊緣的一部分。否則,它們也會(huì)被丟棄。) # # 選擇滯后閾值minVal和maxVal是得到正確結(jié)果的關(guān)鍵。 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
補(bǔ)充:OpenCV-Python 中 Canny() 參數(shù)
步驟:
- 彩色圖像轉(zhuǎn)換為灰度圖像(以灰度圖或者單通道圖讀入)
- 對(duì)圖像進(jìn)行高斯模糊(去噪)
- 計(jì)算圖像梯度,根據(jù)梯度計(jì)算圖像邊緣幅值與角度
- 沿梯度方向進(jìn)行非極大值抑制(邊緣細(xì)化)
- 雙閾值邊緣連接處理
- 二值化圖像輸出結(jié)果
""" cv2.Canny(image, # 輸入原圖(必須為單通道圖) threshold1, threshold2, # 較大的閾值2用于檢測(cè)圖像中明顯的邊緣 [, edges[, apertureSize[, # apertureSize:Sobel算子的大小 L2gradient ]]]) # 參數(shù)(布爾值): true: 使用更精確的L2范數(shù)進(jìn)行計(jì)算(即兩個(gè)方向的倒數(shù)的平方和再開(kāi)放), false:使用L1范數(shù)(直接將兩個(gè)方向?qū)?shù)的絕對(duì)值相加)。 """ import cv2 import numpy as np original_img = cv2.imread("qingwen.png", 0) # canny(): 邊緣檢測(cè) img1 = cv2.GaussianBlur(original_img,(3,3),0) canny = cv2.Canny(img1, 50, 150) # 形態(tài)學(xué):邊緣檢測(cè) _,Thr_img = cv2.threshold(original_img,210,255,cv2.THRESH_BINARY)#設(shè)定紅色通道閾值210(閾值影響梯度運(yùn)算效果) kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(5,5)) #定義矩形結(jié)構(gòu)元素 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()
可調(diào)整閾值大小的程序
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()
到此這篇關(guān)于Python實(shí)現(xiàn)Opencv cv2.Canny()邊緣檢測(cè)的文章就介紹到這了,更多相關(guān)Opencv cv2.Canny()邊緣檢測(cè)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python實(shí)現(xiàn)mysql的讀寫分離及負(fù)載均衡
這篇文章主要介紹了python實(shí)現(xiàn)mysql的讀寫分離及負(fù)載均衡 ,需要的朋友可以參考下2018-02-02python+openCV利用攝像頭實(shí)現(xiàn)人員活動(dòng)檢測(cè)
這篇文章主要為大家詳細(xì)介紹了python+openCV利用攝像頭實(shí)現(xiàn)人員活動(dòng)檢測(cè),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-06-06Django實(shí)現(xiàn)發(fā)送郵件找回密碼功能
在各大網(wǎng)站上,一定都遇到過(guò)找回密碼的問(wèn)題,通常采用的方式是通過(guò)發(fā)送帶有驗(yàn)證碼的郵件進(jìn)行身份驗(yàn)證,本文將介紹通過(guò)Django實(shí)現(xiàn)郵件找回密碼功能,需要的朋友可以參考下2019-08-08詳解如何使用pandas進(jìn)行時(shí)間序列數(shù)據(jù)的周期轉(zhuǎn)換
時(shí)間序列數(shù)據(jù)是數(shù)據(jù)分析中經(jīng)常遇到的類型,為了更多的挖掘出數(shù)據(jù)內(nèi)部的信息,我們常常依據(jù)原始數(shù)據(jù)中的時(shí)間周期,將其轉(zhuǎn)換成不同跨度的周期,下面以模擬的K線數(shù)據(jù)為例,演示如何使用pandas來(lái)進(jìn)行周期轉(zhuǎn)換,感興趣的朋友可以參考下2024-05-05基于循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)的古詩(shī)生成器
這篇文章主要為大家詳細(xì)介紹了基于循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)的古詩(shī)生成器,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-03-03Tensorflow 同時(shí)載入多個(gè)模型的實(shí)例講解
今天小編就為大家分享一篇Tensorflow 同時(shí)載入多個(gè)模型的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-07-07對(duì)PyQt5的輸入對(duì)話框使用(QInputDialog)詳解
今天小編就為大家分享一篇對(duì)PyQt5的輸入對(duì)話框使用(QInputDialog)詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-06-06Python 新建文件夾與復(fù)制文件夾內(nèi)所有內(nèi)容的方法
今天小編就為大家分享一篇Python 新建文件夾與復(fù)制文件夾內(nèi)所有內(nèi)容的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-10-10基于Python創(chuàng)建可定制的HTTP服務(wù)器
這篇文章主要為大家演示一下如何使用?http.server?模塊來(lái)實(shí)現(xiàn)一個(gè)能夠發(fā)布網(wǎng)頁(yè)的應(yīng)用服務(wù)器,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2023-05-05