天天看點

OPENCV FOR PYTHON 學習筆記 - 圖像輪廓

輪廓是什麼?

  邊緣檢測能夠測出邊緣,但是邊緣是不連續的;

  将邊緣連接配接為一個整體,構成輪廓。

注意的問題:

  1.對象是二值圖像,是以需要預先進行門檻值分割或者邊緣檢測處理;

  2.查找輪廓需要更改原始圖像,是以,通常使用原始圖像的一份拷貝操作;

  3.在OPENCV中,是從黑色背景中查找白色對象,是以,對象必須是白色的,背景必須是黑色的。

輪廓檢測也是圖像進行中經常用到的。OpenCV-Python接口中使用cv2.findContours()函數來查找檢測物體的輪廓。

import cv2 as cv

img = cv.imread("lena.jpg",cv.IMREAD_UNCHANGED)
#灰階圖
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
#二值圖
ret, binary = cv.threshold(gray, 127, 255, cv.THRESH_BINARY)
cv.imshow("binary",binary)

contoursImg = binary.copy()
#輪廓檢測
contours, hierarchy = cv.findContours(contoursImg,cv.RETR_TREE,cv.CHAIN_APPROX_SIMPLE) 
#繪制輪廓
drawContours = cv.drawContours(contoursImg,contours,-1,(255,0,255),1)
cv.imshow("drawContours",contoursImg)

cv.waitKey()
cv.destroyAllWindows()      

 需要注意的是cv2.findContours()函數接受的參數為二值圖,即黑白的(不是灰階圖),是以讀取的圖像要先轉成灰階的,再轉成二值圖。

cv2.findContours()函數

函數的原型為:

  cv2.findContours(image, mode, method[, contours[, hierarchy[, offset ]]])

  傳回兩個值:contours:hierarchy。

  參數:

    第一個參數是尋找輪廓的圖像;

    第二個參數表示輪廓的檢索模式,有四種(本文介紹的都是新的cv2接口):

      cv2.RETR_EXTERNAL表示隻檢測外輪廓

      cv2.RETR_LIST檢測的輪廓不建立等級關系

      cv2.RETR_CCOMP建立兩個等級的輪廓,上面的一層為外邊界,裡面的一層為内孔的邊界資訊。如果内孔内還有一個連通物體,這個物體的邊界也在頂層。

      cv2.RETR_TREE建立一個等級樹結構的輪廓。

    第三個參數method為輪廓的近似辦法

      cv2.CHAIN_APPROX_NONE存儲所有的輪廓點,相鄰的兩個點的像素位置差不超過1,即max(abs(x1-x2),abs(y2-y1))==1

      cv2.CHAIN_APPROX_SIMPLE壓縮水準方向,垂直方向,對角線方向的元素,隻保留該方向的終點坐标,例如一個矩形輪廓隻需4個點來儲存輪廓資訊

      cv2.CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS使用teh-Chinl chain 近似算法

  傳回值:

    cv2.findContours()函數傳回兩個值,一個是輪廓本身,還有一個是每條輪廓對應的屬性。

輪廓的繪制:OpenCV中通過cv2.drawContours在圖像上繪制輪廓。 

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

  • 第一個參數是指明在哪幅圖像上繪制輪廓;
  • 第二個參數是輪廓本身,在Python中是一個list。
  • 第三個參數指定繪制輪廓list中的哪條輪廓,如果是-1,則繪制其中的所有輪廓。後面的參數很簡單。其中thickness表明輪廓線的寬度,如果是-1(cv2.FILLED),則為填充模式。