Как правильно создать пустое цветное изображение в numpy (RGBA)

Я пытаюсь создать пустое цветное изображение в Numpy, которое включает альфа-канал (RGBA).

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

Итак, мне интересно, как правильно это сделать, как uint16 (вместо uint8) и без смешения цветов? Это ошибка Numpy или я что-то не так делаю?

Мое результирующее изображение: https://i.ibb.co/VVxhDwY/img.png

Мой код:

import cv2
import numpy as np

size = (128, 256)

blank_image = np.zeros((size[0], size[1], 4), np.uint8)

# Make first 10 rows red and opaque
blank_image[:10] = [255,0,0,255]

# Make first 10 columns green and opaque
blank_image[:,:10] = [0,255,0,255]

cv2.imwrite('test.png', blank_image)

OpenCV использует порядок BGR. Все остальные наборы используют RGB, включая PIL, который я использовал в связанном ответе. Вам нужно поменять местами красный и синий с помощью OpenCV. И если вы хотите 16-бит, вам нужно использовать 65 535, а не 255. И вам нужно использовать np.uint16.

Mark Setchell 21.12.2020 19:33

@MarkSetchell спасибо, что указали на это. Я понимаю, что cv2 использует очень странный порядок. Однако я не понимаю, что в другом ответе SO он, казалось, отображался правильно. Нужно ли конвертировать изображение RGBA->BGRA перед сохранением?

correctsyntax 21.12.2020 19:37

O.k. Это имеет смысл, я попробую поменять местами красный и синий.

correctsyntax 21.12.2020 19:38

Кроме того, я собирался упомянуть, что мой вопрос больше связан с тем, как создать пустое цветное изображение RGBA (хотя это было полезно). Пока я просто ищу полупрозрачное красное изображение.

correctsyntax 21.12.2020 19:49

Используйте [0,0,255,128] для полупрозрачного красного с OpenCV.

Mark Setchell 21.12.2020 20:02

Спасибо, это сработало для меня. Вероятно, вам следует опубликовать все это вместе в качестве ответа для других.

correctsyntax 21.12.2020 20:04

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

Mark Setchell 21.12.2020 20:10
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
4
7
674
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Если вместо cv2 вы используете matplotlib.pyplot, ваш код работает отлично (см. ниже), и тогда вы можете просто сохранить его уже с этой библиотекой.

спасибо за Ваш ответ. Однако использование matplotlib для меня не вариант. Мне нужно изображение для обработки изображений, поэтому его нужно сохранить на жесткий диск. Тот факт, что matplotlib показывает это правильно, заставляет меня задуматься, это ошибка или, может быть, ее нужно преобразовать?

correctsyntax 21.12.2020 19:34

Затем, если вам нужен cv2, как прокомментировал @Mark, порядок каналов находится в алфавитном порядке (BGR) вместо обычного (RBG).

Jzbach 21.12.2020 19:44
Ответ принят как подходящий

Ответ, на который вы ссылаетесь, заключался в использовании PIL/Pillow (который использует обычный порядок RGB), а не OpenCV (который использует порядок BGR). Если вам нужен полупрозрачный сплошной красный цвет в 16-битном формате с OpenCV, используйте:

#!/usr/bin/env python3

import cv2
import numpy as np

size = (128, 256)

# Make semi-transparent solid red image
im = np.zeros((*size, 4), np.uint16) + [0,0,65535,128]

# Save to disk
cv2.imwrite('result.png', im)

Другие вопросы по теме