輪廓發(fā)現(xiàn)是基于圖像邊緣提取的基礎(chǔ)尋找對象輪廓的方法系枪,所以邊緣提取的閾值選定會影響最終輪廓發(fā)現(xiàn)結(jié)果
Code
import cv2 as cv
def edge_demo(image):
blurred = cv.GaussianBlur(image, (3, 3), 0)
gray = cv.cvtColor(blurred, cv.COLOR_BGR2GRAY)
# X gradient
x_grad = cv.Sobel(gray, cv.CV_16SC1, 1, 0)
# Y gradient
y_grad = cv.Sobel(gray, cv.CV_16SC1, 0, 1)
edge_output = cv.Canny(x_grad, y_grad, 50, 150)
cv.imshow("Canny Edge", edge_output)
return edge_output
def contour_demo(image):
"""dst = cv.GaussianBlur(image, (3, 3), 0) # 高斯模糊去噪
gray = cv.cvtColor(dst, cv.COLOR_BGR2GRAY)
# 用大律法皱蹦、全局自適應(yīng)閾值方法進(jìn)行圖像二值化
ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
cv.imshow("binary image", binary)"""
binary = edge_demo(image)
contours, hierarchy = cv.findContours(binary, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
for i, contour in enumerate(contours):
# 2表示繪制線寬具垫,若為-1則填充整個輪廓
cv.drawContours(image, contours, i, (0, 0, 255), 2)
print(i)
cv.imshow("contour_image", image)
src = cv.imread("./data/coins.png", cv.IMREAD_COLOR)
cv.namedWindow("lena[圖片上傳中...(輪廓發(fā)現(xiàn).png-60efd4-1555375918866-0)]
", cv.WINDOW_AUTOSIZE)
cv.imshow("lena", src)
contour_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()
運行結(jié)果
API
1.Opencv發(fā)現(xiàn)輪廓的函數(shù)原型為:findContours(image, mode, method[, contours[, hierarchy[, offset]]]) -> image, contours, hierarchy
PS:個人測試,不返回image帝璧,否則報錯,不知道為啥,具體見上代碼
image參數(shù)表示8位單通道圖像矩陣称龙,可以是灰度圖,但更常用的是二值圖像戳晌,一般是經(jīng)過Canny鲫尊、拉普拉斯等邊緣檢測算子處理過的二值圖像。
mode參數(shù)表示輪廓檢索模式:
①CV_RETR_EXTERNAL:只檢測最外圍輪廓沦偎,包含在外圍輪廓內(nèi)的內(nèi)圍輪廓被忽略疫向。
②CV_RETR_LIST:檢測所有的輪廓咳蔚,包括內(nèi)圍、外圍輪廓搔驼,但是檢測到的輪廓不建立等級關(guān)系谈火,彼此之間獨立,沒有等級關(guān)系匙奴,這就意味著這個檢索模式下不存在父輪廓或內(nèi)嵌輪廓堆巧。
③CV_RETR_CCOMP:檢測所有的輪廓,但所有輪廓只建立兩個等級關(guān)系泼菌,外圍為頂層谍肤,若外圍內(nèi)的內(nèi)圍輪廓還包含了其他的輪廓信息,則內(nèi)圍內(nèi)的所有輪廓均歸屬于頂層哗伯。
④CV_RETR_TREE:檢測所有輪廓荒揣,所有輪廓建立一個等級樹結(jié)構(gòu),外層輪廓包含內(nèi)層輪廓焊刹,內(nèi)層輪廓還可以繼續(xù)包含內(nèi)嵌輪廓系任。
method參數(shù)表示輪廓的近似方法:
①CV_CHAIN_APPROX_NONE 存儲所有的輪廓點,相鄰的兩個點的像素位置差不超過1虐块,即max (abs (x1 - x2), abs(y2 - y1) == 1俩滥。
②CV_CHAIN_APPROX_SIMPLE壓縮水平方向,垂直方向贺奠,對角線方向的元素霜旧,只保留該方向的終點坐標(biāo),例如一個矩形輪廓只需4個點來保存輪廓信息儡率。
③CV_CHAIN_APPROX_TC89_L1挂据,CV_CHAIN_APPROX_TC89_KCOS使用teh-Chinl chain 近似算法。
contours參數(shù)是一個list儿普,表示存儲的每個輪廓的點集合崎逃。
hierarchy參數(shù)是一個list,list中元素個數(shù)和輪廓個數(shù)相同,每個輪廓contours[i]對應(yīng)4個hierarchy元素hierarchy[i][0] ~hierarchy[i][3]眉孩,分別表示后一個輪廓个绍、前一個輪廓、父輪廓浪汪、內(nèi)嵌輪廓的索引編號障贸,如果沒有對應(yīng)項,則該值為負(fù)數(shù)吟宦。
offset參數(shù)表示每個輪廓點移動的可選偏移量。
2.Opencv繪制輪廓的函數(shù)原型為:drawContours(image, contours, contourIdx, color[, thickness[, lineType[, hierarchy[, maxLevel[, offset]]]]]) -> image
imgae參數(shù)表示目標(biāo)圖像涩维。
contours參數(shù)表示所有輸入輪廓殃姓。
contourIdx參數(shù)表示繪制輪廓list中的哪條輪廓袁波, 如果是負(fù)數(shù),則繪制所有輪廓蜗侈。
PS:這項參數(shù)我也沒用到
color參數(shù)表示輪廓的顏色篷牌。
thickness參數(shù)表示繪制的輪廓線條粗細(xì),如果是負(fù)數(shù)踏幻,則繪制輪廓內(nèi)部枷颊。
lineType參數(shù)表示線型。
hierarchy參數(shù)表示有關(guān)層次結(jié)構(gòu)的可選信息该面。
maxLevel參數(shù)表示繪制輪廓的最大級別夭苗。 如果為0,則僅繪制指定的輪廓隔缀。 如果為1题造,則該函數(shù)繪制輪廓和所有嵌套輪廓。 如果為2猾瘸,則該函數(shù)繪制輪廓界赔,所有嵌套輪廓,所有嵌套到嵌套的輪廓牵触,等等淮悼。 僅當(dāng)有可用的層次結(jié)構(gòu)時才考慮此參數(shù)。
offset參數(shù)表示可選的輪廓偏移參數(shù)揽思,該參數(shù)可按指定的方式移動所有繪制的輪廓袜腥。