2013-04-14 2 views
0

J'ai une collection de nombreux points disposés de façon uniforme en forme de grille. Compte tenu de ces points, comment puis-je détecter les propriétés de cette grille, telles que la rotation, l'espacement entre les lignes, etc.? S'il y avait un algorithme pour ajuster de nombreuses lignes parallèles et perpendiculaires à ces données, alors je pourrais faire la moyenne de la distance entre les lignes, l'angle, et ainsi de suite. Quelle est la meilleure façon de procéder?Détection de l'orientation et des propriétés de la grille

MISE À JOUR: Les données que je travaille avec ressemble à peu près comme ceci:

enter image description here

Il sera plus propre à l'avenir, mais je dois tout simplement une façon de interpoler et d'analyser cette grille comme modèle.

+0

À quoi ressemble la grille? Si c'est rectangulaire alors la solution sera plus facile. – Justin

+0

Il est en effet rectangulaire. Je travaille avec des données qui ressemblent à ceci: http://www-personal.umich.edu/~schmatz/grid.jpg – schmatz

+0

Si vous pouvez réellement façonner la grille et lui garantir un rectangle, le point en haut à gauche sera la distance la plus proche de l'origine (supposée être en haut à gauche de l'image). Le point en bas à droite sera la distance la plus éloignée de l'origine. Vous pouvez former une ligne entre ces deux points; le point le plus éloigné de cette ligne sera le point en bas à gauche ou en haut à droite de la grille. Avec ces points, vous pouvez calculer la rotation de la grille. Vous pouvez voir comment j'ai utilisé ceci dans ma réponse ici: http://stackoverflow.com/questions/15604485/sorting-2d-points-into-a-matrix/15604867#15604867 – Justin

Répondre

1

Si les points sont placés sur une grille, puis la distance au carré entre 2 points est d ² × ( m ²   +   n ²) où d est la constante de grille (supposons que il s'agit d'une grille rectangulaire 2D avec la même constante dans les deux directions principales) et m, n sont des nombres entiers définissant la différence (affine) entre les deux points (ou, plus simplement, le nombre d'intervalles de grille entre les deux points le long du "x" et "y" axes) Donc:

  • calculer les distances au carré entre un point et tous les autres points;
  • en les divisant au minimum un, vous obtiendrez des nombres rationnels que vous donner des conseils au sujet de la grille constante d et les « coordonnées » par rapport m, n.
+0

Merci! Cela devrait vraiment aider. – schmatz

0

Si vous avez seulement l'image de la grille, vous pouvez essayer la fonction radon de "Boîte à outils de traitement d'image". Il vous donnera des angles et de la transformation de radon, vous pouvez recalculer la distance entre les lignes de points sur votre image.

Voici un exemple de code pour radon fonction

% First we generate a grid of points on image 
ImgW  = 400; 
ImgH  = 300; 
DIdx     = ImgH + round(rand(1)*ImgH/10); 
ImgGrid     = zeros(ImgH,ImgW); 
ImgGrid(1:DIdx:end)  = 1; 

% Then we calculate radon transform 
theta     = 0:0.1:180; 
[R,xp]     = radon(ImgGrid,theta); 

% Then we calculate standard deviation for each angle of R 
Rstd     = std(R); 
% and find maximal value of std(R) columnwise 
[RstdMax,RstdIdx]  = max(Rstd); 
ThMax     = theta(RstdIdx); 

% Now we show results 
figure('Color','w'); 
subplot(2,2,1);  imshow(ImgGrid); 
        axis on; 
        colormap(hot(255)); 
        title('Grid image'); 
        line(ImgW/2+[-1 +1]*min(ImgW,ImgH)/2*cosd(-ThMax), ... 
          ImgH/2+[-1 +1]*min(ImgW,ImgH)/2*sind(-ThMax), 'Color','y'); 
subplot(2,2,3);  plot(xp,R(:,RstdIdx),'.-'); 
        title(sprintf('Profile at %.2f deg (the yellow line)',ThMax)); 

subplot(2,2,2);  imagesc(log10(R+1), 'Xdata',theta, 'Ydata',xp); 
        axis on; 
        colormap(hot(255)); 
        xlabel('\theta (degrees)'); 
        ylabel('x'''); 

subplot(2,2,4);  plot(theta,Rstd,'.-'); 
        title('std(R)'); 

MAIS en cas général, ce ne vous donnera pas des vecteurs treillis pour la grille! Cela vous donnera seulement la distance entre les lignes de points à la place. Si vous avez besoin de vecteurs en réseau, vous devez les recalculer. Mais si vous êtes assez chanceux et que votre treillis est rectangulaire ... j'espère que vous avez compris: o)

Vous avez encore plus de chance si vous avez les coordonnées (x, y) de vos points. L'approche que CST-Link proposée est quelque peu "trop ​​brutale". Je préférerais calculer le "facteur de structure" pour vos points (voir http://en.wikipedia.org/wiki/Structure_factor et les liens du tutoriel à la fin de l'article) et analyser ses maxima.

+0

Merci! Je vais regarder dans ça :) – schmatz

Questions connexes