【问题标题】:Create 1-D numpy array from image从图像创建一维 numpy 数组
【发布时间】:2020-09-10 19:30:58
【问题描述】:

编辑:复制我的评论为问题提供更多背景

我忘记提到的一件重要的事情是我的最终目标是添加这个 作为熊猫数据框的列。我在尝试时遇到错误 由于不止一个,将像素数组按原样放入数据帧 维度。

我有一个 32x32 的图像,我想将其展平为一个 1-D numpy 数组,该数组表示一个在该像素处具有 RGB 值的对象。

img = Image.open(img_path)
pixels = np.asarray(img)
width, height = img.size
pixels = pixels.reshape(width * height, 3)

目前这是我能做的最好的事情,而不会丢失一个对象中的 RGB 值分组。然而,通过这个实现,我得到一个二维数组,每个元素都是这样的 RGB 值数组。

shape: (1024, 3)
[[255 255 255]
 [255 255 255]
 [255 255 255]
 ...
 [255 255 255]
 [255 255 255]
 [255 255 255]]

我希望我的数组具有(1024,1) 的形状,并且每个元素都是 RGB 值的某个对象(可能是一个元组?)。谢谢。

【问题讨论】:

  • 这基本上 是 你所拥有的,但每个 (r,g,b) 像素都是一个 numpy 数组,而不是一个元组。如果您必须有一个元组,请执行pixels = [tuple(x) for x in pixels]。不过,我不确定您为什么要这样做:您将失去 numpy 的所有方便的数组切片功能。还是我误解了这个问题?
  • 我忘记提及的一件重要事情是我的最终目标是将其作为一列添加到熊猫数据框中。由于多个维度,尝试将像素数组按原样放入数据帧时出现错误。
  • 在下面查看我的答案

标签: python image numpy python-imaging-library numpy-ndarray


【解决方案1】:

参考注释,数组作为数据框或系列:

dataframe = pd.DataFrame(pixels)   # As a dataframe with one column per color channel
column = dataframe.apply(tuple, axis=1)  # As a Series of (r,g,b) tuples

如果您愿意,您可以将column 用作另一个数据框的列

【讨论】:

  • 谢谢!为什么tuple充当apply函数的函数?
  • 一般来说,您可以将 python 的内置类型实例化为 literals,例如(1,2,3),它被解释为一个元组,或者通过 constructors,例如tuple(1,2,3) 明确类型。在您的情况下,apply 方法正在获取每个元素并将其作为参数传递给 tuple 构造函数。具有 lambda 函数的等效(尽管不必要)版本是 dataframe.apply(lambda x: tuple(x)),这使得构造函数的作用更加明显。
猜你喜欢
  • 2023-01-04
  • 2019-06-09
  • 2017-12-28
  • 2016-03-23
  • 1970-01-01
  • 2016-09-06
  • 2013-02-20
  • 2018-10-16
相关资源
最近更新 更多