我试图计算图像中对象的数量,我已经对其进行了二值化,但是,我不允许使用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
您将需要类似于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 neighborhood与8-element neighborhood将对最终结果产生很大的影响。 在8元素设置中,通过对角线连接,油漆更容易“泄漏”。 进行边缘检测和加厚有助于减少不必要的颜色泄漏。你知道吗
相关问题 更多 >
编程相关推荐