python中opencv?Canny邊緣檢測
Canny邊緣檢測
Canny邊緣檢測是一種使用多級邊緣檢測算法檢測邊緣的方法。
OpenCV提供了函數(shù)cv2.Canny()實(shí)現(xiàn)Canny邊緣檢測。
Canny邊緣檢測基礎(chǔ)
Canny邊緣檢測分為如下幾個步驟:
- 去噪。噪聲會影響邊緣檢測的準(zhǔn)確性,因此首先要將噪聲過濾掉。
- 計算梯度的幅度與方向
- 非極大值抑制,即適當(dāng)?shù)刈屵吘?ldquo;變瘦”
- 確定邊緣。使用雙閾值算法確定最終的邊緣信息
高斯濾波去除圖像噪聲
圖像邊緣非常容易受到噪聲的干擾,因此為了避免檢測到錯誤的邊緣信息,通常需要對圖像進(jìn)行濾波以去除噪聲。
濾波的目的是平滑一些紋理較弱的非邊緣區(qū)域,以便得到更準(zhǔn)確的邊緣。在實(shí)際處理過程中,通常采用高斯濾波去除圖像中的噪聲。在濾波過程中,通過濾波器對像素點(diǎn)周圍的像素計算加權(quán)平均值,獲取最終濾波結(jié)果。對于高斯濾波器,越臨近中心的點(diǎn),權(quán)值越大。
濾波器的大小也是可變的,高斯核的大小對于邊緣檢測的效果具有很重要的作用。濾波器的核越大,邊緣信息對于噪聲的敏感度就越低。不過,核越大,邊緣檢測的定位錯誤也會隨之增加。通常來說,一個5×5的核能夠滿足大多數(shù)的情況。
計算梯度
關(guān)注梯度的方向,梯度的方向與邊緣的方向是垂直的。
邊緣檢測算子返回水平方向的Gx和垂直方向的Gy。
梯度的幅度G和方向Θ(用角度值表示)為:
atan2(·)表示具有兩個參數(shù)的arctan函數(shù)。
梯度的方向總是與邊緣垂直的,通常就近取值為水平(左、右)、垂直(上、下)、對角線(右上、左上、左下、右下)等8個不同的方向。
在計算梯度時,我們會得到梯度的幅度和角度(代表梯度的方向)兩個值。
梯度的表示法: 其中,每一個梯度包含幅度和角度兩個不同的值。為了方便觀察,這里使用了可視化表示方法。
左上角頂點(diǎn)的值“2↑”實(shí)際上表示的是一個二元數(shù)對“(2, 90)”,表示梯度的幅度為2,角度為90°。
非極大值抑制
在獲得了梯度的幅度和方向后,遍歷圖像中的像素點(diǎn),去除所有非邊緣的點(diǎn)。
在具體實(shí)現(xiàn)時,逐一遍歷像素點(diǎn),判斷當(dāng)前像素點(diǎn)是否是周圍像素點(diǎn)中具有相同梯度方向的最大值,并根據(jù)判斷結(jié)果決定是否抑制該點(diǎn)。
通過以上描述可知,該步驟是邊緣細(xì)化的過程。針對每一個像素點(diǎn):
- 如果該點(diǎn)是正/負(fù)梯度方向上的局部最大值,則保留該點(diǎn)。
- 如果不是,則抑制該點(diǎn)(歸零)。
(梯度方向垂直于邊緣)
“正/負(fù)梯度方向上”是指相反方向的梯度方向。
對于同一個方向的若干個邊緣點(diǎn),基本上僅保留了一個,因此實(shí)現(xiàn)了邊緣細(xì)化的目的。
應(yīng)用雙閾值確定邊緣
完成上述步驟后,圖像內(nèi)的強(qiáng)邊緣已經(jīng)在當(dāng)前獲取的邊緣圖像內(nèi)。但是,一些虛邊緣可能也在邊緣圖像內(nèi)。
這些虛邊緣可能是真實(shí)圖像產(chǎn)生的,也可能是由于噪聲所產(chǎn)生的。對于后者,必須將其剔除。設(shè)置兩個閾值,其中一個為高閾值maxVal,另一個為低閾值minVal。根據(jù)當(dāng)前邊緣像素的梯度值(指的是梯度幅度)與這兩個閾值之間的關(guān)系,判斷邊緣的屬性。
具體步驟為:
- 如果當(dāng)前邊緣像素的梯度值大于或等于maxVal,則將當(dāng)前邊緣像素標(biāo)記為強(qiáng)邊緣。
- 如果當(dāng)前邊緣像素的梯度值介于maxVal與minVal之間,則將當(dāng)前邊緣像素標(biāo)記為虛邊緣(需要保留)。
- 如果當(dāng)前邊緣像素的梯度值小于或等于minVal,則抑制當(dāng)前邊緣像素。
在上述過程中,我們得到了虛邊緣,需要對其做進(jìn)一步處理。一般通過判斷虛邊緣與強(qiáng)邊緣是否連接,來確定虛邊緣到底屬于哪種情況。
通常情況下,如果一個虛邊緣:
- 與強(qiáng)邊緣連接,則將該邊緣處理為邊緣。
- 與強(qiáng)邊緣無連接,則該邊緣為弱邊緣,將其抑制。
高閾值maxVal和低閾值minVal不是固定的,需要針對不同的圖像進(jìn)行定義。
Canny函數(shù)及使用
OpenCV提供了函數(shù)cv2.Canny()來實(shí)現(xiàn)Canny邊緣檢測,其語法形式如下:
edges = cv.Canny( image, threshold1, threshold2[, apertureSize[, L2gradient]])
- edges為計算得到的邊緣圖像。
- image為8位輸入圖像。
- threshold1表示處理過程中的第一個閾值。
- threshold2表示處理過程中的第二個閾值。
- apertureSize表示Sobel算子的孔徑大小。
- L2gradient為計算圖像梯度幅度(gradient magnitude)的標(biāo)識。其默認(rèn)值為False。如果為True,則使用更精確的L2范數(shù)進(jìn)行計算(即兩個方向的導(dǎo)數(shù)的平方和再開方),否則使用L1范數(shù)(直接將兩個方向?qū)?shù)的絕對值相加)。
**例子:**使用函數(shù)cv2.Canny()獲取圖像的邊緣,并嘗試使用不同大小的threshold1和threshold2,觀察獲取到的邊緣有何不同。
import cv2 o=cv2.imread("./img/hand1.png", cv2.IMREAD_GRAYSCALE) r1=cv2.Canny(o,128,200) r2=cv2.Canny(o,32,128) cv2.imshow("original", o) cv2.imshow("result1", r1) cv2.imshow("result2", r2) cv2.waitKey() cv2.destroyAllWindows()
當(dāng)函數(shù)cv2.Canny()的參數(shù)threshold1和threshold2的值較小時,能夠捕獲更多的邊緣信息。
到此這篇關(guān)于python中opencv Canny邊緣檢測的文章就介紹到這了,更多相關(guān)opencv Canny內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python Pandas數(shù)據(jù)分析之iloc和loc的用法詳解
Pandas 是一個開放源碼、BSD 許可的庫,提供高性能、易于使用的數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)分析工具,它是一個強(qiáng)大的分析結(jié)構(gòu)化數(shù)據(jù)的工具集,基礎(chǔ)是 Numpy2021-11-11Python實(shí)現(xiàn)保證只能運(yùn)行一個腳本實(shí)例
這篇文章主要介紹了Python實(shí)現(xiàn)保證只能運(yùn)行一個腳本實(shí)例,本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下2015-06-06Django表單提交后實(shí)現(xiàn)獲取相同name的不同value值
這篇文章主要介紹了Django表單提交后實(shí)現(xiàn)獲取相同name的不同value值,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-05-05淺談Python中的zip()與*zip()函數(shù)詳解
這篇文章主要介紹了淺談Python中的zip()與*zip()函數(shù)詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-02-02Python如何使用BeautifulSoup爬取網(wǎng)頁信息
這篇文章主要介紹了Python如何使用BeautifulSoup爬取網(wǎng)頁信息,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-11-11Python中文分詞工具之結(jié)巴分詞用法實(shí)例總結(jié)【經(jīng)典案例】
這篇文章主要介紹了Python中文分詞工具之結(jié)巴分詞用法,結(jié)合實(shí)例形式總結(jié)分析了Python針對中文文件的讀取與分詞操作過程中遇到的問題與解決方法,需要的朋友可以參考下2017-04-04python實(shí)現(xiàn)銀行管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)銀行管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-10-10xshell會話批量遷移到mobaxterm的工具(python小工具)
這篇文章主要介紹了xshell會話批量遷移到mobaxterm的工具,使用方法也超級簡單,本文通過python代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-12-12Python數(shù)據(jù)庫安裝及MySQL?Connector應(yīng)用教程
這篇文章主要為大家介紹了Python數(shù)據(jù)庫安裝及MySQL Connector應(yīng)用教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11