Я пытаюсь создать пустое цветное изображение в 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)
@MarkSetchell спасибо, что указали на это. Я понимаю, что cv2 использует очень странный порядок. Однако я не понимаю, что в другом ответе SO он, казалось, отображался правильно. Нужно ли конвертировать изображение RGBA->BGRA перед сохранением?
O.k. Это имеет смысл, я попробую поменять местами красный и синий.
Кроме того, я собирался упомянуть, что мой вопрос больше связан с тем, как создать пустое цветное изображение RGBA (хотя это было полезно). Пока я просто ищу полупрозрачное красное изображение.
Используйте [0,0,255,128]
для полупрозрачного красного с OpenCV.
Спасибо, это сработало для меня. Вероятно, вам следует опубликовать все это вместе в качестве ответа для других.
Вы можете написать это как ответ и принять его как правильный и получить баллы, если хотите. В противном случае я сделаю это завтра, так как здесь, в Великобритании, уже поздно.
Если вместо cv2
вы используете matplotlib.pyplot
, ваш код работает отлично (см. ниже), и тогда вы можете просто сохранить его уже с этой библиотекой.
спасибо за Ваш ответ. Однако использование matplotlib для меня не вариант. Мне нужно изображение для обработки изображений, поэтому его нужно сохранить на жесткий диск. Тот факт, что matplotlib показывает это правильно, заставляет меня задуматься, это ошибка или, может быть, ее нужно преобразовать?
Затем, если вам нужен cv2, как прокомментировал @Mark, порядок каналов находится в алфавитном порядке (BGR) вместо обычного (RBG).
Ответ, на который вы ссылаетесь, заключался в использовании 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)
OpenCV использует порядок BGR. Все остальные наборы используют RGB, включая PIL, который я использовал в связанном ответе. Вам нужно поменять местами красный и синий с помощью OpenCV. И если вы хотите 16-бит, вам нужно использовать 65 535, а не 255. И вам нужно использовать
np.uint16
.