好的,所以代码是这样的 X1是已加载的高光谱图像,尺寸为(512x512x91) 我想要做的基本上是裁剪64x64x91大小的矩阵,步幅为2。这总共给我提供了49952张图像,每张64x64x91大小,但是当我运行for循环时,出现内存错误。 我的系统有8 GB的内存。
data_images_0=np.zeros((49952,256,256,91))
k=0
for i in range(0,512-64,2):
r=64
print(k)
for j in range (0,512-64,2):
#print(k)
data_images_0[k,:,:,:]=X1[i:i+r,j:j+r,:]
k=k+1
我有一个加载为Mat文件的高光谱图像,尺寸为(512x512x91)。我想使用此图像的大块作为CNN的输入,例如使用64x64x91的农作物。问题是,一旦我从原始图像中创建了农作物,就无法加载数据,因为一次加载所有农作物会给我带来内存错误。 我可以做一些事情来批量加载裁剪的数据,这样我就不会收到这样的内存错误。 我应该将数据转换为其他格式还是以其他方式解决问题?
答案 0 :(得分:2)
您正在寻找matfile
函数。它使您可以访问硬盘上的阵列,然后仅加载其中的一部分。
假设您的图片命名为pic
,则可以执行类似的操作
data = matfile("filename.mat");
part = data.pic(1:64,1:64,:);
%Do something
然后仅将变量(1:64,1:64,:)
的{{1}}部分加载到pic
中。
应始终注意,在硬盘上工作并非十分快,应避免。另一方面,如果您的变量太大而无法容纳在内存中,则没有其他解决方法(除了购买更多的内存)。
答案 1 :(得分:0)
我想您可能想使用matfile
函数,该函数基本上是打开.mat文件而不将其全部内容拉入RAM的。您基本上是从.mat文件中读取一个标头,该标头包含有关存储的元素的信息,例如大小,数据类型等。想象一下您的.mat文件 hyperspectralimg.mat 包含矩阵 myImage 。您必须这样进行:
filename = 'hyperspectralimg.mat';
img = matfile(filename);
A = doStuff2MyImg(img.myImage(1:64,1:64,:)); % Do stuff to your imageparts
img.myImage(1:64,1:64,:) = A; %Return changes to your file
这是一个简短的示例,以防万一您以前没有使用过matfile
的情况。如果您已经使用过它,但是它不起作用,请告诉我们,并作为一般建议,上载有关您的问题的代码段和数据示例,这会有所帮助。
关于标签的快速评论:如果您的关注点是matlab
,则不要标记python
和类似的东西。
答案 2 :(得分:0)
您可以使用numpy内存映射。这等效于MatLAB的matfile。
https://numpy.org/doc/stable/reference/generated/numpy.memmap.html