python+openCV利用函數cv2.findContours()和cv2.drawContours查找並繪製輪廓

函數cv2.findContours(image, mode, method[, offset])

概述:

尋找一個二值圖像的輪廓。注意黑色表示背景,白色表示物體,即在黑色背景裏尋找白色物體的輪廓

參數:

  • image:8位單通道圖像。非零像素值視爲1,所以圖像視作二值圖像
  • mode:輪廓檢索的方式
    • cv2.RETR_EXTERNAL:只檢索外部輪廓
    • cv2.RETR_LIST: 檢測所有輪廓且不建立層次結構
    • cv2.RETR_CCOMP: 檢測所有輪廓,建立兩級層次結構
    • cv2.RETR_TREE: 檢測所有輪廓,建立完整的層次結構
  • method:輪廓近似的方法
    • cv2.CHAIN_APPROX_NONE:存儲所有的輪廓點
    • cv2.CHAIN_APPROX_SIMPLE:壓縮水平,垂直和對角線段,只留下端點。 例如矩形輪廓可以用4個點編碼。
    • cv2.CHAIN_APPROX_TC89_L1,cv2.CHAIN_APPROX_TC89_KCOS:使用Teh-Chini chain近似算法
  • offset:(可選參數)輪廓點的偏移量,格式爲tuple,如(-10,10)表示輪廓點沿X負方向偏移10個像素點,沿Y正方向偏移10個像素點

返回值

contours:輪廓點。列表格式,每一個元素爲一個3維數組(其形狀爲(n,1,2),其中n表示輪廓點個數,2表示像素點座標),表示一個輪廓
hierarchy:輪廓間的層次關係,爲三維數組,形狀爲(1,n,4),其中n表示輪廓總個數,4指的是用4個數表示各輪廓間的相互關係。第一個數表示同級輪廓的下一個輪廓編號,第二個數表示同級輪廓的上一個輪廓的編號,第三個數表示該輪廓下一級輪廓的編號,第四個數表示該輪廓的上一級輪廓的編號

函數cv2.drawContours(image, contours, contourIdx, color[, thickness[, lineType[, hierarchy[, maxLevel[, offset]]]])

概述

繪製輪廓線或者填充輪廓

參數

  • image:需要繪製輪廓的目標圖像,注意會改變原圖
  • contours:輪廓點,上述函數cv2.findContours()的第一個返回值
  • contourIdx:輪廓的索引,表示繪製第幾個輪廓,-1表示繪製所有的輪廓
  • color:繪製輪廓的顏色
  • thickness:(可選參數)輪廓線的寬度,-1表示填充
  • lineType:(可選參數)輪廓線型,包括cv2.LINE_4,cv2.LINE_8(默認),cv2.LINE_AA,分別表示4鄰域線,8領域線,抗鋸齒線(可以更好地顯示曲線)
  • hierarchy:(可選參數)層級結構,上述函數cv2.findContours()的第二個返回值,配合maxLevel參數使用
  • maxLevel:(可選參數)等於0表示只繪製指定的輪廓,等於1表示繪製指定輪廓及其下一級子輪廓,等於2表示繪製指定輪廓及其所有子輪廓
  • offset:(可選參數)輪廓點的偏移量

e.g.

import cv2
import numpy as np
import matplotlib.pyplot as plt
#載入原圖,並轉爲灰度圖像
img_original=cv2.imread('E:\ShannonT\\notebook workspace\\images\\5.5.1.png')
img_gray=cv2.cvtColor(img_original,cv2.COLOR_BGR2GRAY)
#求二值圖像
retv,thresh=cv2.threshold(img_gray,125,255,1)
#尋找輪廓
contours,hierarchy=cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
#繪製輪廓
cv2.drawContours(img_original,contours,-1,(0,0,255),3,lineType=cv2.LINE_AA)
#顯示圖像
cv2.imshow('Contours',img_original)
cv2.waitKey()
cv2.destroyAllWindows()
print(hierarchy)

結果顯示如下:
在這裏插入圖片描述
[[[ 3 -1 1 -1]
[-1 -1 2 0]
[-1 -1 -1 1]
[ 4 0 -1 -1]
[-1 3 5 -1]
[-1 -1 -1 4]]]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章