在python

时间:2018-02-07 07:31:18

标签: python image pandas csv numpy

我正在尝试编写一个算法,将文件名和存储在每个文件名中的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()重塑从np.array生成的扁平np.tostring(),但我收到错误:

ValueError: string size must be a multiple of element size

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

我的问题是:

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

1 个答案:

答案 0 :(得分:1)

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

如果您使用人类可读的ASCII编写CSV,则需要更多空间。想象一下,第一个像素是186.所以,你会写一个1,一个8,一个6和一个逗号 - 即4个字节现在用于第一个像素而不是单个字节二进制等等。

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

编写CSV没有“更好的方法” - 问题在于这是一种基本上效率低下的格式,专为人而不是计算机而设计。你为什么选择CSV?如果它必须对人类清晰,你别无选择。

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

相关问题