Суммирование трехмерных элементов массива с одномерными массивами - PullRequest
1 голос
/ 18 апреля 2011

Я использую OpenCV для проекта по компьютерному зрению, однако мне нужно сделать попиксельную операцию над изображением, что означает доступ к каждому пикселю в изображении 640x480 и изменение его значений HSV.Изображение состоит из трехмерного массива значений X, Y и HSV, поэтому пиксель на 130, 230 может иметь значение HSV [12, 26, 18] или быть представленным на изображении: (130, 230, (12,26, 18))

Мне нужно выполнить операцию, которая позволяет мне добавить величину X в значение V (индекс элемента 2) значений HSV: (130, 230, (12, 26, *)1003 * 18 ))

Я могу сделать это с помощью двух циклов:

for x in range(image.width):
        for y in range(image.height/2):
            initcolor = cv.Get2D(image, y, x)
            initcolor2 = [0, 0, 10, 0]
            summed = [sum(pair) for pair in zip(initcolor, initcolor2)] 
            cv.Set2D(image, y, x, summed)

Но это очень медленно и по некоторым причинам занимает около 20 секунд для завершения операции надвесь образ.

Есть ли более простой и быстрый способ добиться этого?

Ответы [ 2 ]

1 голос
/ 18 апреля 2011

Первое и самое простое, что вы должны сделать, это проверить, может ли OpenCV принимать numpy массивы в качестве аргументов.Numpy построен на быстрых C-алгоритмах, которые могут обрабатывать большие циклы над структурами данных в так называемых «векторизованных» операциях.Каждый цикл в Python влечет за собой очень большие издержки.

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

0 голосов
/ 18 апреля 2011

Если бы я занимался компьютерным зрением в Python, я бы определенно использовал Numpy и перевел бы свои массивы в формат numpy как можно скорее. Я подозреваю, что вы можете захотеть, чтобы numpy.asarray () конвертировал из PIL в массив.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...