Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 如何在不同时加载所有图像的情况下使用PARFOR循环进行图像处理_Matlab_Image Processing_Parfor - Fatal编程技术网

Matlab 如何在不同时加载所有图像的情况下使用PARFOR循环进行图像处理

Matlab 如何在不同时加载所有图像的情况下使用PARFOR循环进行图像处理,matlab,image-processing,parfor,Matlab,Image Processing,Parfor,我想使用parfor循环进行图像处理。我对单个图像和图像堆栈执行操作。为了保持低内存使用率,我想避免将所有图像存储在内存中 我从单元格结构变量Imagepaths{}{}开始,该变量包含 单元结构中单元中不同图像的路径function1对所有单个图像进行操作,function2对一组图像进行操作,将它们组合成一个新图像 例如:Imagepaths{}{}包含12个单元格。每个单元格包含一个1x5单元格,其中包含图像路径function2在这样一个1x5图像堆栈上运行 我最初尝试使用以下代码,但变

我想使用parfor循环进行图像处理。我对单个图像和图像堆栈执行操作。为了保持低内存使用率,我想避免将所有图像存储在内存中

我从单元格结构变量Imagepaths{}{}开始,该变量包含 单元结构中单元中不同图像的路径function1对所有单个图像进行操作,function2对一组图像进行操作,将它们组合成一个新图像

例如:Imagepaths{}{}包含12个单元格。每个单元格包含一个1x5单元格,其中包含图像路径function2在这样一个1x5图像堆栈上运行

我最初尝试使用以下代码,但变量Images{}为PARFOR循环提供了一个错误

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”也可以将不必要的信息发送到不同的内核,尽管这并不多。