【问题标题】:GPU blob bounding box connected component labelingGPU blob 边界框连接组件标记
【发布时间】:2018-01-16 18:15:44
【问题描述】:

我有一个包含一个或多个 blob 的二进制图像。我想要每个 blob 的像素列表。如果我可以为每个 blob 找到一个种子点,我可以填充填充以找到 blob 的像素。

针对这个问题做一些研究,我认为我想要的算法是“连接组件标记”。我看到的大多数示例只是对 blob 输出进行颜色编码。使用此算法,我将能够收集:blob 上的一个点,以及 blob 的轴对齐边界框?

连接组件标签听起来是不是我需要的正确算法?有没有人有好的 CUDA 实现?

【问题讨论】:

  • 是的,连接组件就是您想要的。如果您有一张图像,其中每个 blob 标记为不同的颜色,则边界框可以通过获取图像中每种颜色的最大和最小像素坐标来轻松计算。
  • CUDA 实现是艰巨的,因为处理严重依赖数据且不规则。将图像拆分为子图像也很困难,因为您必须在处理图块后修补碎片。

标签: algorithm image-processing cuda gpu


【解决方案1】:

您的建议是一个很好的起点。

逐行扫描图像,当遇到黑色像素时开始填充。填充时,您可以保持边界框更新。填写完毕后,继续扫描即可。

Fill(img, x, y, xm, xM, ym, yM):
    img[x][y]= white
    xm= min(xm, x); xM= max(xM, x); ym= min(ym, y); yM= max(yM, y);
    if x >= 0 and img[x-1][y] == black:
        Fill(img, x-1, y)
    if x < w  and img[x+1][y] == black: 
        Fill(img, x+1, y)
    if y >= 0 and img[x][y-1] == black: 
        Fill(img, x, y-1)
    if y < h  and img[x][y+1] == black: 
        Fill(img, x, y+1)

FloodFill(img):
    for y in range(h):
        for x in range(w):
            if Img[x][y] == black:
                xm= xM= x; ym= yM= y
                Fill(img, x, y, xm, xM, ym, yM)
                Store(x, y, xm, xM, ym, yM)

由于洪水填充是堆栈密集型的,因此建议使用scanline-based 方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-13
    • 1970-01-01
    • 2021-10-27
    • 1970-01-01
    相关资源
    最近更新 更多