您的建议是一个很好的起点。
按行逐行扫描图像,遇到黑色像素时开始填充。在填充时,可以保持边界框更新。填写完毕后,您只需继续扫描。
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方法建议。
是的,连接组件是你想要的。如果每个斑点都有一个图像标记为不同的颜色,则边界框可以通过对图像中每种颜色的最大和最小像素坐标进行平均计算。 – jodag
CUDA的实现非常繁琐,因为处理的数据依赖性很强,并且不规则。在子图像中分割图像也很困难,因为在处理图块后必须修补图片。 –