【发布时间】:2021-04-25 19:59:16
【问题描述】:
我想得到每个唯一(非零)值的轮廓,所以基本上这个输出:
[array([[1, 1],
[3, 2],
[3, 1]], dtype=int32),
array([[4, 2],
[4, 3],
[5, 3],
[5, 2]], dtype=int32),
array([[2, 4],
[3, 4]], dtype=int32)]
我可以通过将图像转换为二进制掩码然后使用cv2 的findContours 函数来实现这一点,它可以得到我想要的输出。
import numpy as np
import cv2
img = np.array([
[0,0,0,0,0,0,0],
[0,1,1,1,0,0,0],
[0,0,1,1,2,2,0],
[0,0,0,0,2,2,0],
[0,0,3,3,0,0,0]
])
contour_list = []
for level in [l for l in np.unique(img) if l != 0]:
mask = (img == level).astype(np.uint8)
contours = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)[-2]
contours[0] = cv2.approxPolyDP(contours[0], 0.5, True)
contours_xy = contours[0][:, 0]
contour_list.append(contours_xy)
contour_list
但是,对于具有许多独特级别的大型图像,这种方法速度很慢。有没有办法提高这个功能的速度(没有多处理)?我觉得我忽略了一些功能。
【问题讨论】:
-
从我的角度来看,您的方法是可行的方法 - 特别是因为您必须处理相互接触的轮廓。如果您不需要稍后的轮廓列表中的“级别信息”,也许您可以预处理您的输入图像,例如将所有轮廓设置为相同级别,而无需触及另一个轮廓。但是,我不确定,与您的方法相比,这是否节省了如此多的处理时间。
-
调整原始图像的大小,执行此过程,然后缩放生成的轮廓以适合原始图像。
标签: python-3.x opencv mask contour opencv-python