Идентифицировать растения с картинки (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)

введите сюда описание изображения

введите сюда описание изображения

введите сюда описание изображения


Ответы (0 шт):