2017-01-02 3 views
1

私は、(512 x 512)のイメージを、イメージの上の行を持つ(128 x 128)イメージの4つのセグメントにセグメント化しようとしています。次に並列parforループを実行しようとしています。しかし、そうすることはできません。ここに私のコードです。ParIf Loop内でFinalImage変数を使用するには?

FinalImage = ones(512,512); 
%visiblity function initialization, see equation (4) 

parfor imageSegment = 1:8; 

    img = double(imread([filename '.jpg']))./255; 
    img = im2bw(img); 

    if imageSegment == 1 
    img = img(1:128,1:128); 
    [nrow, ncol] = size(img); 
    elseif imageSegment == 2 
    img = img(1:128,129:256); 
    [nrow, ncol] = size(img); 
    elseif imageSegment == 3 
    img = img(1:128,257:384); 
    [nrow, ncol] = size(img); 
    elseif imageSegment == 4 
    img = img(1:128,385:512); 
    [nrow, ncol] = size(img); 

for nMethod = 3:3; 

//Some code 

end 
end 

imwrite(FinalImage, gray(256), [filename '_FinalImage_' num2str(nMethod) '.bmp'], 'bmp'); 

fprintf('close'); 

parforループ内でのfinalImage変数の使用方法??

+0

各サブ画像の最初の行を複製したいと思っていますが、最後の4つの画像の寸法についてはあまりよく分かりません。 512 * 512イメージを512 * 128の4つのサブイメージにスライスしますか?また、 'im2ar'の代わりに' imbinarize'を使用してください.Matlabはそれを使用することをお勧めしません。 – hmofrad

+0

私は唯一のorignalイメージの上の行が必要です.4セグメントの128 x 128 –

+0

率直に言って、私はあなたがこれを行うために 'parfor'を使う必要はないと思います。私はi5 CPUを持っており、以下のコードの 'for'実装では' 0.018 '、 'parfor'では' 0.12'で遅いです。 – hmofrad

答えて

0

並列方法で​​画像の(サイズ128*128の)すべて16のセグメントを抽出するには、次のコードを試してみたいことがありますが:

clear; 
clc 

% #1 image from dataset of standard 512X512 grayscale test images 
% Availabe online at http://decsai.ugr.es/cvg/CG/base.htm 
img = imbinarize(imread('http://decsai.ugr.es/cvg/CG/images/base/1.gif')); 

d = 512; % Needs to be a power of 2 
n = 4; % Needs to be a power of 2 
s = d/n; 
tmp = zeros(s, s); 
ind = 1:s:d; 

% parpool(numel(ind)) 
disp('Process') 
tic 

parfor i = 1:numel(ind) 
    j = ind(mod(i,n)+1); 
    for k = 0:n-1 
     l = ind(mod(k,n)+1); 
     tmp = img(j:j+s-1, l:l+s-1); 
     imwrite(tmp,[num2str((i*n)+1+k),'.jpg']) 
    end 
end 

toc 
disp('done') 

結果は次の順序で16の画像のようになります。

01.jpg | 02.jpg | 03.jpg | 04.jpg 
05.jpg | 06.jpg | 07.jpg | 08.jpg 
09.jpg | 10.jpg | 11.jpg | 12.jpg 
13.jpg | 14.jpg | 15.jpg | 16.jpg 

私はあなたがセグメントn = 2^q任意の数の入力2^m*2^mの任意の画像をして求めることができ、すなわち、パラメトリックな方法でプログラムを書きましたとqは任意の数字です。

imreadオンライン画像を開くには時間がかかります。画像をディスクに保存することができます。また、HPCクラスタを使用している場合は、parpoolのコメントを解除して作業者の数を変更できます。

+0

どのようにすべての16セグメントを取得するには? 128×128のサイズ –

+0

@ワライドアンサリ、私はすべての16セグメントを抽出する答えを変更しました。この時間はあなたのために働くことを願っています! – hmofrad

関連する問題