繪制圖像輪廓:drawContours函數(shù)
在 OpenCV 中,可以使用函數(shù) cv2.drawContours()繪制圖像輪廓。該函數(shù)的語法格式是:
image=cv2.drawContours( image, contours, contourIdx, color[,
thickness[, lineType[, hierarchy[, maxLevel[, offset]]]]] )
其中,函數(shù)的返回值為 image,表示目標圖像,即繪制了邊緣的原始圖像。
該函數(shù)有如下參數(shù):
-
image:待繪制輪廓的圖像。需要注意,函數(shù) cv2.drawContours()會在圖像 image 上直接繪制輪廓。也就是說,在函數(shù)執(zhí)行完以后,image 不再是原始圖像,而是包含了輪廓的圖像。因此,如果圖像 image 還有其他用途的話,則需要預先復制一份,將該副本圖像傳遞給函cv2.drawContours()使用。
-
contours:需要繪制的輪廓。該參數(shù)的類型與函數(shù) cv2.findContours()的輸出 contours 相同,都是 list 類型。
-
contourIdx:需要繪制的邊緣索引,告訴函數(shù) cv2.drawContours()要繪制某一條輪廓還是全部輪廓。如果該參數(shù)是一個整數(shù)或者為零,則表示繪制對應(yīng)索引號的輪廓;如果該值
為負數(shù)(通常為“-1”),則表示繪制全部輪廓。 -
color:繪制的顏色,用 BGR 格式表示。
-
thickness:可選參數(shù),表示繪制輪廓時所用畫筆的粗細。如將該值設(shè)置為“-1”,則表示
要繪制實心輪廓。 -
lineType:可選參數(shù),表示繪制輪廓時所用的線型。
-
hierarchy:對應(yīng)函數(shù) cv2.findContours()所輸出的層次信息。
-
maxLevel:控制所繪制的輪廓層次的深度。如果值為 0,表示僅僅繪制第 0 層的輪廓;如果值為其他的非零正數(shù),表示繪制最高層及以下的相同數(shù)量層級的輪廓。
-
offset:偏移參數(shù)。該參數(shù)使輪廓偏移到不同的位置展示出來。
函數(shù) cv2.drawContours()的參數(shù) image 和返回值 image,在函數(shù)運算后的值是相同的。因此,也可以將函數(shù) cv2.drawContours()寫為沒有返回值的形式:
cv2.drawContours( image, contours, contourIdx, color[, thickness[,
lineType[, hierarchy[, maxLevel[, offset]]]]] )
代碼示例:繪制一幅圖像內(nèi)的所有輪廓。
如果要繪制圖像內(nèi)的所有輪廓,需要將函數(shù) cv2.drawContours()的參數(shù) contourIdx 的值設(shè)置為“-1”。
實驗原圖上一節(jié)中有可下載
代碼如下:
import cv2
o = cv2.imread('contours.bmp')
cv2.imshow("original",o)
#將原圖像轉(zhuǎn)換為灰度圖像
gray = cv2.cvtColor(o,cv2.COLOR_BGR2GRAY)
#將灰度圖像轉(zhuǎn)換為二值圖像
ret, binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
#尋找輪廓,返回的contours是輪廓的列表,hierarchy是每個輪廓對應(yīng)的屬性
contours, hierarchy = cv2.findContours(binary,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
#繪制輪廓,contours是輪廓的列表,-1表示繪制所有輪廓,(0,0,255)表示輪廓顏色為紅色,5表示輪廓寬度為5
o=cv2.drawContours(o,contours,-1,(0,0,255),5)
cv2.imshow("result",o)
cv2.waitKey()
cv2.destroyAllWindows()
運行效果如下:
在本程序中,輪廓的顏色被設(shè)置為紅色(由于黑白印刷的原因,在紙質(zhì)書中顯示為灰色),
即(0, 0, 255),參數(shù) thickness(輪廓線條的粗細)被設(shè)置為“5”。
示例2 逐個切割一幅圖像內(nèi)的邊緣信息。
import cv2
import numpy as np
o = cv2.imread('contours.bmp')
#顯示原始圖像
cv2.imshow("original",o)
#將原圖像轉(zhuǎn)換為灰度圖像
gray = cv2.cvtColor(o,cv2.COLOR_BGR2GRAY)
#將灰度圖像轉(zhuǎn)換為二值圖像
ret, binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
#尋找輪廓,返回的contours是輪廓的列表,hierarchy是每個輪廓對應(yīng)的屬性
contours, hierarchy = cv2.findContours(binary,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
#獲取輪廓的數(shù)量
n=len(contours)
#對每個輪廓進行繪制
contoursImg=[]
for i in range(n):
#創(chuàng)建空白畫布
temp=np.zeros(o.shape,np.uint8)
contoursImg.append(temp)
#繪制輪廓,contours是輪廓的列表,i表示繪制第i個輪廓,(255,255,255)表示輪廓顏色為白色,5表示輪廓寬度為5
contoursImg[i]=cv2.drawContours(contoursImg[i],contours,i,(255,255,255),5)
cv2.imshow("contours[" + str(i)+"]",contoursImg[i])
cv2.waitKey()
cv2.destroyAllWindows()
示例3:使用輪廓繪制功能,提取前景對象。
將函數(shù) cv2.drawContours()的參數(shù) thickness 的值設(shè)置為“-1”,可以繪制前景對象的實心輪廓。將該實心輪廓與原始圖像進行“按位與”操作,即可將前景對象從原始圖像中提取出來。
代碼如下:
import cv2
import numpy as np
o = cv2.imread('loc3.jpg')
cv2.imshow("original",o)
gray = cv2.cvtColor(o,cv2.COLOR_BGR2GRAY)
ret, binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(binary,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
#創(chuàng)建空白畫布
mask=np.zeros(o.shape,np.uint8)
#繪制輪廓,contours是輪廓的列表,-1表示繪制所有輪廓,(255,255,255)表示輪廓顏色為白色,-1表示輪廓寬度為-1,表示對輪廓進行填充
mask=cv2.drawContours(mask,contours,-1,(255,255,255),-1)
#顯示掩膜
cv2.imshow("mask" ,mask)
#將原圖像和掩膜進行位運算
loc=cv2.bitwise_and(o,mask)
cv2.imshow("location" ,loc)
cv2.waitKey()
cv2.destroyAllWindows()
本例中將函數(shù) cv2.drawContours()的參數(shù) thickness 設(shè)置為“-1”,得到了前景對象的實心輪
廓 mask。接下來,通過語句“cv2.bitwise_and(o, mask)”,將原始圖像 o 與實心輪廓 mask 進行
“按位與”運算,就得到了原始圖像的前景對象。
運行結(jié)果:文章來源:http://www.zghlxwxcb.cn/news/detail-635859.html
- 左圖是原始圖像,其前景對象是一朵小花。
- 中間的圖像是從原始圖像得到的小花的實心輪廓。
- 右圖是提取的前景對象小花。
實驗原圖文章來源地址http://www.zghlxwxcb.cn/news/detail-635859.html
到了這里,關(guān)于opencv基礎(chǔ)48-繪制圖像輪廓并切割示例-cv2.drawContours()的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!