Как получить поток TIFF из образа OpenCV, а не из массива? - PullRequest
0 голосов
/ 24 августа 2018

В Python я хочу преобразовать изображение, которое было обработано с использованием OpenCV, для передачи в определенном формате изображения ( TIFF в данном случае, но может быть: BMP, JPEG, PNG, ... ..).

Для этого достаточно закодировать изображение OpenCV в буфер памяти. Проблема в том, что когда я использую cv2.imencode() для этого, возвращаемый объект по-прежнему выглядит как массив numpy:

import cv2
img_cv2_aka_nparr = cv2.imread('test.jpg')
my_format = '.tiff'
retval, im_buffer = cv2.imencode(my_format, img_cv2_aka_nparr)
print type(im_buffer)

im_buffer - это просто еще один массив numpy - он вовсе не является потоком в TIFF-кодировке! Насколько я могу судить, образы OpenCV в python всегда ведут себя как numpy массивы и даже выглядят как numpy массивы через type().

На самом деле, если вы хотите создать фиктивный «образ OpenCV», вы должны использовать numpy - см., Например, https://stackoverflow.com/a/22921648/1021819

Почему это так и как это исправить? То есть, как я могу получить фактический закодированный потоком TIFF поток, а не другой массив numpy?

Теперь мне нравится numpy, но в этом случае мне нужно, чтобы изображение было читаемым не-python-сервисами, поэтому оно должно быть в общедоступном (предпочтительно без потерь) формате (см. Список выше).

(Я обошел дома встраивания numpy в JSON и решил против этого.)

Я мог бы использовать PIL / подушку, scipy и некоторые другие, но я пытаюсь минимизировать зависимости (т.е. пока только cv2, numpy и встроенные).

Спасибо!

1 Ответ

0 голосов
/ 24 августа 2018

После https://stackoverflow.com/a/50630390/1021819 и построения (но не очень) комментария Дэна Масека требуется дополнительный дополнительный шаг - просто использовать im_buffer.tobytes(), который возвращает строку байтов, которую можно отправить через поток.

Изображения Python OpenCV представляются в виде чистых numpy массивов.Как указывает Дэн Масек, массивы можно преобразовать с помощью cv2.imencode() в TIFF, PNG, BMP, JPG и т. Д.

Очевидно, что существуют некоторые споры по поводу выбора форматов и сжатия.В приведенном выше случае предпочтение было отдано сжатию без потерь, подразумевающему TIFF, BMP или PNG (все еще будут споры).Привязки Python к OpenCV не имеют настраиваемых параметров для сжатия TIFF (в отличие от (?) Привязок C ++?), Поэтому не очень легко обнаружить, что делается там.Уровень сжатия, очевидно, мог бы быть лучше при использовании других библиотек, но моя цель состояла в том, чтобы минимизировать зависимости (см. Выше).

Изображение в кодировке BMP было не меньше, чем изображение в формате TIFF.Сжатие PNG настраивается в Python OpenCV, и установка

cv2.imencode('.png', nparr, [int(cv2.IMWRITE_PNG_COMPRESSION),1])

дала наилучший компромисс между скоростью и размером.Спасибо.

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