一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術(shù)及教程分享平臺!
分類導(dǎo)航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務(wù)器之家 - 腳本之家 - Python - Python使用Opencv實現(xiàn)邊緣檢測以及輪廓檢測的實現(xiàn)

Python使用Opencv實現(xiàn)邊緣檢測以及輪廓檢測的實現(xiàn)

2021-08-20 00:25Xy-Huang Python

這篇文章主要介紹了Python使用Opencv實現(xiàn)邊緣檢測以及輪廓檢測的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

邊緣檢測

canny邊緣檢測器是一種被廣泛使用的算法,并被認(rèn)為是邊緣檢測最優(yōu)的算法,該方法使用了比高斯差分算法更復(fù)雜的技巧,如多向灰度梯度和滯后閾值化。

canny邊緣檢測器算法基本步驟:

  • 平滑圖像:通過使用合適的模糊半徑執(zhí)行高斯模糊來減少圖像內(nèi)的噪聲。
  • 計算圖像的梯度:這里計算圖像的梯度,并將梯度分類為垂直、水平和斜對角。這一步的輸出用于在下一步中計算真正的邊緣。
  • 非最大值抑制:利用上一步計算出來的梯度方向,檢測某一像素在梯度的正方向和負(fù)方向上是否是局部最大值,如果是,則抑制該像素(像素不屬于邊緣)。這是一種邊緣細(xì)化技術(shù),用最急劇的變換選出邊緣點。
  • 用滯后閾值化選擇邊緣:最后一步,檢查某一條邊緣是否明顯到足以作為最終輸出,最后去除所有不明顯的邊緣。

opencv使用canny邊緣檢測相對簡單,代碼如下:

?
1
2
3
4
5
6
7
8
import cv2
import numpy as np
 
img = cv2.imread("hammer.jpg", 0)
cv2.imwrite("canny.jpg", cv2.canny(img, 200, 300))
cv2.imshow("canny", cv2.imread("canny.jpg"))
cv2.waitkey()
cv2.destroyallwindows()

運行結(jié)果:

Python使用Opencv實現(xiàn)邊緣檢測以及輪廓檢測的實現(xiàn)

canny函數(shù)的原型為

?
1
cv2.canny(image, threshold1, threshold2[, edges[, aperturesize[, l2gradient ]]])

必要參數(shù):
第一個參數(shù)是需要處理的原圖像,該圖像必須為單通道的灰度圖;
第二個參數(shù)是滯后閾值1;
第三個參數(shù)是滯后閾值2。

輪廓檢測

輪廓檢測主要由cv2.findcontours函數(shù)實現(xiàn)的。
函數(shù)的原型為

?
1
cv2.findcontours(image, mode, method[, contours[, hierarchy[, offset ]]])

函數(shù)參數(shù)
第一個參數(shù)是尋找輪廓的圖像;

第二個參數(shù)表示輪廓的檢索模式,有四種(本文介紹的都是新的cv2接口):

  • cv2.retr_external表示只檢測外輪廓 。
  • cv2.retr_list檢測的輪廓不建立等級關(guān)系。
  • cv2.retr_ccomp建立兩個等級的輪廓,上面的一層為外邊界,里面的一層為內(nèi)孔的邊界信息。如果內(nèi)孔內(nèi)還有一個連通物體,這個物體的邊界也在頂層。
  • cv2.retr_tree建立一個等級樹結(jié)構(gòu)的輪廓。

第三個參數(shù)method為輪廓的逼近方法

  • cv2.chain_approx_none存儲所有的輪廓點,相鄰的兩個點的像素位置差不超過1,即max(abs(x1-x2),abs(y2-y1))==1。
  • cv2.chain_approx_simple壓縮水平方向,垂直方向,對角線方向的元素,只保留該方向的終點坐標(biāo),例如一個矩形輪廓只需4個點來保存輪廓信息。
  • cv2.chain_approx_tc89_l1和cv2.chain_approx_tc89_kcos都是使用teh-chinl chain近似算法。

