Ho una matrice (immagine) e informazioni sulla parte interessante all'interno dei cerchi (centro corredato e raggi dati). Voglio tagliare per tutti i cerchi le parti della matrice per fare altri calcoli per ogni cerchio. O almeno voglio avere una maschera di bit con tutto il cerchio.MATLAB/Ottava: taglia un sacco di cerchi da un'immagine
Io uso Octave (ma potrebbe anche usare MATLAB ma sarebbe difficile a causa della licenza iusses) e ho il seguente script con alcuni suggerimenti da StackOverflow. Ho informazioni di 20 circoli e ci vogliono circa 0,7 s sul mio Core i5 con 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;
Sai una soluzione più performante in quanto voglio avere circa 600 circoli.
Grazie in anticipo
Si consiglia di considerare le maschere di pre-elaborazione o almeno l'archiviazione in cache fino a una determinata dimensione. Sembra che ci siano molti valori 'r' ripetuti. Quindi ogni volta che calcoli una maschera, calcola la parte circolare e poi la memorizzi in un array di celle o qualcosa del genere, quindi spostala per l'offset centrale per applicarla effettivamente. Quando incontri di nuovo lo stesso r, tira semplicemente la maschera dall'array di celle. – dantswain
correlati: [MATLAB: come ritagliare un cerchio da un'immagine] (http://stackoverflow.com/q/4651778/97160) – Amro