Извлечение координат кластера из функции заполнения потока - PullRequest
0 голосов
/ 20 ноября 2018

Я пытаюсь найти функцию заполнения наводнения, которая может дать мне в качестве вывода список с координатами (min и max оси 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. Так что нарисуйте (красный) прямоугольник вокруг тех кластеров, которые имеют желаемый контраст и желаемый размер.Надеюсь, мой вопрос ясен!Если нет, я буду рад получить некоторую обратную связь и объяснить неясные части.Кроме того, если у вас есть какие-либо советы, чтобы ускорить его, это очень приветствуется!Спасибо!

...