Как сохранить двоичное изображение (с dtype = bool) с помощью cv2?

Я использую opencv в Python и хочу сохранить двоичное изображение (dtype = bool). Если я просто использую cv2.imwrite, я получаю следующую ошибку:

TypeError: image data type = 0 is not supported

Может кто-то помочь мне с этим? Изображение в основном должно работать как маска позже.


person Vaibhav Dixit    schedule 16.06.2017    source источник


Ответы (5)


Вы можете использовать это:

cv2.imwrite('mask.png', maskimg * 255)

Таким образом, это неявно преобразует его в целое число, которое дает 0 для False и 1 для True и умножает его на 255, чтобы создать (битовую) маску перед ее записью. OpenCV довольно терпим и записывает int64 изображений с глубиной 8 бит (но, например, uint16 изображений с глубиной 16 бит). Операция не выполняется на месте, поэтому вы все равно можете использовать maskimg для индексации и т. Д.

person John    schedule 16.07.2018
comment
Кажется, работает также просто как: `cv2.imwrite (mask.png, 255 * binary_image)` - person Red Riding Hood; 04.11.2019

Преобразуйте двоичное изображение в тип данных uint8.

Попробуй это:

>>> binary_image.dtype='uint8'
>>> cv2.imwrite('image.png', binary_image)
person avereux    schedule 16.06.2017

Нет OpenCV не ожидает двоичного изображения в формате логического ndarray. OpenCV поддерживает только np.uint8, np.float32, np.float64, поскольку OpenCV - это скорее библиотека для работы с изображениями, поэтому изображение с логическими значениями не имеет смысла, когда вы думаете о RGB или форматах шкалы серого.

Наиболее компактным типом данных для хранения двоичной матрицы является uchar или dtype=np.uint8, поэтому вам нужно использовать этот тип данных вместо np.bool.

person ZdaR    schedule 16.06.2017

ndarray.astype('bool')

Эта страница может помочь:

https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.ndarray.astype.html

person Nathan    schedule 25.10.2017
comment
OP запросил решение с использованием CV2 - person Clay Records; 04.03.2019

Если вы используете OpenCV, вам следует подумать об использовании формата hsv для обмолота изображения. Преобразуйте изображение BGR в HSV с помощью cv2.cvtColor(), а затем установите пороговое значение для изображения с помощью функции cv2.inRange().

Вам потребуются значения для верхнего и нижнего пределов для оттенка (h), насыщенности (s) и значения (v). Для этого вы можете использовать этот сценарий или создать свой собственный, используя его в качестве справочника.

Этот скрипт предназначен для возврата значений верхнего и нижнего пределов hsv для ввода видеопотока в реальном времени, но с небольшими настройками вы можете сделать то же самое и с входными изображениями.

Сохраните полученное двоичное (своего рода) изображение с помощью cv2.imwrite(), и вот оно. Вы также можете использовать это двоичное изображение для маскировки. Если у вас остались какие-либо сомнения, вы можете обратиться к этому сценарию, и он должен очистить большинство из них.

person Ajay Jha    schedule 15.07.2019