#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()
ничего полезного не вернет.