время выполнения алгоритма сильно замедляется, поскольку он обрабатывает данные - PullRequest
0 голосов
/ 29 сентября 2019

этот алгоритм является частью большого проекта, над которым я работаю, этот алгоритм выполняет поиск пикселей определенного цвета, а затем возвращает их координаты.

def find_pixels(img):
    labels = np.zeros((len(img), len(img[0])))
    c = 0
    x0 = 0
    while True:
        print(c)
        pixel = find_pixel_v2(img, labels, x0)
        if pixel[0] == False:
            break
        else:
            i, j, labels, x0 = pixel[0][0], pixel[0][1], pixel[1], pixel[2]
        c += 1
        print((i,j)) 


def find_pixel_v2(img, labels, x0):
    for i in range(x0, len(img)):
        for j in range(0, len(img[0])):
            if labels[i][j] == 1:
                continue
            else:
                if img[i][j][0] != 0:
                    labels[i][j] = 1
                    return (i, j), labels, x0
                else:
                    labels[i][j] = 1
    return False, labels


input imgявляется массивом формы (x, y, 3). метки - это массив нулей с формой (x, y), чтобы убедиться, что я не зацикливаю координаты, которые я уже проверил.

проблема в том, что время выполнения алгоритма сильно замедляется с течением времени, и я нене знаю почему.

Ответы [ 2 ]

1 голос
/ 29 сентября 2019

Рад видеть, что вы нашли свою ошибку (и это, по общему признанию, о чем ваш вопрос).
Однако - я не совсем понимаю все усилия вашего алгоритма, пожалуйста, исправьте меня, если я что-то неправильно понял.

Но в ИУК ИМО все дело в том, чтобы получить все индексы изображения, где его пиксели имеют красный компонент, отличный от нуля, верно?

Так что мой подход заключается в создании маски, котораяTrue для искомых пикселей и False для всех остальных, а затем спросите у np.argwhere их индексы:

mask = img[:, :, 0] != 0
indices = np.argwhere(mask)

Возможно, вы сможете проверить это;надеюсь, это поможет.

0 голосов
/ 29 сентября 2019

Я выяснил, в чем проблема:

причина замедления среды выполнения состоит в том, что при каждом вызове find_pixel_v2() цикл for выполняет итерацию всего массива с самого начала, пока не достигнет пикселя. с требуемым цветом, с течением времени, этот процесс будет занимать все больше и больше времени.

Я подумал, что мог бы использовать переменную x0, чтобы не допустить повторения цикла for в каждом вызове заново.

Однако я допустил ошибку: return (i, j), labels, x0 Я возвращаю одно и то же значение x0, которое каждый раз равно нулю.

изменение этой строки на return (i, j), labels, i решит ее, то естьпри следующем вызове find_pixel_v2() цикл for начнется с того места, где он закончился в последнем вызове.

...