輪廓可以理解為圖像中具有相同顏色或密度的位于邊界的連續點的集合,輪廓是形狀分析和對象識別的有利工具。
在-中,我們常用函數來計算輪廓,每個獨立的輪廓都是以Numpy array的點坐標的形式呈現。
為了在圖像中顯示出計算出的輪廓,我們使用函數。通常這個函數會配合使用。
官方文檔相關api 輪廓檢測
contours, hierarchy=cv2.findContours(image, mode, method[, contours[, hierarchy[, offset]]])
image:源圖像,8位單通道圖像,非0像素值均按像素值為1處理,該函數在提取輪廓的過程中會改變圖像
:輪廓信息,每個輪廓由點集組成opencv求輪廓中心點,而所有的輪廓構成了列表
:可選參數,表示輪廓的層次信息(拓撲信息,有種樹結構的感覺),每個輪廓元素[i]對應4個元素[i][0]~[i][3],分別表示后一個輪廓、前一個輪廓、父輪廓和內嵌輪廓的編號,若無對應項,則該參數為負值
mode:輪廓檢索模式
cv2.:只檢測最外層輪廓,并置[i][2]=[i][3]=-1
cv2.:提取所有輪廓并記錄在列表中,輪廓之間無等級關系
cv2.:提取所有輪廓并建立雙層結構(頂層為連通域的外圍輪廓,底層為孔的內層邊界)
cv2.:提取所有輪廓,并重新建立輪廓層次結構
:輪廓逼近方法
cv2.:獲取每個輪廓的每個元素,相鄰像素的位置差不超過1,即連續的點,但通常我們并不需要所有的點
cv2.:壓縮水平方向、垂直方向和對角線方向的元素,保留該方向的終點坐標,如矩形的輪廓可用4個角點表示,這是一種常用的方法,比第一種方法能得出更少的點
cv2.和cv2.OS:對應Tch-Chain鏈逼近算法
:偏移 (反正我沒用過)
by which every point is . This is if the are from the image ROI and then they be in the whole image .可選的偏移,就是簡單的平移,特別是在做了ROI步驟之后有用。
輪廓繪制
cv2.drawContours(image, contours, contourIdx, color[, thickness[, lineType[, hierarchy[, maxLevel[, offset]]]]])
image:目標輸出圖像
:所有的輪廓opencv求輪廓中心點,可直接傳入函數中的參數
:輪廓的索引,即繪制哪個輪廓,若為負值則繪制所有輪廓
color:繪制的顏色,元祖形式,如(255)或(255, 255, 255)
:繪制的輪廓的線條粗細程度,若為負數,表示要填充整個輪廓
原始圖像
[+]
import cv2
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from pandas import Series, DataFrame
img = cv2.imread('./lung.jpg')
plt.imshow(img)
plt.show()
grayImg = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret,binImg = cv2.threshold(grayImg, 100, 255, cv2.THRESH_BINARY)

contours, hierarchy = cv2.findContours(binImg, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(img, contours, -1, (0, 200, 255), 2)
plt.imshow(img)
plt.show()
hierarchyDF = DataFrame(hierarchy[0], columns = ['pre', 'next', 'child', 'parent'])
可以得到7個輪廓,在這里首先在圖上進行了簡單的標記。
查看可得:
對應的層次結構可以表示為:
0
|
+------+
||
14
||
+--+5
|||
233