我有几个图像,经过一些基本处理和轮廓检测后,我想将检测到的像素位置及其相邻的邻居值存储到Python数据结构中。我选择 numpy.array
使用以下方法检索每个Image的像素位置:
locationsPx = cv2.findNonZero(SomeBWImage)
将返回一个形状数组(NumberOfPixels,1L,2L):
print(locationsPx[0]) : array([[1649, 4]])
例如。
我的问题是:是否可以将此双数组存储在另一个数组中的单个列上?或者我应该使用列表并将所有数组放在一起?
注意:图像的数据集可能会增加,因此我选择的数据结构的尺寸不仅很大,而且变量
编辑:或者numpy.array不是个好主意,而Pandas Dataframe更适合?我愿意接受那些有更多经验的人的建议。
答案 0 :(得分:1)
Numpy数组非常适合计算。如果数据大小不断变化,则它们不适用于存储数据。正如ali_m指出的那样,numpy中所有形式的数组连接本质上都是缓慢的。最好将数组存储在普通的python列表中:
coordlist = []
coordlist.append(locationsPx[0])
或者,如果您的图像有名称,则最好使用dict
作为图像名称作为键:
coorddict = {}
coorddict[image_name] = locationsPx[0]
无论哪种方式,您都可以轻松地遍历列表的内容:
for coords in coordlist:
或
for image_name, coords in coorddict.items():
pickle
是将结果存储在文件中的便捷方法:
import pickle
with open("filename.pkl", "wb") as f:
pickle.dump(coordlist, f, pickle.HIGHEST_PROTOCOL)
(或与coorddict
相同,而不是协调列表)。
重装也很容易:
with open("filename.pkl", "rb") as f:
coordlist = pickle.load(f)
pickle
有一些安全方面的问题,但是,如果仅加载自己创建的文件,则这些问题将不适用。
如果您发现自己经常添加到以前的腌制文件中,则最好使用备用后端,例如sqlite
。