返回值

如:image, contours, hier = cv2.findcontours(thresh, cv2.retr_external, cv2.chain_approx_simple)

image:是原圖像

contours:圖像的輪廓,以列表的形式表示,每個元素都是圖像中的一個輪廓。

hier:相應(yīng)輪廓之間的關(guān)系。這是一個ndarray,其中的元素個數(shù)和輪廓個數(shù)相同,每個輪廓contours[i]對應(yīng)4個hierarchy元素hierarchy[i][0] ~hierarchy[i][3],分別表示后一個輪廓、前一個輪廓、父輪廓、內(nèi)嵌輪廓的索引編號,如果沒有對應(yīng)項,則該值為負(fù)數(shù)。

原圖:

Python使用Opencv實現(xiàn)邊緣檢測以及輪廓檢測的實現(xiàn)

示例一

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import cv2
import numpy as np
 
img = cv2.pyrdown(cv2.imread("hammer.jpg", cv2.imread_unchanged))
# threshold 函數(shù)對圖像進(jìn)行二化值處理,由于處理后圖像對原圖像有所變化,因此img.copy()生成新的圖像,cv2.thresh_binary是二化值
ret, thresh = cv2.threshold(cv2.cvtcolor(img.copy(), cv2.color_bgr2gray), 127, 255, cv2.thresh_binary)
# findcontours函數(shù)查找圖像里的圖形輪廓
# 函數(shù)參數(shù)thresh是圖像對象
# 層次類型,參數(shù)cv2.retr_external是獲取最外層輪廓,cv2.retr_tree是獲取輪廓的整體結(jié)構(gòu)
# 輪廓逼近方法
# 輸出的返回值,image是原圖像、contours是圖像的輪廓、hier是層次類型
image, contours, hier = cv2.findcontours(thresh, cv2.retr_external, cv2.chain_approx_simple)
 
for c in contours:
  # 輪廓繪制方法一
  # boundingrect函數(shù)計算邊框值,x,y是坐標(biāo)值,w,h是矩形的寬和高
  x, y, w, h = cv2.boundingrect(c)
  # 在img圖像畫出矩形,(x, y), (x + w, y + h)是矩形坐標(biāo),(0, 255, 0)設(shè)置通道顏色,2是設(shè)置線條粗度
  cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
 
  # 輪廓繪制方法二
  # 查找最小區(qū)域
  rect = cv2.minarearect(c)
  # 計算最小面積矩形的坐標(biāo)
  box = cv2.boxpoints(rect)
  # 將坐標(biāo)規(guī)范化為整數(shù)
  box = np.int0(box)
  # 繪制矩形
  cv2.drawcontours(img, [box], 0, (0, 0, 255), 3)
 
  # 輪廓繪制方法三
  # 圓心坐標(biāo)和半徑的計算
  (x, y), radius = cv2.minenclosingcircle(c)
  # 規(guī)范化為整數(shù)
  center = (int(x), int(y))
  radius = int(radius)
  # 勾畫圓形區(qū)域
  img = cv2.circle(img, center, radius, (0, 255, 0), 2)
 
# # 輪廓繪制方法四
# 圍繞圖形勾畫藍(lán)色線條
cv2.drawcontours(img, contours, -1, (255, 0, 0), 2)
# 顯示圖像
cv2.imshow("contours", img)
cv2.waitkey()
cv2.destroyallwindows()

運行結(jié)果如圖所示:

Python使用Opencv實現(xiàn)邊緣檢測以及輪廓檢測的實現(xiàn)

示例二

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import cv2
import numpy as np
 
