日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python使用opencv查找轮廓_Python+opencv学习记录20:轮廓发现,Pythonopencv

發布時間:2023/12/4 python 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python使用opencv查找轮廓_Python+opencv学习记录20:轮廓发现,Pythonopencv 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.輪廓發現

輪廓發現是基于圖像邊緣提取的基礎尋找對象輪廓的方法,所以邊緣提取的閾值選定會影響最終輪廓發現結果。

1.1發現輪廓

在此步驟中我們會使用到findContours這個API,其原型為:

cv2.findContours(image, mode, method[, contours[, hierarchy[, offset ]]])

注:opencv3會返回三個值,分別是img, countours, hierarchy;

而opencv4中只有 countours, hierarchy兩個返回值

第一個參數是尋找輪廓的圖像;

第二個參數表示輪廓的檢索模式,有四種:

(1)RETR_EXTERNAL表示只檢測外輪廓

(2)RETR_LIST檢測的輪廓不建立等級關系

(3)RETR_CCOMP建立兩個等級的輪廓,上面的一層為外邊界,里面的一層為內孔的邊界信息

(4)RETR_TREE建立一個等級樹結構的輪廓

其中最常用的是第一種和第四種。

第三個參數method為輪廓的近似辦法:

(1)CHAIN_APPROX_NONE存儲所有的輪廓點,相鄰的兩個點的像素位置差不超過1,即max(abs(x1-x2),abs(y2-y1))==1

(2)CHAIN_APPROX_SIMPLE壓縮水平方向,垂直方向,對角線方向的元素,只保留該方向的終點坐標,例如一個矩形輪廓只需4個點來保存輪廓信息

(3)CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS使用teh-Chinl chain 近似算法

1.2繪制輪廓

在繪制輪廓時我們會用到drawContours該API,其原型為:

cv2.drawContours(image, contours, contourIdx, color[, thickness[, lineType[, hierarchy[, maxLevel[, offset ]]]]])

第一個參數是指明在哪幅圖像上繪制輪廓;

第二個參數是是輪廓本身,在Python中是一個list;

第三個參數指定繪制輪廓list中的哪條輪廓,如果是-1,則繪制其中的所有輪廓;

之后的參數分別為線的顏色和線寬。

2.操作步驟

1.轉換圖像為二值化圖像:threshold方法或者Canny邊緣提取獲取的都是二值化圖像;

2.通過二值化圖像尋找輪廓:findContours;

3.描繪輪廓:drawContours。

2.1閾值法獲取輪廓

其代碼為:

def conters_demo(image):

dst = cv.GaussianBlur(image, (3, 3), 0) # 圖像降噪模糊

gray = cv.cvtColor(dst, cv.COLOR_BGR2GRAY)

ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_OTSU | cv.THRESH_BINARY)# 用大律法、全局自適應閾值方法進行圖像二值化

cv.imshow("binary_image", binary)

contours, heriachy = cv.findContours(binary, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE) # RETR_TREE檢測內部

# contours, heriachy = cv.findContours(binary, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE) # RETR_EXTERNAL檢測外部輪廓

for i, contour in enumerate(contours):

cv.drawContours(image, contours, i, (0, 0, 255), 2) # 繪制輪廓

# cv.drawContours(image, contours, i, (0, 0, 255), -1) # 填充輪廓

print(i)

cv.imshow("detect_contours", image)

原圖為:

經過二值化后:

繪制其輪廓后:

2.2使用Canny邊緣檢測獲取輪廓

代碼為:

def edge_demo(image):

blur = cv.GaussianBlur(image, (3, 3), 0) # 降低噪聲

gray = cv.cvtColor(blur, cv.COLOR_BGR2GRAY)

# x方向的梯度

xgrad = cv.Sobel(gray, cv.CV_16SC1, 1, 0)

# y方向的梯度

ygrad = cv.Sobel(gray, cv.CV_16SC1, 0, 1)

# 求出圖像的邊緣

edge_output = cv.Canny(xgrad, ygrad, 50, 150)

cv.imshow("Canny_Edge", edge_output)

return edge_output

def conters_demo(image):

binary = edge_demo(image)

contours, heriachy = cv.findContours(binary, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE) # RETR_TREE檢測內部

# contours, heriachy = cv.findContours(binary, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE) # RETR_EXTERNAL檢測外部輪廓

for i, contour in enumerate(contours):

cv.drawContours(image, contours, i, (0, 0, 255), 2) # 繪制輪廓

# cv.drawContours(image, contours, i, (0, 0, 255), -1) # 填充輪廓

print(i)

cv.imshow("detect_contours", image)

Canny邊緣檢測后的結果為:

繪制其輪廓為:

完整代碼

import cv2 as cv # 導入opencv模塊

import numpy as np # 導入數學函數庫

def edge_demo(image):

blur = cv.GaussianBlur(image, (3, 3), 0) # 降低噪聲

gray = cv.cvtColor(blur, cv.COLOR_BGR2GRAY)

# x方向的梯度

xgrad = cv.Sobel(gray, cv.CV_16SC1, 1, 0)

# y方向的梯度

ygrad = cv.Sobel(gray, cv.CV_16SC1, 0, 1)

# 求出圖像的邊緣

edge_output = cv.Canny(xgrad, ygrad, 50, 150)

cv.imshow("Canny_Edge", edge_output)

return edge_output

def conters_demo(image):

""""""

dst = cv.GaussianBlur(image, (3, 3), 0) # 圖像降噪模糊

gray = cv.cvtColor(dst, cv.COLOR_BGR2GRAY)

ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_OTSU | cv.THRESH_BINARY)# 用大律法、全局自適應閾值方法進行圖像二值化

cv.imshow("binary_image", binary)

# binary = edge_demo(image)

contours, heriachy = cv.findContours(binary, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE) # RETR_TREE檢測內部

# contours, heriachy = cv.findContours(binary, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE) # RETR_EXTERNAL檢測外部輪廓

for i, contour in enumerate(contours):

cv.drawContours(image, contours, i, (0, 0, 255), 2) # 繪制輪廓

# cv.drawContours(image, contours, i, (0, 0, 255), -1) # 填充輪廓

print(i)

cv.imshow("detect_contours", image)

print("------------hello python!------------")

src = cv.imread("D:/opencv3/image/huafen.jpg")

cv.namedWindow("input_image", cv.WINDOW_AUTOSIZE)

cv.imshow("input_image", src)

conters_demo(src)

cv.waitKey(0)

cv.destroyAllWindows() # 釋放所有窗口

總結

以上是生活随笔為你收集整理的python使用opencv查找轮廓_Python+opencv学习记录20:轮廓发现,Pythonopencv的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。