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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 戴尔回应“供应链撤离”等传闻:均系谣言
- 下一篇: 户外电源也能租:电小二推出户外电源租赁服