从洪水填充功能中提取聚类坐标

时间:2018-11-20 20:14:16

标签: output coordinates cluster-computing flood-fill

我正在尝试找到一个洪水填充函数,该函数可以为我提供一个包含簇(“已连接”像素)坐标(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.因此,在具有所需对比度和所需大小的聚类周围绘制一个(红色)矩形。 希望我的问题清楚!如果没有,我将很乐意得到一些反馈并解释不清楚的部分。 另外,如果您有任何建议以加快速度,也非常欢迎! 谢谢!

0 个答案:

没有答案