быстрая обработка пикселей изображения opencv с использованием интерфейса python

#python #opencv #numpy

#python #opencv #numpy

Вопрос:

Используя python-интерфейс для OpenCV, можно легко получить доступ к пикселю изображения с помощью оператора [], например:

 img = cv.LoadImage('test.jpg')
pixel = img[10,10]
  

переменная pixel здесь представляет собой кортежный объект python, подобный (10,20,30) (например, 3 канала), это не очень удобно для обработки вычислений, поскольку тип кортежа не поддерживает оператор ‘-‘ или ‘ ‘. Если я надеюсь выполнить подструктуру для пикселя, подобного 255 — (10,20,30), я должен
код, подобный этому:

 import numpy as np
pixel = tuple( np.array([255,255,255]) - np.array(pixel) )
  

есть ли более быстрое и простое решение?
Еще один вопрос: есть ли способ выполнить вычитание для всех пикселей, например, с использованием вычитания матрицы в Matlab: 255 — img (не используйте встроенную функцию OpenCV).

Ответ №1:

Вы могли бы использовать cv2array()/array2cv() функции из adaptors.py в исходном дистрибутиве opencv и выполняйте все свои вычисления с использованием numpy массивов. 255 - imgarr в этом случае работает. Пример (урезанная версия cv2array() для массивов, доступных только для чтения):

 assert isinstance(img, cv.iplimage) and img.depth == cv.IPL_DEPTH_8U
a = np.frombuffer(img.tostring(), dtype=np.uint8)
a.shape = img.height, img.width, img.nChannels
print 255 - a
  

Комментарии:

1. моя версия opencv 2.1, я обнаружил adaptors.py в OpenCV2.1interfacesswigpython не было функции cv2array() или array2cv()

2. @PinkyJie: google.com /…

3. @PinkyJie: С другой стороны, приведенный выше метод может устареть. Есть ли в вашей версии cv.fromarray() функция? Что у вас получается numpy.asarray(img) ? opencv.willowgarage.com/documentation/python /…

4. Я установил opencv с помощью «OpenCV-2.1.0-win32-vs2008.exe «, предварительно скомпилированная версия, поэтому функция cv.fromarray() отсутствует, а numpy.asarray(img) возвращает массив объектов iplimage, а не numpy.ndarray.

5. @PinkyJie: Я добавил пример кода на случай, если np.asarray() ничего полезного не вернет.