2017-08-09 35 views
0

我有一个二进制图像,将有一个或多个blob。我想要每个blob的像素列表。如果我可以为每个blob找到一个种子点,我可以通过填充来查找blob的像素。GPU blob包围盒连接组件标签

对这个问题做了一些研究,我想我想要的算法是“连接组件标签”。我看到的大多数示例只是对Blob输出进行颜色编码。使用这种算法,我可以收集:blob上的一个点和blob的轴对齐边界框?

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

+0

是的,连接组件是你想要的。如果每个斑点都有一个图像标记为不同的颜色,则边界框可以通过对图像中每种颜色的最大和最小像素坐标进行平均计算。 – jodag

+0

CUDA的实现非常繁琐,因为处理的数据依赖性很强,并且不规则。在子图像中分割图像也很困难,因为在处理图块后必须修补图片。 –

回答

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方法建议。