邊緣檢測雖然能檢測出邊緣凉驻,但邊緣是不連續(xù)的,并不是一個(gè)整體艳丛。圖像輪廓是將邊緣連接起來形成的一個(gè)整體匣掸,用于后續(xù)的計(jì)算。圖像輪廓是圖像中非常重要的一個(gè)特征信息氮双,通過圖像輪廓的操作碰酝,可以獲取目標(biāo)圖像的大小、位置戴差、方向等信息送爸。
cv2.findContours()函數(shù)可以查找圖像內(nèi)的輪廓信息,而cv2.drawContours()能夠?qū)⑤喞L制出來暖释。
1.查找并繪制圖像輪廓
返回值image: 與函數(shù)參數(shù)中的圖像image一致袭厂。在OpenCV 4.X中,該返回值已經(jīng)被取消球匕;
返回值contours: 返回的輪廓纹磺。是list類型,每個(gè)元素都是一個(gè)輪廓的信息亮曹,由此可以知道每個(gè)輪廓點(diǎn)的個(gè)數(shù)和位置橄杨。list的長度反映了輪廓的個(gè)數(shù)。
hierachy: 圖像的拓?fù)湫畔ⅲㄝ喞獙哟危┱肇浴S涗涊喞c輪廓之間的關(guān)系式矫,每個(gè)輪廓(Contours列表的子元素)對應(yīng)一個(gè)四個(gè)元素來說明當(dāng)前輪廓的層次關(guān)系([next,Previous,First_child,parent])。輪廓的層次結(jié)構(gòu)是由mode參數(shù)決定的役耕。不同的mode得到的輪廓編號不一樣衷佃,hierachy也不一樣。
方法的參數(shù):
image:原始圖像蹄葱。8位單通道圖像氏义,所有非零值被處理為1锄列,所有零值保持不變。也就是灰度圖會被自動(dòng)處理為二值圖像惯悠。我們通沉谟剩可以用閾值處理等函數(shù)將待查輪廓的圖像處理為二值圖像。
mode: 輪廓檢索模式克婶。決定了輪廓的提取方式筒严,具體有四種:cv2.RETR_EXTERNAL,只檢測外輪廓;cv2.RETR_LIST情萤,對檢測到的輪廓不建立等級關(guān)系鸭蛙;cv2.RETR_CCOMP,檢測所有輪廓并將它們組織成兩級層次結(jié)構(gòu)筋岛,上面一層為外邊界娶视,下面一層為內(nèi)孔的邊界。如果內(nèi)孔內(nèi)還有一個(gè)連通的物體睁宰,則這個(gè)物體的邊界仍然位于頂層肪获;cv2.RETR_TREE,建立一個(gè)等級樹結(jié)構(gòu)的輪廓。
method: 輪廓的近似方法柒傻。決定了如何表達(dá)輪廓孝赫,可以為如下值:
CV2.CHAIN_APPROX_NONE:儲存所有的輪廓點(diǎn),相鄰兩個(gè)點(diǎn)的像素位置差不超過1红符;
CV2.CHAIN_APPROX_SIMPLE:壓縮水平方向青柄、垂直方向、對角線方向的元素预侯,只保留該方向的終點(diǎn)坐標(biāo)(例如極端情況下可以用四個(gè)點(diǎn)保存輪廓信息)致开;
CV2.CHAIN_APPROX_TC89_L1:使用tehCHINl chain近似算法的一種風(fēng)格;
CV2.CHAIN_APPROX_TC89_KCOS:使用tehCHINl chain近似算法的一種風(fēng)格雌桑。
2.繪制圖像輪廓
在OpenCV中喇喉,可以使用函數(shù)cv2.drawContours()
參數(shù):
image: 待繪制輪廓的圖像。要注意校坑,該函數(shù)會在圖像image的基礎(chǔ)上繪制輪廓拣技,所以這里最好用原始圖像的備份,以免改變原始圖像耍目。
contours: 需要繪制的輪廓膏斤,該參數(shù)類型與findContours()輸出的contours相同,都是list邪驮;
contourIdx: 需要繪制的邊緣索引莫辨,告訴該函數(shù)繪制那一條輪廓。若參數(shù)為負(fù)數(shù)(通常是-1),則表示繪制所有輪廓沮榜;
color: 繪制的顏色盘榨,用BGR表示;
thickness: j可選參數(shù)蟆融,表示繪制輪廓的畫筆的粗細(xì)草巡。如將該值設(shè)置為-1,則表示要繪制實(shí)心輪廓型酥;
lineType: 可選參數(shù)山憨,表示繪制輪廓時(shí)所用的線型
hierarchy: 對應(yīng)函數(shù)cv2.findContours()輸出的層次信息;
maxLevel:控制所繪制的輪廓層次的深度弥喉。如果值為0郁竟,表示僅繪制第0層德輪廓;如果為其他非零正數(shù)由境,表示繪制最高層及以下的相同數(shù)量層級的輪廓棚亩;
offset:偏移參數(shù)。該參數(shù)使輪廓偏移到不同位置展示出來藻肄。
3.實(shí)例
1)提取并繪制圖像輪廓·:
2)使用輪廓繪制功能拒担,提取前景·對象:
將contourIdx 設(shè)置為2嘹屯,提取編號為2的輪廓;thickness設(shè)置為-1从撼,將輪廓填充為實(shí)心州弟,顏色為(255,255,255)。之后將mask與原圖像進(jìn)行一次與或按位運(yùn)算低零,得到前景: