【发布时间】: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
...因为元素数量不匹配。
我的问题是:
- 当我在 csv 中阅读时,为什么
len会大很多? - 是否有更有效的方法将 3 通道彩色图像像素数据写入可轻松读回的 csv?
【问题讨论】:
-
不确定我是否理解您的问题,但如果您为每个 8 位像素写入一个字节,您将得到一个每个像素有 1 个字节的行。如果您将
186,用于CSV中的ASCII 像素,您将获得每个像素4 个字节-11 个字节,81 个字节,61 个字节和逗号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