python-opencv连通域查找瑕疵 cv2.connectedComponentsWithStats

比如我们现在有一张黑底白图的瑕疵图片,我们怎么样才能快速找到其中的瑕疵呢,方法有很多中,本期主要介绍使用连通域查找瑕疵 cv2.connectedComponentsWithStats查找瑕疵。

图片如下:

我们现在需要找到所有轮廓:

首先介绍一下cv2.connectedComponentsWithStats的含义,

num_labels, labels, stats, centroids = cv2.connectedComponentsWithStats(image, connectivity=8, ltype=None)

各个参数介绍如下:
image:也就是输入图像,必须是二值图,即8位单通道图像。(因此输入图像必须先进行二值化处理才能被这个函数接受)
connectivity:可选值为4或8,也就是使用4连通还是8连通。
ltype:输出图像标记的类型,目前支持CV_32S 和 CV_16U。 返回值:
返回值
num_labels:所有连通域的数目
labels:图像上每一像素的标记,用数字1、2、3…表示(不同的数字表示不同的连通域)
stats:每一个标记的统计信息,是一个5列的矩阵,每一行对应每个连通区域的外接矩形的x、y、width、height和面积,示例如下: 0 0 720 720 291805
centroids:连通域的中心点

文件放置如下:

 

直接上代码:

import cv2
import numpy as np
 
img = cv2.imread("img.jpg")   #读取图片
img = cv2.medianBlur(img, 3)   # 中值滤波,去噪
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  #变为灰度图 
cv2.namedWindow('original', cv2.WINDOW_AUTOSIZE)
cv2.imshow('original', gray)
 
ret, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)   ## 阈值分割得到二值化图片
 
kernel2 = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))     ## 膨胀卷积
bin_clo = cv2.dilate(binary, kernel2, iterations=2)       #膨胀操作
 
# 连通域分析
num_labels, labels, stats, centroids = cv2.connectedComponentsWithStats(bin_clo, connectivity=8)
 
# 查看各个返回值
# 连通域数量
print('num_labels = ',num_labels)
# 连通域的信息:对应各个轮廓的x、y、width、height和面积
print('stats = ',stats)
# 连通域的中心点
print('centroids = ',centroids)
# 每一个像素的标签1、2、3.。。,同一个连通域的标签是一致的
print('labels = ',labels)
 
# 不同的连通域赋予不同的颜色
output = np.zeros((img.shape[0], img.shape[1], 3), np.uint8)
for i in range(1, num_labels):
 
    mask = labels == i
    output[:, :, 0][mask] = np.random.randint(0, 255)
    output[:, :, 1][mask] = np.random.randint(0, 255)
    output[:, :, 2][mask] = np.random.randint(0, 255)
cv2.imshow('oginal', output)
cv2.waitKey()
cv2.destroyAllWindows()

输出结果如下:

 左边的是原图通过膨胀得到的图片,右边连通域找到对应的图片后,不同的连通域赋予了不同的颜色。

从输出的结果可以看到,连通域有240个 

猜你喜欢

转载自blog.csdn.net/qq_34904125/article/details/123308334