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


其中較大的閾值2用于檢測圖像中明顯的邊緣,但一般情況下檢測的效果不會那么完美,邊緣檢測出來是斷斷續(xù)續(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()

可以看到,在調(diào)整threshold1之后,檢測出的邊緣增多了。
sobel算子對檢測結(jié)果的影響
sobel默認的算子大小是3,擴大算子,會獲得更多的細節(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ù)對檢測結(jié)果的影響
L2gradient=True時,檢測出的邊緣減少了。
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é)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python的Flask框架標配模板引擎Jinja2的使用教程
Jinja2是Python世界的一款高人氣template engine,是許多開源Web框架的選擇,包括Flask這樣的明星級項目,這里我們就來共同學習Python的Flask框架標配模板引擎Jinja2的使用教程2016-07-07
Python Django 添加首頁尾頁上一頁下一頁代碼實例
這篇文章主要介紹了Python Django 添加首頁尾頁上一頁下一頁代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-08-08
對pandas進行數(shù)據(jù)預(yù)處理的實例講解
下面小編就為大家分享一篇對pandas進行數(shù)據(jù)預(yù)處理的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-04-04
Python爬蟲入門案例之爬取二手房源數(shù)據(jù)
讀萬卷書不如行萬里路,學的扎不扎實要通過實戰(zhàn)才能看出來,今天小編給大家?guī)硪环輕ython爬取二手房源信息的案例,可以用來直觀的了解房價行情,大家可以在過程中查缺補漏,看看自己掌握程度怎么樣2021-10-10
在Python中使用K-Means聚類和PCA主成分分析進行圖像壓縮
這篇文章主要介紹了在Python中使用K-Means聚類和PCA主成分分析進行圖像壓縮,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-04-04

