OpenCV-Python系列九:圖像連通區(qū)域

提取圖像輪廓是不少場景中非常常用的手段,本期就另外一個常用的部分進行介紹---連通區(qū)域分析,相信使用Halcon圖像處理工具后的你會發(fā)現(xiàn),Region這一概念十分方便,對Region做連通區(qū)域分析非常方便來篩選需要的信息。Opencv中與Region這一概念最接近的該數(shù)mask了,那么針對連通區(qū)域,connectedComponentsWithStats同樣也可以幫助你快速篩選你需要的區(qū)域信息。

關(guān)于connectedComponents()與connectedComponentsWithStats()函數(shù)

前者返回連通區(qū)域的數(shù)量和標記圖,對不同的連通區(qū)域用不同的值進行標記,0代表背景;后者在此基礎(chǔ)上還返回每個連通區(qū)域的重要信息:面積,外接矩形,質(zhì)心坐標

ret, labels, stats, centroids = cv2.connectedComponentsWithStats(img, connectivity, ltype)
connectivity:4或者8, 判斷連通的像素點,周圍4像素或者8像素,默認為8;
labels:圖像標記;
stats:[[x1, y1, width1, height1, area1], ...[xi, yi, widthi, heighti, areai]],存放外接矩形和連通區(qū)域的面積信息;
centroids:[cen_x, cen_y],質(zhì)心的點坐標,浮點類型
參考博客
1.OpenCV+Python圖像連通域http://www.lxweimin.com/p/a9cc11af270c
2.OpenCV中的新函數(shù)connectedComponentsWithStats使用https://www.cnblogs.com/jsxyhelu/p/7439655.html

補充:關(guān)于labels標簽,其中存放著按照連通區(qū)域順序的標簽

labels標記圖像(源自參考博客2)

你可以通過外接矩形的信息來定位缺陷,并且可以通過其質(zhì)心位置、面積來篩選特征

通過stats來定位連通區(qū)域

import cv2
import numpy as np

img = cv2.imread('connected_component.png', -1)

gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, th = cv2.threshold(gray_img, 127, 255, cv2.THRESH_BINARY)
# 搜索圖像中的連通區(qū)域
ret, labels, stats, centroid = cv2.connectedComponentsWithStats(th)

for i, stat in enumerate(stats):
  #繪制連通區(qū)域
    cv2.rectangle(img, (stat[0], stat[1]), (stat[0] + stat[2], stat[1] + stat[3]), (25, 25, 255), 3)
  #按照連通區(qū)域的索引來打上標簽
    cv2.putText(img, str(i+1), (stat[0], stat[1] + 25), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (255, 25, 25), 2)

cv2.imshow('thresh', th)
cv2.imshow('connectedComponent', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

如果你需要選擇連通區(qū)域中面積最大的元素,可以使用下面的方式:

# 需要考慮背景,最大連通區(qū)域是整個圖像
max_area = sorted(stats, key = lambda s : s[-1], reverse = False)[-2]

對于opencv-python的圖像連通區(qū)域部分有問題歡迎留言, Have Fun With OpenCV-Python, 下期見。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。