2

次の方法でブロブの輪郭を抽出しています。

bw = im2bw(image, threshold);
boundaries = bwboundaries(bw);
plot(boundaries(:, 2), boundaries(:, 1), 'k', 'LineWidth', 2);

私が今やりたいことは、元の の内側のboundaries小さいバージョンをプロットできるようにスケーリングすることです。これを行う簡単な方法はありますか?boundariesboundaries

結果がどのように見えるかの例を次に示します。黒は元のバウンディング ボックスで、赤は同じバウンディング ボックスで、スケーリングされているだけです (ただし、中心はブラック ボックスと同じです)。

ここに画像の説明を入力

編集: 各ポイントを個別にスケーリングできると思いますが、それでも座標を中心に戻す必要があります。これを行うより良い方法はありますか?

scale = 0.7
nbr_points = size(b, 1);
b_min = nan(nbr_points, 2);
for k = 1 : nbr_points
    b_min(k, :) = ([scale 0; 0 scale] * b(k, 1:2)')';
end
4

1 に答える 1

1

これを行う関数を作成するだけで簡単です。

function scaledB = scaleBoundaries(B,scaleFactor)
% B is a cell array of boundaries. The output is a cell array
% containing the scaled boundaries, with the same center of mass
% as the input boundaries.

%%    
for k = 1:length(B)
   scaledB{k} = B{k} .* scaleFactor;
   com = mean(B{k}); % Take the center of mass of each boundary
   sCom = mean(scaledB{k}); % Take the center of mass of each scaled boundary
   difference = com-sCom; % Difference between the centers of mass
   % Recenter the scaled boundaries, by adding the difference in the 
   % centers of mass to the scaled boundaries:
   scaledB{k}(:,1) = scaledB{k}(:,1) + difference(1);
   scaledB{k}(:,2) = scaledB{k}(:,2) + difference(2);
end
end

それとも、速度のために最適化されていないものを避けたかったのでしょうか?

于 2012-11-14T13:37:30.963 に答える