提取圖像輪廓是不少場景中非常常用的手段,本期就另外一個常用的部分進行介紹---連通區(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ū)域順序的標簽
你可以通過外接矩形的信息來定位缺陷,并且可以通過其質(zhì)心位置、面積來篩選特征。
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, 下期見。