【问题标题】:Convert a one dimensional dataframe into a 3 dimensional for RGB Image将一维数据帧转换为 RGB 图像的 3 维
【发布时间】:2019-06-07 19:36:06
【问题描述】:

我有一个 2304 列的数据框,因为它是一个 48*48 的图像像素,当我使用此代码将其转换为一个通道时

x = (df.iloc[:,1:].values).astype('float32')

x = x.reshape(-1,48,48,1)

完美的形状输出

(48*48*1)

通过此代码生成精确图像:

plt.imshow(x[0][:,:,0])

我想把它做成一个像三个频道一样的 3Dimentional。我尝试合并 df 3 次并执行此操作(48*48*3) 它成功更改了 df 形状但我无法再次生成图像,

【问题讨论】:

  • 在进入这个问题之前,为什么要使用数据帧来存储图像?为什么不直接使用 numpy ndarrays 呢?
  • 我在 pandas 中感觉很轻松
  • 如果这是唯一的原因,我想你可能想借此机会来获取 numpy 数组。图像与数组搭配得非常好,熊猫与表格数据搭配得非常好。除了非常不理想之外,您会发现 pandas 可能对图像表现不佳,并且大多数基于图像的库都使用数组,(实际上,我所知道的所有都与数组一起使用。它只是存储 RGB 值的正确数据结构)无论如何你都必须转换。
  • 如果您知道如何在 numpy 中执行此操作,您可以告诉我,顺便说一下 reshape 基本上是一个 numpy 函数,我使用了错误的符号 df
  • 谢谢大家,我正在做更多的搜索

标签: python pandas image numpy


【解决方案1】:

1)不要使用熊猫

2) 你不能将 1 通道图像转换为 3 通道,

3) 不要使用 float32,图像通常是 8bit (np.uint8)

4) 将 numpy 与 OpenCV 或 Pillow 结合使用。

5) 不要使用 matplotlib 生成图像。使用 4 中提到的库。

6) 如果你有形状为 (x,y,3) 的数组,那么没有什么比使用 opencv cv2.imshow('image',array) 生成图像更简单了

【讨论】:

  • 抱歉前面不提了,将图像转换成 3 通道没什么大不了的,可以通过这个 backtorgb = cv2.cvtColor(gray,cv2.COLOR_GRAY2RGB) 脚本来完成,为什么我有数据框,因为我有35k 图像,所以我需要一次转换它们
  • 当然图像可以被赋予2个额外的通道,但是你为什么要这样做呢?灰色是灰色的,无论您添加多少频道。唯一的结果是图像更大,处理速度更慢。除非您打算在灰色图像上绘制一些颜色,否则我会让它成为 1 个通道
【解决方案2】:

如果您本质上想要将单通道图像(本质上应该是灰度图像)转换为 3 通道灰度图像,则与沿最后一个轴连接三次相同的图像数组相同。您可以使用np.concatenate 来达到预期的效果。

import numpy as np
a = np.zeros((2304), dtype = np.uint8) #Just a dummy array representing a single pic
single_channel = a.reshape(48, 48, 1)

result = np.concatenate([single_channel,single_channel,single_channel], axis = -1)
print(result.shape) #(48, 48, 3)

此时你应该有一个可以被任何图像库接受的数组。只是抛出一个示例代码来展示如何继续从数组创建图像。

import cv2
cv2.imwrite("hi.jpg", result)

如前所述,使用 numpy 而不是 pandas 进行图像处理。

编辑:如果不幸一开始是从数据框开始的,则始终可以将其转换为一个 numpy 数组,其中每个图像都有一个额外的维度。

import pandas as pd
import cv2
import numpy as np

a = np.zeros((2304), dtype = np.uint8) #dummy row

dummy_df = pd.DataFrame(np.concatenate([a.reshape(1,-1)]*10)) #dummy df with 10 rows.
print(dummy_df.shape) #(10, 2304) 
arr_images = np.array(dummy_df, dtype = np.uint8)
print(arr_images.shape) #(10, 2304)
multiple_single_channel = arr_images.reshape(-1, 48, 48, 1)
print(multiple_single_channel.shape) #(10, 48, 48, 1)
result = np.concatenate([multiple_single_channel] * 3, axis = -1)
print(result.shape) #(10, 48, 48, 3)

for i,img in enumerate(result):
    print(i)
    cv2.imwrite("{}.jpg".format(i), img)
    #do something with image. you PROBABLY don't want to run this for 35k images though.

最重要的是,您不应该使用数据框,即使是多张图片。

【讨论】:

  • 抱歉前面不提了,将图像转换成 3 通道没什么大不了的,可以通过这个 backtorgb = cv2.cvtColor(gray,cv2.COLOR_GRAY2RGB) 脚本来完成,为什么我有数据框,因为我有35k 图像,所以我需要一次转换它们
  • @KhanHassan 将 df 转换为 numpy 数组应该不是问题。你的数据框看起来如何?是 35k 行 2304 列吗?
  • @KhanHassan 这应该让你开始。 numpy 数组可以同时处理多个图像而不会出现问题,毕竟它只是数组。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-04
  • 2015-08-15
  • 1970-01-01
  • 2017-09-15
  • 1970-01-01
  • 2020-12-26
  • 2020-05-15
相关资源
最近更新 更多