2012-11-14 5 views
0

Я извлекая очертание сгустка следующим образом:Как масштабировать координаты рамки?

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

, что я хотел бы сделать сейчас, чтобы масштабировать boundaries так, что я могу построить меньшую версию boundaries внутри исходного boundaries. Есть простой способ сделать это?

Вот пример, на который должен выглядеть результат: черный - это исходная ограничивающая рамка, а красный - тот же ограничивающий прямоугольник, только масштабированный (но с тем же центром, что и черный ящик).

enter image description here

EDIT: Я предполагаю, что можно масштабировать каждую точку в отдельности, но я до сих пор центрирования координаты. Есть ли лучший способ сделать это?

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

Возможно, удобнее перетаскивать расстояние от каждой точки до центра? Как в: Вычесть центр из вашей матрицы, перемасштабировать добавить центр. –

ответ

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 

Или вы хотите избежать чего-то неоптимизированного для целей скорости?

+0

отлично! можете ли вы объяснить часть 'com' &' sCom'? – memyself

+0

Извините, теперь он должен работать. Компонент - это только центр масс, который вам понадобится, чтобы занять границы. – solimanelefant

Смежные вопросы