Tengo una matriz (imagen) e información sobre la parte interesante dentro de los círculos (corrdinates del centro y radios dados). Quiero cortar para todos los círculos las partes de la matriz con el fin de hacer algunos cálculos más para cada círculo. O al menos quiero tener una máscara de bits con todo el círculo.MATLAB/Octave: corta muchos círculos de una imagen
Uso Octave (pero también podría usar MATLAB pero sería difícil debido a licencia iusses) y tengo el siguiente script con algunos consejos de stackoverflow. Tengo información de 20 círculos y se tarda unos 0,7 s en mi Core i5 utilizando 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;
¿Conoce a una solución con más prestaciones ya que yo quiero tener unos 600 círculos.
Gracias de antemano
Es posible que desee considerar la precomputación o al menos las máscaras de caché hasta un determinado tamaño. Parece que hay muchos valores 'r' repetidos. Por lo tanto, cada vez que calcule una máscara, calcule la parte circular y luego guárdela en una matriz de celdas o algo así, luego cámbiela por la compensación central para aplicarla realmente. Cuando te encuentres con la misma r otra vez, simplemente saca la máscara de la matriz de celdas. – dantswain
relacionado: [MATLAB: cómo recorto un círculo de una imagen] (http://stackoverflow.com/q/4651778/97160) – Amro