【问题标题】:How to properly create an blank colored image in numpy (RGBA)如何在numpy(RGBA)中正确创建空白彩色图像
【发布时间】:2020-12-21 17:54:06
【问题描述】:

我正在尝试在 Numpy 中创建一个包含 Alpha 通道 (RGBA) 的空白彩色图像

为了了解如何做到这一点,我来到this SO answer。但是,当我运行 SO 答案的任一示例时,red 显示为 blue,与答案中显示的图像不同。

所以,我想知道这样做的正确方法是作为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
  • @MarkSetchell 感谢您指出这一点。我明白 cv2 使用了一个非常奇怪的顺序。但是,我不明白的是,在另一个 SO 答案中,它似乎正确显示。保存前需要转换图片RGBA->BGRA吗?
  • 好吧,有道理,我会尝试翻转红色和蓝色。
  • 另外,我要提到我的问题更多地与如何创建空白的彩色 RGBA 图像(尽管这很有帮助)有关。目前,我只是在寻找半透明的红色图像。
  • [0,0,255,128] 用于 OpenCV 的半透明红色。

标签: python image numpy rgba


【解决方案1】:

您链接到的答案是使用 PIL/Pillow(使用传统 RGB 排序)而不是 OpenCV(使用 BGR 排序)。如果您想要使用 OpenCV 的 16 位半透明纯红色,请使用:

#!/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)

【讨论】:

    【解决方案2】:

    如果您使用matplotlib.pyplot 而不是cv2,则您的代码运行良好(见下文),然后您可以简单地将其存储在此库中。

    【讨论】:

    • 感谢您的回答。但是,使用 matplotlib 对我来说不是一个选择。我需要图像用于图像处理目的,因此需要将其保存到硬盘驱动器中。 matplotlib 正确显示它的事实让我想知道这是一个错误还是需要转换?
    • 然后,如果您需要 cv2,正如@Mark 评论的那样,频道排序是按字母顺序 (BGR) 而不是通常的 (RBG)。
    猜你喜欢
    • 2018-08-19
    • 1970-01-01
    • 2013-08-30
    • 2012-05-21
    • 2012-05-14
    • 1970-01-01
    • 1970-01-01
    • 2015-07-09
    • 1970-01-01
    相关资源
    最近更新 更多