【问题标题】:Exported RGB image with Pillow, Numpy in Python is only greyscale用Pillow导出RGB图像,Python中的Numpy只有灰度
【发布时间】:2021-02-25 23:53:49
【问题描述】:

前言: 您好,我正在处理一个项目,我正在处理视频的每一帧的主色,保存该颜色(以 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 有关系吗?我只希望它是每帧 X 量的 1 像素,这样我就可以将它带入 Photoshop 并创建更大的照片。

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

【问题讨论】:

  • new_image = Image.new("RGB", (6000,6000)) 行实际上是无用的,因为您在后面的行中重新分配了变量。

标签: python numpy python-imaging-library rgb


【解决方案1】:

您创建一个二维数组,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") 定义模式

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2014-11-29
  • 2021-08-20
  • 1970-01-01
  • 2021-04-02
  • 1970-01-01
  • 2021-03-04
  • 1970-01-01
  • 2013-09-15
相关资源
最近更新 更多