9
votes

Détecter le point central de croix à l'aide de MATLAB

text alt

Bonjour, j'ai une image comme indiqué ci-dessus. Est-il possible pour moi de détecter le point central de la croix et de produire le résultat en utilisant MATLAB? Merci.


0 commentaires

6 Réponses :


0
votes

Je commencerais à utiliser la carte d'image de niveaux de gris. Les points les plus sombres sont sur la croix, si discriminant les valeurs les plus élevées est un point de départ. Après la discrimination, fixez tous les points inférieurs au blanc et laissez le reste comme ils sont. Cela maximiserait le contraste entre les points sur la croix et les points de l'image. Le prochain vers UP est de proposer un filtre pour déterminer la position avec les valeurs moyennes les plus élevées. Je participerais à l'image entière avec un tableau NXM et je prendrais la valeur moyenne au point central. Créez une nouvelle gamme de ces moyens et vous devriez avoir la moyenne la plus élevée à l'intersection. Je suis curieux de voir comment quelqu'un d'autre peut essayer cela!


2 commentaires

Le tableau NXM en marche ... Faites-vous référence à la convolution par un élément structurel?


Techniquement oui. C'est juste une méthode rapide à Code d'extraction de fonctionnalités dans le cas où il existe une valeur extrême monument, dans ce cas, le noir du X. J'ai eu un problème avec cela il y a quelques années. En vérifiant le positionnement des analyses CT, une balle métallique placée à certains points provoquant des stries dans l'image reconstruite. Localiser la position de ceux-ci est simplement suffisant pour trouver la valeur extrême. Donc, au lieu d'un rectangle, un cercle peut être utilisé pour déterminer à la fois le positionnement et l'échelle de l'image.



7
votes

Vous allez. Je suppose que vous avez la boîte à outils image parce que si vous ne le faites pas, vous ne devriez probablement pas essayer de faire ce genre de chose. Cependant, toutes ces fonctions peuvent être mises en œuvre avec des convolutions que je crois. J'ai fait ce processus sur l'image que vous avez présentée ci-dessus et obtenu le point (139, 286) où 138 est la ligne et 268 est la colonne.

1.convert l'image à une image binaire: p> xxx

où img est l'image d'origine. Selon l'image, vous devrez peut-être régler les seconds paramètres (qui varie de 0 à 1) de sorte que vous obtenez seulement la croix. Ne vous inquiétez pas que la croix ne soit pas entièrement connectée, car nous remédions que dans la prochaine étape. P>

2. Dilate l'image pour rejoindre les pièces. Je devais faire cela deux fois parce que je devais régler le seuil si bas sur la conversion d'image binaire (certaines parties de votre image étaient assez sombres). La dilatation ajoute essentiellement des pixels autour des pixels blancs existants (je vais également invoquer l'image binaire comme je l'envoie dans Bwmorph, car les opérations sont faites pour agir sur des pixels blancs qui sont ceux qui ont une valeur de 1). P >

[i,j] = find(bw3);


9 commentaires

Si vous êtes intéressé par une précision du sous-pixel pour déterminer le centre, ce n'est que la première étape. En utilisant le centre déterminé, vous pouvez collecter x et y pour les deux lignes. Maintenant, vous pouvez utiliser PolyFit pour calculer la pente et l'intersection de chaque ligne. De cela, vous pouvez calculer l'intersection.


Parfois, je reçois plus d'un pixel. Y a-t-il un moyen de réduire le nombre jusqu'à ce que je reçoive 1 résultat? Merci.


@Veronica obtenez-vous deux pixels restants ou plus de deux pixels restants?


Parfois, je reçois 2 et parfois 3. merci.


@Veronica sont les 2 ou 3 pixels adjacents les uns aux autres?


Nope, ils ne sont pas adjacents les uns aux autres.


@Veronica alors vous devez ajuster le seuil dans bw = bw2im (img, 0,25); . Vous devez la baisser à quelque chose comme 0.2. Le problème est que vous avez des régions très sombres loin de la croix.


Comme les 10 images que j'aiées sont prises avec un léger mouvement de la croix, y a-t-il un moyen de comparer le pixel du 1er point croisé de sorte que les autres pixels supplémentaires que je reçoivent puissent être éliminés me donnant seulement 1 résultat pour l'autre 9 images? En utilisant le pixel de la 1ère image pour comparer avec la 2e image et à l'aide du pixel de la 2e image à comparer avec la 3ème image, etc. est-ce possible? Merci.


@Veronica Vous devriez probablement simplement poster une nouvelle question à ce sujet. Je ne suis pas complètement sûr de ce que vous demandez. Je reviendrais à cette question cependant dans votre nouvelle question.



