Работа с битами изображений в Python - PullRequest
3 голосов
/ 26 августа 2010

У меня есть приложение, которое получает указатель на данные JPEG от API камеры, завернутого в ctypes, преобразует его в wx.Image и отображает изображения в виде фильма.

Одна из необходимых функций заключается вустановите два компонента пикселя равным третьему.Например, мой пиксель в формате RGB (100 200 255), я хочу установить значения R и B равные G или (200 200 200).Мне нужно сделать это для каждого пикселя изображения, сохраняя при этом нормальную частоту кадров.

Я могу получить доступ к значениям RGB из моего wx.Image, вызвав Image.GetData, который возвращает строку, содержащую значения пикселейв следующем формате: RGBRGBRGB ... Я реализовал эту функцию наивно, перебирая эту строку RGBRGBRGB.

Однако этот наивный подход слишком медленен для достижения приличного FPS, потому что (я думаю):

a) Я перебираю каждый пиксель изображения.

б) Я слишком много копирую данные.

Я подумал о том, чтобы преобразовать мои данные RGB в numpy, выполнить операцию (я полагаю, что numpy будет иметь более быстрый способ сделать это), а затем преобразовать обратнок wx.Image.К сожалению, я не могу преобразовать прямые данные из исходных данных в пустые, поскольку данные представлены в формате JPEG, а не в виде растрового изображения RGB.Поэтому мне нужно перейти от data-> wx.Image-> numpy array-> wx.Image.

Я также рассмотрел реализацию своего собственного буфера python, который вместо этого будет возвращать, например, значение пикселя Gзначений R и B при чтении.Я думаю, что это было бы идеальным решением, поскольку оно не требует копирования данных или чрезмерных итераций, но я понятия не имею, как это сделать.Нужно ли мне писать этот буфер в C?Возможно ли реализовать буферы в чистом питоне и все же манипулировать необработанной памятью?

Итак, как вы думаете, как мне улучшить свою производительность?Стоит ли пытаться использовать решение NumPy или буферное решение, или мне не хватает более простого решения?

В основном я ищу идеи / ссылки на соответствующую документацию или примеры, но если кто-то хочет написать какой-то код, тогдахорошо:)

Спасибо

Ответы [ 2 ]

1 голос
/ 28 августа 2010

Если вам нужна действительно быстрая обработка изображений, я предлагаю написать GLSL пиксельный шейдер и связать его через OpenGL и PyGame. Ничто не сравнится со скоростью обработки пиксельных шейдеров, потому что каждый пиксель обрабатывается параллельно графическим процессором на видеокарте. Если вам нужно протестировать код пиксельных шейдеров (который написан с помощью подмножества C), лучше сделать это с RenderMonkey - это хорошая среда разработки шейдеров!

Удачи!

1 голос
/ 27 августа 2010

Вы можете попробовать использовать Python Imaging Library (PIL) - это библиотека для работы с изображениями.

Вы можете найти информацию о преобразовании между изображением wxPython и изображением PIL здесь , или вы можете загрузить JPEG непосредственно в изображение PIL.

Как только вы преобразовали свое изображение wx в изображение PIL, я думаю, что это будет делать то, что вы хотите (но я не проверялit):

r, g, b = im.split()              # split the image into separate color planes
im = Image.merge("RGB", (g, g, g))  # merge them back, using the green plane for each

Затем преобразуйте его обратно в изображение wxPython.

Это должно быть на несколько порядков быстрее, чем в Python, поскольку PIL реализован в C и оптимизирован для изображенияобработка.

...