2017-05-11 10 views
0

私はそれぞれD(Points)をどのように取ることができますか(8つのconnexで)connexedポイントを見てみましょうが、限界の側に(対角線の上と下の右と右に同じ線、すなわち3点8を接続)を選択し、Dの最小値を持つ連結点の座標を選択します。Dの最小値が0に等しくなるまでこれを繰り返します。接続されたポイントと最小値

% Creation of matrix example 
    c=zeros(500,500); 
    c(1:100,250)=1;c(100:300,200)=1;c(300:400,270)=1; c(400:500,250)=1; 
    c(100,200:250)=1;c(300,200:270)=1;c(400,250:270)=1; 

    figure, imagesc(c) 


    Points= [211,388;64,200;160,437;237,478;110,270;100,34]; 
    hold on, plot(Points(:,1),Points(:,2),'ro'), hold off 

    %Distance map 
    D = bwdist(cumsum(c, 2) > 0, 'euclidean'); 
    figure, imagesc(D) 

答えて

0

ここで重要な機能は、添え字を線形インデックスに変換するsub2indです。配列内の特定の点で作業する必要がある場合は非常に便利です。

% Let's prepare the 8 shifts needed (i add a no-move shift in first place to simplify the algorithm) 

delta_x = [0, -1, -1, -1, 0, 0, 1, 1, 1]; 
delta_y = [0, -1, 0, 1, -1, 1, -1, 0, 1]; 

sz_D = size(D); 
n_points = size(Points, 1); 
is_running = true; 

while is_running 
    % All the shift combinaisons 
    new_ind_x = bsxfun(@plus, Points(:,1), delta_x); 
    new_ind_y = bsxfun(@plus, Points(:,2), delta_y); 

    % Saturation to stay in the image 
    new_ind_x = min(max(new_ind_x, 1), sz_D(2)); 
    new_ind_y = min(max(new_ind_y, 1), sz_D(1)); 

    % Get the values in D and find the index of the minimum points 
    points_lin_ind = sub2ind(sz_D, new_ind_y, new_ind_x); 
    points_val = D(points_lin_ind); 
    [min_values, min_ind] = min(points_val, [], 2); 

    % Select subscripts in new_ind_x and new_ind_y 
    min_lin_ind = sub2ind([n_points, 9], (1:n_points).', min_ind); 
    Points = [new_ind_x(min_lin_ind), new_ind_y(min_lin_ind)]; 

    % Exit condition 
    if all(min_values == 0) 
     is_running = false; 
    end 
end 

PS:テストされていません。

関連する問題