MATLAB/Octave: вырезать много кругов из изображения

У меня есть матрица (изображение) и информация об интересной части внутри окружностей (даны центральные кординаты и радиусы). Я хочу вырезать для всех окружностей части матрицы, чтобы сделать некоторые дополнительные вычисления для каждой окружности. Или, по крайней мере, я хочу иметь битовую маску со всеми окружностями.

Я использую Octave (но мог бы также использовать MATLAB, но это было бы сложно из-за лицензионных iusses) и у меня есть следующий скрипт с некоторыми подсказками из stackoverflow. У меня есть информация о 20 кругах, и это занимает около 0,7 с на моем Core i5 с использованием Octave:

% image
dim_x = 1000;
dim_y = 1000;
A=rand(dim_x,dim_y);

% center positions and ...
c = [222 111; 878 112; 81 718; 89 112; 222 111; 878 112; 81 718; 89 112; 222 111; 878 112; 81 718; 89 112; 222 111; 878 112; 81 718; 89 112; 222 111; 878 112; 81 718; 89 112];
%...  radii of the circles
r = [10 33 55 2 22 10 33 55 2 22 10 33 55 2 22 10 33 55 2 22];

tic;
for i=1:size(c,1)
    % create a bitmask ...
    mask = bsxfun(@plus, ((1:dim_y) - c(i,1)).^2, (transpose(1:dim_x) - c(i,2)).^2) < r(i)^2;
    % ... cut the circles out of the image
    B=A.*mask;
end;
toc;

Знаете ли вы более производительное решение, поскольку я хочу иметь около 600 кругов.

Спасибо заранее

5
задан 28 September 2011 в 13:50
поделиться