对没有二值化的二值化图像中的对象进行计数

时间:2019-03-03 21:22:07

标签: python image-processing counting connected-components

我正在尝试对已经二值化的图像中的对象数进行计数,但是,不允许使用scipy或numpy程序包,因此,我不能使用scipy.ndimage.label,任何想法?我的尝试有80多个对象,但只有13个(以scipy计数)

def label(img):
    n=1
    for i in range(h):
        for j in range(c):
            if img[i][j]==255:
                if img[i-1][j]!=0 and img[i-1][j]!=255:
                    img[i][j]=img[i-1][j]
                elif img[i+1][j]!=0 and img[i+1][j]!=255:
                    img[i][j]=img[i-1][j]
                elif img[i][j+1]!=0 and img[i][j+1]!=255:
                    img[i][j]=img[i][j+1]                    
                elif img[i][j-1]!=0 and img[i][j-1]!=255:
                    img[i][j]=img[i][j-1]
                else:
                    img[i][j]=n
                    if img[i-1][j]!=0:
                        img[i-1][j]=img[i][j]
                    if img[i+1][j]!=0:
                        img[i+1][j]=img[i][j]                        
                    if img[i][j+1]!=0:
                        img[i][j+1]=img[i][j]
                    if img[i][j-1]!=0:
                        img[i][j-1]=img[i][j]                        
                    n+=1
            elif img[i][j]!=0:
                if img[i-1][j]!=0:
                    img[i-1][j]=img[i][j]
                if img[i+1][j]!=0:
                    img[i+1][j]=img[i][j]  
                if img[i][j+1]!=0:
                    img[i][j+1]=img[i][j]  
                if img[i][j-1]!=0:
                    img[i][j-1]=img[i][j]                
    return img,n

1 个答案:

答案 0 :(得分:1)

您将需要类似https://codereview.stackexchange.com/questions/148897/floodfill-algorithm的东西,它实现了https://en.wikipedia.org/wiki/Flood_fill。 如果您可行,则非常适合numba或cython。

也许您可以使用已经提供了Floodfill的OpenCV:https://docs.opencv.org/3.4/d7/d1b/group__imgproc__misc.html#gaf1f55a048f8a45bc3383586e80b1f0d0

假设您已二值化,所以背景是颜色1,对象是颜色0。设置c = 2,扫描零像素,然后用颜色c填充。 现在增加c,扫描为零,填充,起泡,冲洗,重复。 您将使每个带有不同颜色的对象结束,因此可以将其用作隔离蒙版。 不同的颜色在调试过程中非常有帮助,但是如果您只想计数的话,当然三种颜色就足够了(甚至两种)。 在两种颜色的情况下,最终的位图将统一为背景色。

使用4元素的Von Neumann neighborhood8-element neighborhood会在最终结果中产生很大的不同。 在8元素设置中,涂料通过对角线连通性更容易“泄漏”。 进行边缘检测和加粗可以帮助减少不必要的颜色泄漏。