1
votes

Je pense qu'il y a un moyen beaucoup plus simple de résoudre ce problème. Les lignes qui forment les cheveux croisés sont de même longueur. Par conséquent, il sera symétrique dans toutes les orientations. Donc, si nous faisons une simple ligne de ligne horizontalement aussi bien que verticalement, pour trouver les extrémités des lignes formant les cheveux croisés. La médiane de ces valeurs donnera les coordonnées X et Y du centre. Géométrie simple.


1 commentaires

Je pense que c'est une bonne idée, mais vous voudriez d'abord la convertir en une carte binaire. Après la conversion, vous pouvez le faire avec un seul passage à travers toute la ligne d'image à la ligne. Gardez simplement une trace du plus éloigné des points de haut en bas, de gauche et de droite qui ont un 1 en eux. Ensuite, à la fin, trouvez la moyenne des quatre points. Bonne idée.



1
votes

J'adore ces discussions sur la façon de trouver quelque chose sans définir d'abord ce que quelque chose est! Mais si je devais deviner, je suggérerais le centre de masse de l'image d'origine grise d'origine.


1 commentaires

Je pense que l'op signifie que le point où les deux lignes de la croix se rencontrent.



1
votes

Qu'en est-il de cela?

a) convertir en binaire juste pour rendre l'algorithme plus rapide.

B) Effectuez une trouvaille sur le tableau résultant

c) Choisissez l'élément qui a l'index de ligne / colonne la plus bas / la plus haute (vous auriez quatre points à choisir parmi alors

d) continuez maintenant à rechercher des voisins

  • avoir un critère global de recherche que si la recherche n'entraîne pas plus de quelques itérations, le point sélectionné est faux et choisissez un autre point extrême

    e) passe le long des points voisins, vous vous retrouverez à un point où vous avez trois voisins possibles. C'est votre intersection


0 commentaires

2
votes

Je viens de rencontrer le même genre de problème et j'ai trouvé d'autres solutions que je voudrais partager:

Supposez que le nom du fichier image est pict1.jpg code>. p>

1.Read Image d'entrée, partie récolte et couverte à l'échelle de gris: p> xxx pré>

2. Iconvert image à une image binaire dans une approche robuste: p>

%Create the Hough transform using the binary image.
[H,T,R] = hough(BW);

%ind peaks in the Hough transform of the image.
P  = houghpeaks(H,2,'threshold',ceil(0.3*max(H(:))));
x = T(P(:,2)); y = R(P(:,1));

%Find lines and plot them.
lines = houghlines(BW,T,R,P,'FillGap',5,'MinLength',7);
figure, imshow(BW), hold on
L = cell(1, length(lines));
for k = 1:length(lines)
    xy = [lines(k).point1; lines(k).point2];
    plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','green');

    % Plot beginnings and ends of lines
    plot(xy(1,1),xy(1,2),'x','LineWidth',2,'Color','yellow');
    plot(xy(2,1),xy(2,2),'x','LineWidth',2,'Color','red');

    %http://robotics.stanford.edu/~birch/projective/node4.html
    %Find lines in homogeneous coordinates (using cross product):
    L{k} = cross([xy(1,1); xy(1,2); 1], [xy(2,1); xy(2,2); 1]);
end

%https://en.wikipedia.org/wiki/Line%E2%80%93line_intersection
%Lines intersection in homogeneous coordinates (using cross product):
p = cross(L{1}, L{2});

%Convert from homogeneous coordinate to euclidean coordinate (divide by last element).
p = p./p(end);
plot(p(1), p(2), 'x', 'LineWidth', 1, 'Color', 'white', 'MarkerSize', 15)
  • Trouver Trouver Centroid (Trouver Centre de masse du cluster blanc) Li>
  • Trouvez deux lignes à l'aide de la transformation de Hough et trouvez le point d'intersection li> ul>

    Résultat sous-pixel de retour des deux solutions. P>

    3.1. Trouver Centre Cross à l'aide de RegionProps (Trouver Centroid): P>

    %Find centroid of the cross (centroid of the cluster)
    s = regionprops(BW, 'centroid');
    centroids = cat(1, s.Centroid);
    
    figure;imshow(BW);
    hold on, plot(centroids(:,1), centroids(:,2), 'b*', 'MarkerSize', 15), hold off
    
    %Display cross center in original image
    figure;imshow(origI), hold on, plot(82+centroids(:,1), 31+centroids(:,2), 'b*', 'MarkerSize', 15), hold off
    


0 commentaires