[英]Fast component labelling in python and opencv
我作为实施的标记算法本文使用python和OpenCV。 它要求逐像素检查输入图像,并执行所谓的轮廓跟踪子例程,以将标签分配给二进制图像的斑点。
我设法使其运行,但它看起来非常慢。 对代码进行性能分析表明,访问像素的for循环似乎是瓶颈。 256px * 256px的图像大约需要200毫秒。 这大致是我的工作:
for i in image.height:
for j in image.width:
p = image[i, j]
pa = image[i - 1, j]
pb = image[i + 1, j]
# etc...
其中“ image”是二进制opencv映像。
我想知道是否有更快的方法可以将其用于视频应用程序。 对于相同的问题大小,我将目标运行时间定为40-50ms,以获得20-25fps。 10-15fps也可能是可以接受的(运行时间66-100ms)。
任何提示,想法我能做的都非常感谢。
我见过很多帖子,对缺少OpenCV标签感到遗憾。
正如@ malloc47所说, scipy.ndimage.label
将起作用。 我使用过它,但是当我寻找图像中最大的斑点时,我对它的性能并不满意。 我并不是特别需要标签,因此最终使用了cv2.findContours
和cv2.contourArea
来隔离最大的标签:
# The [0] is because I didn't care about the hierarchy, which is the second
# return value of cv2.findContours.
contours = cv2.findContours(numpy_array,
mode=cv2.RETR_EXTERNAL,
method=cv2.CHAIN_APPROX_SIMPLE
)[0]
areas = [cv2.contourArea(ctr) for ctr in contours]
max_contour = [contours[areas.index(max(areas))]]
对于我来说,这比scipy.ndimage.label
快得多,结果非常相似。 就像我说的那样,这并非完全是一种标签,但是可能可以使用轮廓查找器给出一个相当好的标签。
适用于Python的最新OpenCV绑定返回numpy数据类型,这意味着您可以使用完整的numpy武库。 通常使用ndenumerate
循环遍历numpy中的2D数组(带有索引),这应该至少提供一点加速(因为它是为ND数组优化的单循环)。 您可以考虑使用numpy vectorize
来提高速度,但是如果需要数组的索引,则需要ndenumerate
。
除此之外,您最好的选择可能是使用C编写瓶颈操作。
更新资料
如果有帮助的话,我相信scipy.ndimage.label
确实可以完成您要尝试的操作,甚至可以使用相同的算法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.