不使用scipy对二值化图像中的对象进行计数

2024-04-26 03:49:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图计算图像中对象的数量,我已经对其进行了二值化,但是,我不允许使用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

Tags: and对象in图像numpyimgfor数量
1条回答
网友
1楼 · 发布于 2024-04-26 03:49:01

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

也许您可以使用OpenCV,它已经提供了floodfill: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元素设置中,通过对角线连接,油漆更容易“泄漏”。 进行边缘检测和加厚有助于减少不必要的颜色泄漏。你知道吗

相关问题 更多 >