img = cv2.pyrdown(cv2.imread("hammer.jpg", cv2.imread_unchanged))
ret, thresh = cv2.threshold(cv2.cvtcolor(img.copy(), cv2.color_bgr2gray) , 127, 255, cv2.thresh_binary)
# findcontours函數(shù)查找圖像里的圖形輪廓
# 函數(shù)參數(shù)thresh是圖像對象
# 層次類型,參數(shù)cv2.retr_external是獲取最外層輪廓,cv2.retr_tree是獲取輪廓的整體結(jié)構(gòu)
# 輪廓逼近方法
# 輸出的返回值,image是原圖像、contours是圖像的輪廓、hier是層次類型
image, contours, hier = cv2.findcontours(thresh, cv2.retr_external, cv2.chain_approx_simple)
# 創(chuàng)建新的圖像black
black = cv2.cvtcolor(np.zeros((img.shape[1], img.shape[0]), dtype=np.uint8), cv2.color_gray2bgr)
 
 
for cnt in contours:
  # 輪廓周長也被稱為弧長。可以使用函數(shù) cv2.arclength() 計算得到。這個函數(shù)的第二參數(shù)可以用來指定對象的形狀是閉合的(true) ,還是打開的(一條曲線)
  epsilon = 0.01 * cv2.arclength(cnt, true)
  # 函數(shù)approxpolydp來對指定的點集進(jìn)行逼近,cnt是圖像輪廓,epsilon表示的是精度,越小精度越高,因為表示的意思是是原始曲線與近似曲線之間的最大距離。
  # 第三個函數(shù)參數(shù)若為true,則說明近似曲線是閉合的,它的首位都是相連,反之,若為false,則斷開。
  approx = cv2.approxpolydp(cnt, epsilon, true)
  # convexhull檢查一個曲線的凸性缺陷并進(jìn)行修正,參數(shù)cnt是圖像輪廓。
  hull = cv2.convexhull(cnt)
  # 勾畫圖像原始的輪廓
  cv2.drawcontours(black, [cnt], -1, (0, 255, 0), 2)
  # 用多邊形勾畫輪廓區(qū)域
  cv2.drawcontours(black, [approx], -1, (255, 255, 0), 2)
  # 修正凸性缺陷的輪廓區(qū)域
  cv2.drawcontours(black, [hull], -1, (0, 0, 255), 2)
# 顯示圖像
cv2.imshow("hull", black)
cv2.waitkey()
cv2.destroyallwindows()

運行結(jié)果如圖所示:

Python使用Opencv實現(xiàn)邊緣檢測以及輪廓檢測的實現(xiàn)

到此這篇關(guān)于python使用opencv實現(xiàn)邊緣檢測以及輪廓檢測的實現(xiàn)的文章就介紹到這了,更多相關(guān)python 邊緣檢測內(nèi)容請搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!

原文鏈接:https://blog.csdn.net/HuangZhang_123/article/details/80511270

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日韩成人在线影院 | 91制片厂制作传媒网站破解 | 精品久久香蕉国产线看观看麻豆 | 午夜精品免费 | 午夜精品久久久久久久2023 | 超级乱淫寡妇 | 九九热只有精品 | 东京干福利 | 男人j进女屁股视频在线观看 | sss在线观看免费视频 | 久久久WWW免费人成精品 | 免费超级乱淫视频播放性 | 日本高清动作片www欧美 | 成人国产第一区在线观看 | 亚洲精品一区二区三区中文字幕 | 大团圆6全文在线阅读 | 美国复古性经典xxxxx | 99午夜高清在线视频在观看 | 免费在线观看伦理片 | 激情视频网址 | 免费导航 | 免费xxxxx大片在线观看影视 | 亚洲第五页| 欧美穿高跟鞋做爰 | 风间由美在线 | 91大神在线观看精品一区 | 久久99影院 | 午夜免费无码福利视频麻豆 | 国产男技师| 大香焦在线观看 | haodiaocao的视频这里看 | 黑人巨摘花第一次出血 | 亚洲精品一区二区三区中文字幕 | 暖暖在线精品日本中文 | 欧美视频一区二区三区四区 | 涩涩屋视频在线观看 | 免费叼嘿视频 | 亚洲精品电影天堂网 | 日韩一区二区三区四区五区 | 九九精品国产兔费观看久久 | 好大好硬好深好爽想要吃奶 |