J'ai une matrice (image) et des informations sur une partie intéressante dans les cercles (centre corrins et rayons donnés). Je veux couper pour tous les cercles les parties de la matrice afin de faire plus de calculs pour chaque cercle. Ou au moins je veux avoir un bitmask avec tout le cercle. J'utilise Octave (mais je pourrais aussi utiliser MATLAB mais ce serait difficile à cause des iusses de licence) et j'ai le script suivant avec quelques indications de stackoverflow. J'ai des informations de 20 cercles et il faut compter environ 0,7 s sur mon Core i5 utilisant Octave:MATLAB/Octave: couper beaucoup de cercles à partir d'une image
% 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;
Connaissez-vous une solution plus performante car je veux avoir environ 600 cercles.
Merci à l'avance
Vous pouvez envisager de pré-calculer ou au moins de masquer les masques jusqu'à une certaine taille. Il semble qu'il y ait beaucoup de valeurs 'r' répétées. Donc, chaque fois que vous calculez un masque, calculez la pièce circulaire et ensuite stockez-la dans un tableau de cellules ou quelque chose, puis déplacez-la par le décalage du centre pour l'appliquer réellement. Lorsque vous rencontrez à nouveau le même r, tirez simplement le masque de la matrice de cellules. – dantswain
related: [MATLAB: comment faire un crop circle d'une image] (http://stackoverflow.com/q/4651778/97160) – Amro