Python 中使用 Pillow、Numpy 导出的 RGB 图像仅为灰度

Exported RGB image with Pillow, Numpy in Python is only greyscale

前言: 你好,我有一个我正在做的项目,我在其中获取视频每一帧的主色,保存该颜色(以 RGB 格式示例:(44, 32, 14) ),然后将这些颜色导出到图像中它是 x 像素乘 x 像素。

这是一个分为两部分的过程(两个独立的程序),我首先采用 this 视频每一帧的最主要颜色,将其保存到一个常规文本文件中,其中行终止符是新队。这已经完成,现在我有一个文本文件,其中包含每一帧的每种主色(总共 5169 帧),我已经检查以确保文本文档中的 RGB 数据不是灰度,它不是' t,这里有几行作为例子:

(18, 9, 17)
(19, 9, 17)
(22, 11, 18)
(23, 11, 18)
(24, 11, 18)
(209, 129, 28)
(212, 135, 31)
(214, 140, 33)
(215, 141, 31)

Here 是 RGB 颜色的完整列表

我的问题:

所以这是我导出图像的代码:

from PIL import Image
from ast import literal_eval as make_tuple
import numpy as np

# Create an array for lines of text file
lines = []
# Open file
with open("myOutFile.txt") as file_in:
    for line in file_in:
        # Strip out new line, turn into Tuple data-type, append to list
        lines.append(make_tuple(line.strip("\n")))

# Convert the pixels into an array using numpy
array = np.array(lines, dtype=np.uint8)

# Create new Image object with non-dynamic 6k,6k image, this doesn't seem to work
new_image = Image.new("RGB", (6000,6000))
# Create image using array
new_image = Image.fromarray(array)
# Save
new_image.save('new.png')

就像我之前说的,渲染出来的图像只是灰度,我知道数据集中有多种颜色。 Here 是输出图像。有点难看,所以您可能想保存并在画图或某些程序中打开它,您可以在其中放大以查看各个像素。

在创建图像对象时,我将其设置为“RGB”模式,结果是灰度。我什至将“Image.fromarray(array)”中的模式设置为 RGB,但仍然得到相同的结果。图像的输出分辨率为 3 x 5169。5169 像素与我获得的帧数完全匹配,如果你看,甚至与视频中摄像机角度变化的时间匹配,这意味着它至少可以工作。但我的另一个问题是,为什么它是 3 像素宽?如果你看一下 here 你会发现这 3 个像素甚至不是相同的颜色......这与 RGB 有什么关系吗?我只希望它是每帧 1 像素 x X 数量,这样我就可以将它放入 Photoshop 并创建更大的照片。

另外,有谁知道我是否可以让它从 X 轴(从左到右,而不是从上到下)导出?

您创建一个二维数组,lines 是 y 轴,元组构成 x 轴。

也就是说,对于给定的数据,您有 9 行和 3 列。每列只有 1 个值,所以它不能是 RGB 颜色,只是一个灰度值。

如果您只需要 1 个像素的 9 行图像,请确保将元组放入数组中。数组将生成 x 轴,然后元组将生成 RGB 颜色。

未测试:

with open("myOutFile.txt") as file_in:
    for line in file_in:
        # Strip out new line, turn into Tuple data-type, append to list
        lines.append([make_tuple(line.strip("\n"))])
#                    ^                            ^  note these array brackets

如果Image.fromArray()不能识别为RGB,你也可以用new_image = Image.fromarray(array, "RGB")

定义模式