最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python如何使用cv2.canny進行圖像邊緣檢測

 更新時間:2023年01月28日 15:18:55   作者:風(fēng)華明遠  
這篇文章主要介紹了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ù)進行計算(即兩個方向的導(dǎo)數(shù)的平方和再開方)
  • False:使用L1范數(shù)(直接將兩個方向?qū)?shù)的絕對值相加)

L2gradie=True使用的公式

其中較大的閾值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)文章

最新評論

垣曲县| 平塘县| 聊城市| 遵义县| 聂拉木县| 东方市| 罗定市| 资溪县| 黑龙江省| 宜兰市| 七台河市| 宁强县| 朔州市| 密云县| 建昌县| 诸暨市| 普陀区| 晋城| 桦甸市| 靖安县| 宁陵县| 新化县| 台州市| 林西县| 乐都县| 兰考县| 隆回县| 涞源县| 正安县| 嫩江县| 贵德县| 义马市| 华亭县| 华容县| 若羌县| 陆河县| 循化| 栾川县| 石泉县| 依兰县| 永康市|