我有一些多页TIFF图像,每个大小>4 GB。我的电脑无法处理imread
的导入,所以我想使用循环一次导入一个页面,做我想做的事情,并在每一步清除内存。我写了这篇关于这种可能性的文章。无论如何,我似乎不能做我想做的事情,因为当我使用info=imfinfo('my_image.tif')
,然后numel(info)
(如我链接的帖子中所建议的),最后一个命令应该告诉我多页TIFF中的页数,但它只输出1。我想这与我创建图像的方式有关:我使用GRASS GIS(结合i.group
和r.out.gdal
功能)。
此外,我从imfinfo
得到的信息显示了不同声音的页数(720):
-
BitsPerSample
(即1x720 double
) -
SamplesPerPixel
(即720
) -
MaxSampleValue
和MinSampleValue
(均为1x720 double
) -
SampleFormat
(即1x720 cell
)
编辑1
我忘了说我的代码是(就像链接):
fname = 'my_file_with_lots_of_images.tif';
info = imfinfo(fname);
num_images = numel(info);
for k = 1:num_images
A = imread(fname, k, 'Info', info);
% ... Do something with image A ...
clear A
end
当我运行它时,MATLAB卡住了。我还尝试设置k = 1:2
来测试两个页面的导入,但程序仍然卡住,我想它不是只导入一个页面,而是同时导入所有页面。图片尺寸:1677x927x720
根据我的经验,Matlab在释放内存方面存在问题,而且它似乎也取决于您使用的操作系统(见这里)。
我会在循环结束时设置一个断点,这样您就可以在一次迭代后检查调试器中是否只导入了image。另外,如果你在调用完clear后马上检查内存,你可能会知道发生了什么。
同样值得注意的可能是尝试其他导入函数,如tiffread2,它是为tiff堆栈优化的,对我来说工作得很好,但我的堆栈小于1GB。