我有一个包含一个或多个blob的二进制图像。我想要每个blob的像素列表。如果我可以为每个blob找到一个种子点,我可以填充填充以找到blob的像素。
对这个问题进行一些研究,我认为我想要的算法是"连接组件标签。"大多数例子我只看到blob输出的颜色代码。使用此算法,我将能够收集:blob上的一个点,以及轴对齐blob的边界框?
连接组件标签听起来像我需要的算法吗?有没有人有一个很好的CUDA实现?
答案 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方法。