python 基于opencv 繪制圖像輪廓
圖像輪廓概念
輪廓是一系列相連的點(diǎn)組成的曲線,代表了物體的基本外形。
談起輪廓不免想到邊緣,它們確實(shí)很像。簡單的說,輪廓是連續(xù)的,邊緣并不全都連續(xù)(下圖)。其實(shí)邊緣主要是作為圖像的特征使用,比如可以用邊緣特征可以區(qū)分臉和手;而輪廓主要用來分析物體的形態(tài),比如物體的周長和面積等,可以說邊緣包括輪廓。
尋找輪廓的操作一般用于二值圖像,所以通常會使用閾值分割或Canny邊緣檢測先得到二值圖。
注意:尋找輪廓是針對白色物體的,一定要保證物體是白色,而背景是黑色,不然很多人在尋找輪廓時(shí)會找到圖片最外面的一個框。
opencv找出圖像輪廓
使用cv.findContours()尋找輪廓:
import cv2 as cv import 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))
- 參數(shù)2:輪廓的查找方式,一般使用cv.RETR_TREE,表示提取所有的輪廓并建立輪廓間的層級。
- 參數(shù)3:輪廓的近似方法。比如對于一條直線,我們可以存儲該直線的所有像素點(diǎn),也可以只存儲起點(diǎn)和終點(diǎn)。使用cv.CHAIN_APPROX_SIMPLE就表示用盡可能少的像素點(diǎn)表示輪廓。
- 簡便起見,這兩個參數(shù)也可以直接用真值3和2表示。
- 函數(shù)有2個返回值,hierarchy是輪廓間的層級關(guān)系,這個不用理會。我們主要看contours,它就是找到的輪廓了,以鏈表形式存儲,記錄了每條輪廓的所有像素點(diǎn)的坐標(biāo)(x,y)。
opencv繪制圖像輪廓
輪廓找出來后,可以像圖中那樣用紅色畫出來:cv.drawContours()
cv.drawContours(img, contours, -1, (0, 0, 255), 2)
其中參數(shù)2就是得到的contours,參數(shù)3表示要繪制哪一條輪廓,-1表示繪制所有輪廓,參數(shù)4是顏色(B/G/R通道,所以(0,0,255)表示紅色),參數(shù)5是線寬。
經(jīng)驗(yàn)之談:很多人畫圖時(shí)明明用了彩色,但沒有效果,請檢查你是在哪個圖上畫,畫在灰度圖和二值圖上顯然是沒有彩色的。
一般情況下,我們會首先獲得要操作的輪廓,再進(jìn)行輪廓繪制及分析:
cnt = contours[1]
cv.drawContours(img, [cnt], 0, (0, 0, 255), 2)
實(shí)驗(yàn):找出并繪制圖像輪廓
import cv2 as cv import 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()
實(shí)驗(yàn)結(jié)果
以上就是python 基于opencv 繪制圖像輪廓的詳細(xì)內(nèi)容,更多關(guān)于python 繪制圖像輪廓的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
利用python爬取散文網(wǎng)的文章實(shí)例教程
這篇文章主要跟大家介紹了利用python爬取散文網(wǎng)文章的相關(guān)資料,文中介紹的非常詳細(xì),對大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。2017-06-06Python3使用 GitLab API 進(jìn)行批量合并分支
這篇文章主要介紹了Python3使用 GitLab API 進(jìn)行批量合并分支的思路詳解,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10詳解python實(shí)現(xiàn)交叉驗(yàn)證法與留出法
這篇文章主要介紹了詳解python實(shí)現(xiàn)交叉驗(yàn)證法與留出法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07Python loguru日志庫之高效輸出控制臺日志和日志記錄
這篇文章主要介紹了python loguru日志庫之高效輸出控制臺日志和日志記錄的相關(guān)知識,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03