Идентифицировать растения с картинки (rasterio)
С второй картинки нужно было выделить подсолнухи, убрать всякий мусор типа сорняков, найти центры подсолнухов, обвести их(типа прямоугольник вокруг растения), по центрам растений вывести ряды(векторы). Сейчас я хочу дать каждому растению идентификатор, создал массив(потому что массив с цветовыми параметрами не принимает значение более 255, а подсолнухов и всякого сорняка больше), который повторяет все что на первой картинке, белое заменил на -1, черное пытаюсь заменить на 1,2,3,4...n, но делается очень долго, как можно оптимизировать? Сейчас все растения стоят под 0, хочу чтоб было как на 3 картинке.
Добавил вот рекурсию и получается ошибка.

def recurs(ind, x, y):
if(array[x][y] == 0):
array[x][y] = ind
if(array[x - 1][y - 1] == 0):
recurs(ind, x - 1, y - 1)
elif(array[x - 1][y] == 0):
recurs(ind, x - 1, y)
elif(array[x - 1][y + 1] == 0):
recurs(ind, x - 1, y + 1)
elif(array[x][y - 1] == 0):
recurs(ind, x, y - 1)
elif(array[x][y + 1] == 0):
recurs(ind, x, y + 1)
elif(array[x + 1][y - 1] == 0):
recurs(ind, x + 1, y - 1)
elif(array[x + 1][y] == 0):
recurs(ind, x + 1, y)
elif(array[x + 1][y + 1] == 0):
recurs(ind, x + 1, y + 1)
while 1 > 0: # пытаюсь дать всем растениям идентификатор
q, w = np.where(array == 0)
if(q.size > 0):
print(q.size)
recurs(ind, q[0], w[0])
ind = ind + 1
else:
break
import numpy as np
import rasterio
if __name__ == '__main__':
path = 'C:\python2\Mavic 1 cm_transparent_mosaic_group1.tif'
with rasterio.open(path) as im:
red = im.read(1)
green = im.read(2)
blue = im.read(3)
np.seterr(divide='ignore', invalid='ignore')
vari = (((green - red) / (green + red - blue)) * 100).astype(np.uint8) # очищаю картинку
vari[vari>150] = 255 # очищаю картинку
vari[vari<5] = 255 # очищаю картинку
vari[vari<100] = 0 # очищаю картинку
vari[vari>0] = 255 # очищаю картинку
val = vari.shape
i = 0
j = 0
ind = 1
array = vari.astype(int)
array = np.where(array == 255, -1, array)
while 1 > 0: # пытаюсь дать всем растениям идентификатор
q, w = np.where(array == 0)
if(q.size > 0):
print(q.size)
if (array[q[0] - 1][w[0] - 1] > 0):
array[q[0]][w[0]] = array[q[0] - 1][w[0] - 1]
elif (array[q[0] - 1][w[0]] > 0):
array[q[0]][w[0]] = array[q[0] - 1][w[0]]
elif (array[q[0] - 1][w[0] + 1] > 0):
array[q[0]][w[0]] = array[q[0] - 1][w[0] + 1]
elif (array[q[0]][w[0] - 1] > 0):
array[q[0]][w[0]] = array[q[0]][w[0] - 1]
elif (array[q[0]][w[0] + 1] > 0):
array[q[0]][w[0]] = array[q[0]][w[0] + 1]
elif (array[q[0] + 1][w[0] - 1] > 0):
array[q[0]][w[0]] = array[q[0] + 1][w[0] - 1]
elif (array[q[0] + 1][w[0]] > 0):
array[q[0]][w[0]] = array[q[0] + 1][w[0]]
elif (array[q[0] + 1][w[0] + 1] > 0):
array[q[0]][w[0]] = array[q[0] + 1][w[0] + 1]
else:
array[q[0]][w[0]] = ind
ind = ind + 1
else:
break
kwargs = im.meta
kwargs.update(dtype=rasterio.uint8, driver='GTiff', count=1)
with rasterio.open('C:\python2\Mavic 1 cm_transparent_mosaic_group1_VARI.tif', 'w',
**kwargs) as dst:
dst.write(vari, indexes=1)


