本文的文字及圖片來源於網絡,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯系我們以作處理
本文章來自騰訊雲 作者:Python知識大全
想要學習Python?有問題得不到第一時間解決?來看看這里“1039649593”滿足你的需求,資料都已經上傳至文件中,可以自行下載!還有海量最新2020python學習資料。
點擊查看
這篇文章主要介紹了python 基於opencv 繪制圖像輪廓的示例,幫助大家更好的利用python的opencv庫處理圖像,感興趣的朋友可以了解下
輪廓是一系列相連的點組成的曲線,代表了物體的基本外形。
談起輪廓不免想到邊緣,它們確實很像。簡單的說,輪廓是連續的,邊緣並不全都連續(下圖)。其實邊緣主要是作為圖像的特征使用,比如可以用邊緣特征可以區分臉和手;而輪廓主要用來分析物體的形態,比如物體的周長和面積等,可以說邊緣包括輪廓。
尋找輪廓的操作一般用於二值圖像,所以通常會使用閾值分割或Canny邊緣檢測先得到二值圖。
注意:尋找輪廓是針對白色物體的,一定要保證物體是白色,而背景是黑色,不然很多人在尋找輪廓時會找到圖片最外面的一個框。
使用cv.findContours()尋找輪廓:
import cv2 as cvimport numpy as np img = cv.imread('j.png')img_gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)ret, thresh = cv.threshold(img_gray, 0, 255, cv.THRESH_BINARY_INV + cv.THRESH_OTSU) # 尋找二值圖像的輪廓contours, hierarchy = cv.findContours(thresh, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE) print(len(contours))
參數2:輪廓的查找方式,一般使用cv.RETR_TREE,表示提取所有的輪廓並建立輪廓間的層級。
參數3:輪廓的近似方法。比如對於一條直線,我們可以存儲該直線的所有像素點,也可以只存儲起點和終點。使用cv.CHAIN_APPROX_SIMPLE就表示用盡可能少的像素點表示輪廓。
簡便起見,這兩個參數也可以直接用真值3和2表示。
函數有2個返回值,hierarchy是輪廓間的層級關系,這個不用理會。我們主要看contours,它就是找到的輪廓了,以鏈表形式存儲,記錄了每條輪廓的所有像素點的坐標(x,y)。
opencv繪制圖像輪廓
輪廓找出來后,可以像圖中那樣用紅色畫出來:cv.drawContours()
cv.drawContours(img, contours, -1, (0, 0, 255), 2)
其中參數2就是得到的contours,參數3表示要繪制哪一條輪廓,-1表示繪制所有輪廓,參數4是顏色(B/G/R通道,所以(0,0,255)表示紅色),參數5是線寬。經驗之談:很多人畫圖時明明用了彩色,但沒有效果,請檢查你是在哪個圖上畫,畫在灰度圖和二值圖上顯然是沒有彩色的。
一般情況下,我們會首先獲得要操作的輪廓,再進行輪廓繪制及分析: cnt = contours[1] cv.drawContours(img,
[cnt], 0, (0, 0, 255), 2)
import cv2 as cvimport numpy as np img = cv.imread('jiao.jpg')img_gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)ret, thresh = cv.threshold(img_gray, 0, 255, cv.THRESH_BINARY_INV + cv.THRESH_OTSU) # 尋找二值圖像的輪廓contours, hierarchy = cv.findContours(thresh, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE)cnt = contours[1:6] cv.drawContours(img, cnt, -1, (0, 0, 255), 2) cv.imshow('result',img)cv.waitKey(0)cv.destroyAllWindows()
以上就是python 基於opencv 繪制圖像輪廓的詳細內容