Python如何使用cv2.canny進(jìn)行圖像邊緣檢測(cè)
使用cv2.canny進(jìn)行圖像邊緣檢測(cè)
CV2提供了提取圖像邊緣的函數(shù)canny。
其算法思想如下:
- 1.使用高斯模糊,去除噪音點(diǎn)(cv2.GaussianBlur)
- 2.灰度轉(zhuǎn)換(cv2.cvtColor)
- 3.使用sobel算子,計(jì)算出每個(gè)點(diǎn)的梯度大小和梯度方向
- 4.使用非極大值抑制(只有最大的保留),消除邊緣檢測(cè)帶來的雜散效應(yīng)
- 5.應(yīng)用雙閾值,來確定真實(shí)和潛在的邊緣
- 6.通過抑制弱邊緣來完成最終的邊緣檢測(cè)
Canny函數(shù)的定義如下:
edge = cv2.Canny(image, threshold1, threshold2[, edges[, apertureSize[, L2gradient ]]])
參數(shù)含義如下:
image:要檢測(cè)的圖像threshold1:閾值1(最小值)threshold2:閾值2(最大值),使用此參數(shù)進(jìn)行明顯的邊緣檢測(cè)edges:圖像邊緣信息apertureSize:sobel算子(卷積核)大小L2gradient:布爾值。True:使用更精確的L2范數(shù)進(jìn)行計(jì)算(即兩個(gè)方向的導(dǎo)數(shù)的平方和再開方)False:使用L1范數(shù)(直接將兩個(gè)方向?qū)?shù)的絕對(duì)值相加)


其中較大的閾值2用于檢測(cè)圖像中明顯的邊緣,但一般情況下檢測(cè)的效果不會(huì)那么完美,邊緣檢測(cè)出來是斷斷續(xù)續(xù)的。所以這時(shí)候用較小的第一個(gè)閾值用于將這些間斷的邊緣連接起來。
閾值對(duì)檢測(cè)結(jié)果的影響
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('d:\\girl.png')
edges = cv2.Canny(img,100,200,apertureSize=3)
edges2 = cv2.Canny(img,100,200,apertureSize=5)
plt.subplot(131),plt.imshow(img,cmap = 'gray')
plt.title('Original Image'), plt.xticks([]), plt.yticks([])
plt.subplot(132),plt.imshow(edges,cmap = 'gray')
plt.title('Edge Image1'), plt.xticks([]), plt.yticks([])
plt.subplot(133),plt.imshow(edges2,cmap = 'gray')
plt.title('Edge Image2'), plt.xticks([]), plt.yticks([])
plt.show()

可以看到,在調(diào)整threshold1之后,檢測(cè)出的邊緣增多了。
sobel算子對(duì)檢測(cè)結(jié)果的影響
sobel默認(rèn)的算子大小是3,擴(kuò)大算子,會(huì)獲得更多的細(xì)節(jié),但是也更能提取圖像了。
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('d:\\girl.png')
edges = cv2.Canny(img,100,200,apertureSize=3)
edges2 = cv2.Canny(img,100,200,apertureSize=5)
plt.subplot(131),plt.imshow(img,cmap = 'gray')
plt.title('Original Image'), plt.xticks([]), plt.yticks([])
plt.subplot(132),plt.imshow(edges,cmap = 'gray')
plt.title('Edge Image1'), plt.xticks([]), plt.yticks([])
plt.subplot(133),plt.imshow(edges2,cmap = 'gray')
plt.title('Edge Image2'), plt.xticks([]), plt.yticks([])
plt.show()

范數(shù)對(duì)檢測(cè)結(jié)果的影響
L2gradient=True時(shí),檢測(cè)出的邊緣減少了。
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('d:\\girl.png')
edges = cv2.Canny(img,100,200,L2gradient=False)
edges2 = cv2.Canny(img,100,200,L2gradient=True)
plt.subplot(131),plt.imshow(img,cmap = 'gray')
plt.title('Original Image'), plt.xticks([]), plt.yticks([])
plt.subplot(132),plt.imshow(edges,cmap = 'gray')
plt.title('Edge Image1'), plt.xticks([]), plt.yticks([])
plt.subplot(133),plt.imshow(edges2,cmap = 'gray')
plt.title('Edge Image2'), plt.xticks([]), plt.yticks([])
plt.show()

總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python利用PyQt5制作一個(gè)獲取網(wǎng)絡(luò)實(shí)時(shí)NBA數(shù)據(jù)并播報(bào)的GUI程序
現(xiàn)在NBA聯(lián)賽也進(jìn)行到半決賽了,我們?cè)趺礃硬拍芤愿斓姆椒ǐ@取NBA的數(shù)據(jù)呢?這里我們就自己來做一個(gè)數(shù)據(jù)播報(bào)的程序,需要的朋友可以參考下2021-06-06
Python基礎(chǔ)語法之變量與數(shù)據(jù)類型詳解
這篇文章主要為大家詳細(xì)介紹了Python基礎(chǔ)語法中變量與數(shù)據(jù)類型的用法,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Python有一定的幫助,感興趣的可以了解一下2022-07-07
對(duì)python中的pop函數(shù)和append函數(shù)詳解
今天小編就為大家分享一篇對(duì)python中的pop函數(shù)和append函數(shù)詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-05-05
python+pyqt5實(shí)現(xiàn)KFC點(diǎn)餐收銀系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了python+pyqt5實(shí)現(xiàn)KFC點(diǎn)餐收銀系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01
Python Dict 到 Dataclass實(shí)現(xiàn)高效數(shù)據(jù)訪問與管理的兩種方式(推薦)
本文介紹了Python中的字典和DataClass兩種數(shù)據(jù)結(jié)構(gòu),并探討了如何將字典轉(zhuǎn)換為DataClass,字典適用于鍵值對(duì)存儲(chǔ),感興趣的朋友一起看看吧2024-12-12
python爬蟲模擬瀏覽器訪問-User-Agent過程解析
這篇文章主要介紹了python爬蟲模擬瀏覽器訪問-User-Agent過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12
Python開發(fā)技巧之海象運(yùn)算符的三種運(yùn)用方式
這篇文章主要介紹了Python開發(fā)技巧之海象運(yùn)算符的三種運(yùn)用方式,海象運(yùn)算符是在 PEP 572 被提出的,直到 3.8 版本合入發(fā)布,感興趣的同學(xué)可以參考學(xué)習(xí)下2021-10-10

