使用 opencv 与 findcontour 关联的标签
label associated to findcontour with opencv
我有一个面具,我可以使用
从中获取轮廓信息
contours, hierarchy = cv2.findContours(mask.astype('uint8'),cv2.RETR_CCOMP,cv2.CHAIN_APPROX_NONE)
如何获得相应的标签数组,即与掩码大小相同的数组,其中值是等高线的索引并位于相应等高线内的掩码点上?我找到了一种使用 matplotlib.contains_points 函数的方法,但速度很慢。我确定还有另一种方法,但奇怪的是我找不到它...这是带有 contains_points 的版本:
points = np.vstack((Xm.flatten(),Ym.flatten())).T
labels = -np.ones((mask.shape[0]*mask.shape[1],1))
for ic,contour in enumerate(contours):
px = contour[:,0,0];
py = contour[:,0,1];
p = Path(list(zip(px,py))) # make a polygon
Inpoints = p.contains_points(points)
labels[Inpoints] = ic
我也在尝试使用 cv2.connectedComponents 但我找不到获得正确索引的方法,因为 connectedComponents 独立于 findcontours...编辑:这是一段代码:
# labels of objects
_, labels_obj = cv2.connectedComponents(mask.astype('uint8'))
labels_obj = labels_obj - 1 # remove background
tmp = np.copy(labels_obj)
for ir,iro in enumerate(reg_objects):
tmp[labels_obj==ir] = iro + 1
tmp[tmp<0]=0
labels_obj = tmp
# labels of holes present in objects
_, labels_hol = cv2.connectedComponents((1-mask).astype('uint8'))
labels_hol = labels_hol - 2 # remove background (objects are 0 and background is 1 so -2)
tmp = np.copy(labels_hol)
for ir,irh in enumerate(reg_holes):
tmp[labels_hol==ir] = irh + 1
tmp[tmp<0]=0
labels_hol = tmp
# merge
labels = labels_obj + labels_hol - 1
labels 是一个与 maks 大小相同的数组,其值指向不同的对象和掩码的孔。问题是 labels==0 不会指向与 contours[0] 相同的 object/hole ...
编辑:标签数组将用于 skimage.measure.regionprops
如评论中所建议,您可以通过在空白图像上绘制轮廓来创建此蒙版:
label_map = np.zeros_like(mask, dtype = 'uint8')
contours, hierarchy = cv2.findContours(mask.astype('uint8'),cv2.RETR_CCOMP,cv2.CHAIN_APPROX_NONE)
for i, contour in enumerate(contours):
label_map = cv2.drawContours(label_map, [contour], -1, (255/(i+1)), -1)#draw and fill the contour with color (255/(1+1)).
请注意,参数 (255/(i+1))
只是一种生成一组 len(contours)
不同灰度的方法,您可以用一组颜色更改它。
我有一个面具,我可以使用
从中获取轮廓信息contours, hierarchy = cv2.findContours(mask.astype('uint8'),cv2.RETR_CCOMP,cv2.CHAIN_APPROX_NONE)
如何获得相应的标签数组,即与掩码大小相同的数组,其中值是等高线的索引并位于相应等高线内的掩码点上?我找到了一种使用 matplotlib.contains_points 函数的方法,但速度很慢。我确定还有另一种方法,但奇怪的是我找不到它...这是带有 contains_points 的版本:
points = np.vstack((Xm.flatten(),Ym.flatten())).T
labels = -np.ones((mask.shape[0]*mask.shape[1],1))
for ic,contour in enumerate(contours):
px = contour[:,0,0];
py = contour[:,0,1];
p = Path(list(zip(px,py))) # make a polygon
Inpoints = p.contains_points(points)
labels[Inpoints] = ic
我也在尝试使用 cv2.connectedComponents 但我找不到获得正确索引的方法,因为 connectedComponents 独立于 findcontours...编辑:这是一段代码:
# labels of objects
_, labels_obj = cv2.connectedComponents(mask.astype('uint8'))
labels_obj = labels_obj - 1 # remove background
tmp = np.copy(labels_obj)
for ir,iro in enumerate(reg_objects):
tmp[labels_obj==ir] = iro + 1
tmp[tmp<0]=0
labels_obj = tmp
# labels of holes present in objects
_, labels_hol = cv2.connectedComponents((1-mask).astype('uint8'))
labels_hol = labels_hol - 2 # remove background (objects are 0 and background is 1 so -2)
tmp = np.copy(labels_hol)
for ir,irh in enumerate(reg_holes):
tmp[labels_hol==ir] = irh + 1
tmp[tmp<0]=0
labels_hol = tmp
# merge
labels = labels_obj + labels_hol - 1
labels 是一个与 maks 大小相同的数组,其值指向不同的对象和掩码的孔。问题是 labels==0 不会指向与 contours[0] 相同的 object/hole ... 编辑:标签数组将用于 skimage.measure.regionprops
如评论中所建议,您可以通过在空白图像上绘制轮廓来创建此蒙版:
label_map = np.zeros_like(mask, dtype = 'uint8')
contours, hierarchy = cv2.findContours(mask.astype('uint8'),cv2.RETR_CCOMP,cv2.CHAIN_APPROX_NONE)
for i, contour in enumerate(contours):
label_map = cv2.drawContours(label_map, [contour], -1, (255/(i+1)), -1)#draw and fill the contour with color (255/(1+1)).
请注意,参数 (255/(i+1))
只是一种生成一组 len(contours)
不同灰度的方法,您可以用一组颜色更改它。