我正在尝试编写一个算法,将文件名和存储在每个文件名中的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
...因为元素数量不匹配。
我的问题是:
len
会大得多?答案 0 :(得分:1)
如果为每个8位像素写一个字节,您将得到一个每像素1字节的行。因此,如果您的图像宽度为80像素,则每行将获得80个字节。
如果您使用人类可读的ASCII编写CSV,则需要更多空间。想象一下,第一个像素是186.所以,你会写一个1
,一个8
,一个6
和一个逗号 - 即4个字节现在用于第一个像素而不是单个字节二进制等等。
这意味着你的文件将大约3-4倍,即110k而不是30k,这就是你所看到的。
编写CSV没有“更好的方法” - 问题在于这是一种基本上效率低下的格式,专为人而不是计算机而设计。你为什么选择CSV?如果它必须对人类清晰,你别无选择。
如果它对人类来说难以辨认,但对计算机来说很容易辨认,请选择其他格式,例如np.save()
和np.load()
- 正如您明智地已经做过的那样; - )