【python+opencv】輪廓發現

python+opencv---輪廓發現python

輪廓發現---是基於圖像邊緣提取的基礎尋找對象輪廓的方法,算法

全部邊緣提取的閾值選定會影響最終輪廓發現的結果。函數

介紹兩種API使用:spa

-cv.findContours 發現輪廓.net

-cv.drawContours 繪製輪廓code

 

*利用梯度避免閾值煩惱對象

效果圖:blog

使用邊緣Canny()提取邊緣索引

高斯模糊+灰度+全局閾值--->二值化圖像ci

 

代碼:

import cv2 as cv import numpy as np def edge_demo(image): #先將圖像高斯模糊去噪
    blurred = cv.GaussianBlur(image,(3,3),0) #圖像灰度化
    gray = cv.cvtColor(blurred,cv.COLOR_BGR2GRAY) #圖像邊緣提取
    edge_output = cv.Canny(gray,50,150) cv.imshow("CannyEdge",edge_output) #彩色邊線
    # dst = cv.bitwise_and(image,gray,mask=edge_output)
    # cv.imshow("Color Edge",dst)

    return edge_output """ findContours(image, mode, method[, contours[, hierarchy[, offset]]]) -> image, contours, hierarchy drawContours(image, contours, contourIdx, color[, thickness[, lineType[, hierarchy[, maxLevel[, offset]]]]]) -> image """
def contours_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_BINARY|cv.THRESH_OTSU) cv.imshow("binary_image",binary) """ binary = edge_demo(image) cloneImage,contours,hierarchy = cv.findContours(binary,cv.RETR_TREE,cv.CHAIN_APPROX_SIMPLE) for i ,contour in enumerate(contours): cv.drawContours(image,contours,i,(255,0,0),-2) print(i) cv.imshow("detect contours",image) src = cv.imread('circles.jpg') cv.namedWindow('input_image',cv.WINDOW_AUTOSIZE) cv.imshow('input_image',src) contours_demo(src) # edge_demo(src)
 cv.waitKey(0) cv.destroyAllWindows()

 

注意:

1.Opencv發現輪廓的函數原型爲:

findContours(image, mode, method[, contours[, hierarchy[, offset]]]) -> image, contours, hierarchy

image參數表示8位單通道圖像矩陣,能夠是灰度圖

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

,但更經常使用的是二值圖像

ret,binary = cv.threshold(gray,0,255,cv.THRESH_BINARY|cv.THRESH_OTSU)

,通常是通過Canny、拉普拉斯等邊緣檢測算子處理過的二值圖像。

mode參數表示輪廓檢索模式:

①CV_RETR_EXTERNAL:只檢測最外圍輪廓,包含在外圍輪廓內的內圍輪廓被忽略。

②CV_RETR_LIST:檢測全部的輪廓,包括內圍、外圍輪廓,可是檢測到的輪廓不創建等級關係,彼此之間獨立,沒有等級關係,這就意味着這個檢索模式下不存在父輪廓或內嵌輪廓。

③CV_RETR_CCOMP:檢測全部的輪廓,但全部輪廓只創建兩個等級關係,外圍爲頂層,若外圍內的內圍輪廓還包含了其餘的輪廓信息,則內圍內的全部輪廓均歸屬於頂層。

④CV_RETR_TREE:檢測全部輪廓,全部輪廓創建一個等級樹結構,外層輪廓包含內層輪廓,內層輪廓還能夠繼續包含內嵌輪廓。

method參數表示輪廓的近似方法:

①CV_CHAIN_APPROX_NONE 存儲全部的輪廓點,相鄰的兩個點的像素位置差不超過1,即max (abs (x1 - x2), abs(y2 - y1) == 1。

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

③CV_CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS使用teh-Chinl chain 近似算法。

contours參數是一個list,表示存儲的每一個輪廓的點集合。

hierarchy參數是一個list,list中元素個數和輪廓個數相同,每一個輪廓contours[i]對應4個hierarchy元素hierarchy[i][0] ~hierarchy[i][3],

分別表示後一個輪廓、前一個輪廓、父輪廓、內嵌輪廓的索引編號,若是沒有對應項,則該值爲負數。

offset參數表示每一個輪廓點移動的可選偏移量。

 

2.Opencv繪製輪廓的函數原型爲:

drawContours(image, contours, contourIdx, color[, thickness[, lineType[, hierarchy[, maxLevel[, offset]]]]]) -> image

imgae參數表示目標圖像。

contours參數表示全部輸入輪廓。

contourIdx參數表示繪製輪廓list中的哪條輪廓, 若是是負數,則繪製全部輪廓。

color參數表示輪廓的顏色。

thickness參數表示繪製的輪廓線條粗細,若是是負數,則填充輪廓內部

lineType參數表示線型。

hierarchy參數表示有關層次結構的可選信息。

maxLevel參數表示繪製輪廓的最大級別。 若是爲0,則僅繪製指定的輪廓。 若是爲1,則該函數繪製輪廓和全部嵌套輪廓。

若是爲2,則該函數繪製輪廓,全部嵌套輪廓,全部嵌套到嵌套的輪廓,等等。 僅當有可用的層次結構時才考慮此參數。

offset參數表示可選的輪廓偏移參數,該參數可按指定的方式移動全部繪製的輪廓。

 

參考:

https://blog.csdn.net/on2way/article/details/46812121

相關文章
相關標籤/搜索