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