【问题标题】:Saving/reading color image pixel data in python在 python 中保存/读取彩色图像像素数据
【发布时间】:2018-07-17 09:54:39
【问题描述】:

我正在尝试编写一种算法,将存储在每个文件名中的文件名和 3 通道 np.array 保存到 csv(或类似的文件类型),然后能够读取 csv 并再现彩色图像图片。

我的 csv 格式应该是这样的:

  Filename RGB
0 foo.png  np.array      # the shape is 100*100*3
1 bar.png  np.array
2 ...      ...

就目前而言,我正在遍历保存在目录中的每个文件并附加一个列表,该列表稍后将存储在 pandas.DataFrame 中:

df1= pandas.DataFrame()
df2= pandas.DataFrame()
directory= r'C:/my Directory'
fileList= os.listdir(directory)
filenameList= []
RGBList= []
for eachFile in fileList:
    filenameList.append(eachFile)
    RGBList.append(cv2.imread(directory + eachFile, 1).tostring())
df1["Filenames"]= filenameList
df2["RGB"]= RGBList
df1.to_csv('df1.csv')
df2.to_csv('df2.csv')

df1 可以根据需要发挥作用。我认为 df2 功能符合预期。 print 语句为 csv 的每一行显示正确的 len 30,000。但是,当我使用pandas.read_csv('df2') 读取csv 并使用print 语句查看第一行的len 时,我得到110541。我打算使用np.fromstring()np.reshape() 来重塑扁平的@ 987654331@ 从np.tostring() 生成,但出现错误:

ValueError: string size must be a multiple of element size

...因为元素数量不匹配。

我的问题是:

  1. 当我在 csv 中阅读时,为什么 len 会大很多?
  2. 是否有更有效的方法将 3 通道彩色图像像素数据写入可轻松读回的 csv?

【问题讨论】:

  • 不确定我是否理解您的问题,但如果您为每个 8 位像素写入一个字节,您将得到一个每个像素有 1 个字节的行。如果您将186, 用于CSV 中的ASCII 像素,您将获得每个像素4 个字节-1 1 个字节,8 1 个字节,6 1 个字节和逗号1 个字节.这意味着您的文件将大 4 倍左右,即 110k 而不是 30k。
  • @MarkSetchell 我认为这正是正在发生的事情。有没有更好的方法将数据写入 csv 以避免这个问题?还是我在 read_csv 语句中缺少一些关键字参数?
  • 没有更好的方法来编写 CSV - 问题是这是为人类而不是计算机设计的一种根本低效的格式。为什么选择 CSV?如果它必须对人类可读,你别无选择。如果它对人类来说难以辨认,但对计算机来说很容易辨认,请选择不同的格式。请回答上述问题,我会回复您。
  • @MarkSetchell 它不一定是 CSV。如果有更有效的方法来存储 100x100x3 np.array 并在保留形状的同时读取它,那将完全回答这个问题。
  • 我更像是一个“形象”的人而不是一个“Python”的人,所以我想我最好把这个推荐给你...stackoverflow.com/a/28440249/2836621

标签: python image pandas csv numpy


【解决方案1】:

如果您为每个 8 位像素写入一个字节,您将得到一个每个像素有 1 个字节的行。因此,如果您的图像是 80 像素宽,那么您将获得每行 80 个字节。

如果您使用人类可读的 ASCII 格式编写 CSV,您将需要更多空间。想象第一个像素是 186。因此,您将编写一个1、一个8、一个6 和一个逗号 - 即现在第一个像素为 4 个字节,而不是二进制的单个字节,等等。

这意味着您的文件将大 3-4 倍左右,即 110k 而不是您所看到的 30k。


没有“更好的方法” 来编写 CSV - 问题是这是一种从根本上为人类而不是计算机设计的低效格式。为什么选择 CSV?如果它必须对人类可读,你别无选择。

如果它对人类来说难以辨认,但对计算机来说很容易辨认,请选择不同的格式,例如 np.save()np.load() - 正如您已经明智地所做的那样;-)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-06
    • 1970-01-01
    • 2017-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-07
    • 1970-01-01
    相关资源
    最近更新 更多