Matlab 如何在不同时加载所有图像的情况下使用PARFOR循环进行图像处理
我想使用parfor循环进行图像处理。我对单个图像和图像堆栈执行操作。为了保持低内存使用率,我想避免将所有图像存储在内存中 我从单元格结构变量Imagepaths{}{}开始,该变量包含 单元结构中单元中不同图像的路径function1对所有单个图像进行操作,function2对一组图像进行操作,将它们组合成一个新图像 例如:Imagepaths{}{}包含12个单元格。每个单元格包含一个1x5单元格,其中包含图像路径function2在这样一个1x5图像堆栈上运行 我最初尝试使用以下代码,但变量Images{}为PARFOR循环提供了一个错误Matlab 如何在不同时加载所有图像的情况下使用PARFOR循环进行图像处理,matlab,image-processing,parfor,Matlab,Image Processing,Parfor,我想使用parfor循环进行图像处理。我对单个图像和图像堆栈执行操作。为了保持低内存使用率,我想避免将所有图像存储在内存中 我从单元格结构变量Imagepaths{}{}开始,该变量包含 单元结构中单元中不同图像的路径function1对所有单个图像进行操作,function2对一组图像进行操作,将它们组合成一个新图像 例如:Imagepaths{}{}包含12个单元格。每个单元格包含一个1x5单元格,其中包含图像路径function2在这样一个1x5图像堆栈上运行 我最初尝试使用以下代码,但变
parfor l = 1:numel(Imagepaths)
for k = 1:numel(Imagepaths{l})
Image = imread(Imagepaths{l}{k});
Images{k} = function1(Image)
end
Image2{l} = function2(Images)
end
我提供了以下解决方案,但缺点是存储所有图像时需要大量内存
parfor l = 1:numel(Imagepaths)
for k = 1:numel(Imagepaths{l})
Image = imread(Imagepaths{l}{k});
Images{l}{k} = function1(Image)
end
end
parfor l = 1:numel(Imagepaths)
Image2{l} = function2(Images{l})
end
是否有人可以提出一种保存所有图像的解决方案。在您的原始代码中,在
parfor
循环中有两种形式的imagepath
索引,这可以防止切片,这正是您想要的。有关切片变量的有效索引形式的详细信息,请参阅。要使parfor
确信您所做的一切正常,最简单的方法是使用有效的切片索引从imagepath
中拉出一个临时数组,然后对其进行操作
我遇到的第二个问题是,临时数组Images
的使用方式是parfor
认为是顺序相关的(严格来说可能是顺序相关的,但我怀疑实际上并非如此)。解决此问题的最简单方法是在循环的每次迭代中将新的空单元格
数组分配给图像
,如下所示:
parfor l = 1:numel(Imagepaths)
tmp = Imagepaths{l}; %# sliced indexing
Images = cell(1, numel(tmp)); %# force "Images" to be "temporary"
for k = 1:numel(tmp)
Image = imread(tmp{k});
Images{k} = function1(Image)
end
Image2{l} = function2(Images)
end
基于Edric的答案,提到临时数组,下面的代码也可以在不使用临时变量“tmp”的情况下工作
parfor l = 1:numel(Imagepaths)
Images = cell(1, number(Imagepaths{l}));
for k = 1:numel(Imagepaths{l})
Image = imread(Imagepaths{l}{k});
Images{k} = function1(Image)
end
Image2{l} = function2(Images)
end
非常感谢你的回答。我发现,实际上你的解决方案,强迫“图像”是临时的,就足以让“parfor”起作用了。但是使用“tmp”也可以将不必要的信息发送到不同的内核,尽管这并不多。