2011-10-18 10 views
0

John BurkardtのCONTRAST2_SPMDという修正版を使用して、大きなグレースケール画像に対して3x3分散計算を実行しています。これの利点は、PCTを使用してローカルマシン上に8つのコアを使用できることですが、ウィンドウサイズ(現在は3x3)を変更したいのですが、いくつかのウィンドウサイズを試してみたいと思います。可変ウィンドウサイズを可能にするために、以下のコードをどのように変更すればよいですか?任意の助けを事前にMATLAB SPMDとnlfilter - ウィンドウのサイズを変更する

function y = parwinvar (x) 

%************************************************************************** 
% 
% 
%% PARWINVAR uses MATLAB's SPMD command for parallel windowed variance. 
% 
% Discussion: 
% Calculates windowed standard deviation (squared to get variance). 
% Based on CONTRAST2_SPMD by John Burkardt. 
% 
% 
% Parameters: 
% 
% Input, image X, the initial black and white image. 
% Output, image Y, the contrast-enhanced black and white image. 
% 
% 
% 
% Open the matlabpool 
% 
    matlabpool open local 8 
% 
% Check image is grayscale, if not covert it 
% 
    if ndims(x)>2 
     x=rgb2gray(x); 
    end 
% 
% Since the image is black and white, it is a 2D array. 
% Hence, it will be distributed by columns. 
% 
    xd = distributed (x); 
% 
% Have each worker enhance the contrast in its portion of the picture. 
% 
% You will see lots of meaningless error messages, because NLFILTER 
% wants to put out a "waitbar" telling you to wait. But the workers 
% don't have an associated display. 
% 
    spmd 

    xl = getLocalPart (xd); 
% 
% In order to use LABSENDRECEIVE, we need to reference the previous 
% and next labindex. 
% 
    if (labindex ~= 1) 
     previous = labindex - 1; 
    else 
     previous = numlabs; 
    end 

    if (labindex ~= numlabs) 
     next = labindex + 1; 
    else 
    next = 1; 
end 
% 
% Each worker sends its first column to the previous worker, 
% and receives corresponding data from the next worker. 
% 
column = labSendReceive (previous, next, xl(:,1)); 

if (labindex < numlabs) 
    xl = [ xl, column ]; 
end 
% 
% Each worker sends its last column to the next worker, 
% and receives corresponding data from the previous worker. 
% 
column = labSendReceive (next, previous, xl(:,end)); 

if (1 < labindex) 
    xl = [ column, xl ]; 
end 
% 
% Now do the enhancement. 
% We can only do a 3x3 neighborhood, because we're only sending 
% one column to the left and right. 
% 
xl = nlfilter (xl, [3,3], @std2); 
% 
% Now strip off the extra columns. 
% 
    if (1 < labindex) 
     xl = xl(:,2:end); 
    end 

    if (labindex < numlabs) 
     xl = xl(:,1:end-1); 
    end 

    xl = uint8 (xl); 

    end 
% 
% We are working with a black and white image, so we can simply 
% concatenate the submatrices to get the whole object. 
% 
    y = [ xl{:} ]; 
    y = (y .* y); % square to get variance 
% Close matlabpool 
matlabpool close 
    return 
end 

おかげで(私は、例えば3x3,5x5,7x7,9x9など、奇妙な、正方形の窓を使用することになります)。

答えて

1

さらに多くのデータを送信するには、labSendReceive行を変更する必要があります。特に、このような何か:

N(blocksize-1)/2ある
% 
% Each worker sends its first N columns to the previous worker, 
% and receives corresponding data from the next worker. 
% 
columns = labSendReceive (previous, next, xl(:,1:N)); 

% 
% Each worker sends its first column to the previous worker, 
% and receives corresponding data from the next worker. 
% 
column = labSendReceive (previous, next, xl(:,1)); 

はなっている必要があります。右側の「ゴーストセル」を送信するときと、「余分な列」を取り除くときに対応する変更があります。

+0

ありがとうございます!私はここに戻ってチェックする前に、私はそれを解読することができたが、その同じ修正。 – MBL

関連する問題