我正在尝试找到一个洪水填充函数,该函数可以为我提供一个包含簇(“已连接”像素)坐标(x,y轴的最小值和最大值)的列表。 已经为我提供了以下实现,但是它似乎是算法中最耗时的部分,并且我想加快速度,因为最终它必须运行数百张图像。
def floodfill8(self,coord,i,j,imin,imax,jmin,jmax,area=0):
r"""determining cluster size and coordinates by recursive flood filling
"""
if coord[i,j]==1:
area+=1
imax=np.max([imax,i])
imin=np.min([imin,i-1])
jmax=np.max([jmax,j])
jmin=np.min([jmin,j-1])
coord[i,j]=0
area,coord,imin,imax,jmin,jmax=self.floodfill8(coord,i,j+1,imin,imax,jmin,jmax,area)
area,coord,imin,imax,jmin,jmax=self.floodfill8(coord,i+1,j,imin,imax,jmin,jmax,area)
area,coord,imin,imax,jmin,jmax=self.floodfill8(coord,i,j-1,imin,imax,jmin,jmax,area)
area,coord,imin,imax,jmin,jmax=self.floodfill8(coord,i-1,j,imin,imax,jmin,jmax,area)
area,coord,imin,imax,jmin,jmax=self.floodfill8(coord,i+1,j+1,imin,imax,jmin,jmax,area)
area,coord,imin,imax,jmin,jmax=self.floodfill8(coord,i+1,j-1,imin,imax,jmin,jmax,area)
area,coord,imin,imax,jmin,jmax=self.floodfill8(coord,i-1,j+1,imin,imax,jmin,jmax,area)
area,coord,imin,imax,jmin,jmax=self.floodfill8(coord,i-1,j-1,imin,imax,jmin,jmax,area)
return area, coord, imin, imax, jmin, jmax
def findcluster(self,coord):
r"""Cluster finding algorithm, finds connected groups of 1's in coord
---------
Input:
coord array of 0's and 1's
---------
Output:
clusters list of clusters with elements [xmin,xmax,ymin,ymax,size]"""
#add fixed boundaries
newcoord=np.zeros((coord.shape[0]+2,coord.shape[1]+2))
newcoord[1:-1,1:-1]=coord
clusters=[]
for i in np.arange(coord.shape[0]):
for j in np.arange(coord.shape[1]):
if newcoord[i+1,j+1]==1:
size,newcoord,imin,imax,jmin,jmax=self.floodfill8(newcoord,i+1,j+1,imin=i,imax=i,jmin=j,jmax=j)
clusters.append([imin,imax,jmin,jmax,size])
clusters=np.array(clusters)
if len(clusters)>1:
ind=np.argsort(clusters[:,-1])
clusters=clusters[ind]
return clusters
请注意,在图像中所有像素的循环中都将调用此递归填充。 我确实找不到已经实现的任何东西,一个库之类的东西,在这个图像处理领域我还是很菜鸟,但是我认为应该在某些库中对其进行优化。 我想知道是否有人拥有洪水填充功能或相关库的任何信息,这些信息也可以提供给我。 我想要此输出的原因是双重的: 1.这样我就可以找到簇的位置,并从图片中删除它们(包围它们的矩形),以便进行背景校正。 2.因此,在具有所需对比度和所需大小的聚类周围绘制一个(红色)矩形。 希望我的问题清楚!如果没有,我将很乐意得到一些反馈并解释不清楚的部分。 另外,如果您有任何建议以加快速度,也非常欢迎! 谢谢!