2016-07-27 5 views
1

画像処理のためにparforループを使用したいと思います。私は1枚の画像と複数の画像を重ねて操作します。メモリの使用量を低く抑えるために、すべてのイメージをメモリに格納しないようにしたい。すべての画像を一緒にロードすることなく画像処理にPARFORループを使用する方法

Iはセル構造で始まる変数Imagepaths {} {}セル構造でセル内の異なる画像用 パスが含まfunction1はすべての個別の画像で動作し、function2は画像のスタックで動作し、それらを1つの新しい画像に結合します。

たとえば、Imagepaths {} {}には12セルが含まれます。各セルには、画像のパスを含む1×5セルが含まれています。 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 

誰かが、すべての画像を保存するための解決方法について言及できますか。元のコードで

答えて

1

は、あなたがparforループ内Imagepaths用インデックスの二つの形式を持っている、それはあなたが望むものである、スライスを防ぐことができます。スライスされた変数の有効なインデックスフォームについては、the docを参照してください。 parforには、有効なスライスされたインデックスを使用してImagepathsからテンポラリ配列を取り出し、それを操作することがOKであることを確認する最も簡単な方法です。

私が遭遇した2番目の問題は、parforは、parforがオーダー依存であると考える方法で使用されています(厳密に言えば、実際はそうではないと思われます)。それを修正する最も簡単な方法はそうのように、ループの各反復でImagesに新しい空のcellの配列を割り当てることです:

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 
+0

お返事ありがとうございます。実際、あなたのソリューションは、「イメージ」を一時的に強制するだけで、「パーフォ」を得るのに十分です。しかし、 "tmp"を使用することは、多くのことではありませんが、別のコアに不必要な情報を送信することもあります。 –

0

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 
関連する問題