2011-05-25 4 views
4

Я делаю несколько простых программ с opencv в python. Я хочу написать несколько алгоритмов самостоятельно, поэтому вам нужно получить «сырые» данные изображения внутри изображения. Я не могу просто сделать изображение [i, j], например, как я могу получить цифры?Opencv ... получение данных в IPLImage или CvMat

Благодаря

ответ

5

Быстрый пример использования LoadImageM для загрузки файла изображения непосредственно в cvmat:

import cv 

path = 'stack.png' 
mat = cv.LoadImageM(path, cv.CV_LOAD_IMAGE_UNCHANGED) 
x, y = 42, 6 
print type(mat) 
print mat[y, x] 

Выход:

<type 'cv.cvmat'> 
(21.0, 122.0, 254.0) 

Быстрый пример, показывающий, как множественный один или несколько цветовых каналов с помощью 0.5:

for x in xrange(mat.cols): 
    for y in xrange(mat.rows): 
     # multiply all 3 components by 0.5 
     mat[y, x] = tuple(c*0.5 for c in mat[y, x]) 

     # or multiply only the red component by 0.5 
     b, g, r = mat[y, x] 
     mat[y, x] = (b, g, r * 0.5) 
+0

круто спасибо ... есть ли причина, стоящая за порядком [y, x]? Также, если я хочу сказать, умножьте каждый элемент на 0,5, как я могу это достичь? – Ferguzz

+0

Несомненно. Матрица индексируется 'row, col', и каждый цветовой набор упорядочивается' (B, G, R) 'для цветных изображений. Я обновлю ответ, чтобы показать вам, как умножить один или несколько компонентов цвета на 0,5. – samplebias

0

я не знаю OpenCV питона привязок, но в C или C++ вы должны получить указатель на буфер, хранящийся в IplImage. Этот буфер кодируется в соответствии с форматом изображения (также хранится в IplImage). Для RGB у вас есть байт для R, байт для G, байт для B и т. Д.

Посмотрите на API связок python, вы найдете, как получить доступ к буферу, а затем вы можете получить информацию о пикселях.

my2c

1

Оба CvMat и IplImage обеспечивают tostring методы, которые возвращают строку, представляющую исходные данные. Используя данные изображения, вы можете выяснить, как интерпретировать строковые данные как матрицу.

Вы должны использовать fromarray, чтобы преобразовать строку данных обратно в объект изображения.

Чтобы преобразовать строку в массив, рассмотрите возможность использования модуля array в Python. Например:

array.array('B', CvMat.tostring()) # 'B' is unsigned char, for rgb8 images 

Чтобы получить 'шаг' между пикселями, используйте:

stride = CvMat.step/CvMat.cols 

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

Смежные вопросы