GPU blob边界框连接组件标签

时间:2017-08-09 02:40:11

标签: algorithm image-processing cuda gpu

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

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

连接组件标签听起来像我需要的算法吗?有没有人有一个很好的CUDA实现?

1 个答案:

答案 0 :(得分: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方法。