4

Je suis en train de trouver un moyen de trouver les points d'angle sur cette image binaire dans MatLabMatLab: détection d'angle sur l'image binaire

Binary Image

J'ai essayé de trouver un moyen d'installer un triangle sur cette image et de trouver les sommets. J'ai essayé de trouver des coins mais les valeurs qu'il renvoie ne sont pas toujours correctes.
Y a-t-il un moyen d'affiner les bords de sorte que la fonction de coin puisse donner de meilleurs résultats?

J'apprécie toute entrée! Merci!

enter image description here

Quelle stratégie semble plus facile et plus efficace? Quelles fonctions MatLab pourrais-je utiliser?

+1

combien/quel coins voulez-vous détecter? pouvez-vous ajouter une image avec les coins décrits? –

+0

Il devrait y avoir 3 coins et j'ai ajouté une pièce jointe à la question originale. – user3315340

+0

Quelqu'un sait-il un moyen pour moi de détecter les trois coins? J'ai regardé dans houghline mais je ne suis pas sûr de savoir comment l'utiliser correctement. – user3315340

Répondre

2

Au lieu d'une approche de traitement d'image, nous allons essayer une approche plus algébrique.

Vous avez des pixels blancs - points 2D sur un plan, et que vous souhaitez trouver trois demi-plans (lignes droites) que ces points plus séparés du reste du plan.

Alors, commençons

img=imread('http://i.stack.imgur.com/DL2Cq.png'); %// read the image 
bw = img(:,:,1) > 128; %// convert to binary mask 
[y x] = find(bw); %// get the x-y coordinates of white pixels 
n=numel(x); %// how many do we have 

Pour la stabilité, nous soustrayons la moyenne de tous les points - centrage des pixels blancs autour de l'origine:

mm = mean([x y],1); 
mA = bsxfun(@minus, [x y], mm); 

Maintenant, une ligne peut être décrite par deux paramètres , tous les points (x, y) qui satisfont L(1)*x + L(2)*y = 1. Afin de trouver une ligne dont tous les points sont strictement d'un côté, cette inégalité doit correspondre à tous les points de l'ensemble: . Nous pouvons forcer ces inégalités et rechercher la moitié plus serré plan L qui remplissent cette contrainte en utilisant quadprog:

L1 = quadprog(eye(2), -ones(2,1), mA, ones(n,1)); 
L2 = quadprog(eye(2), ones(2,1), mA, ones(n,1)); 
L3 = quadprog(eye(2), [1; -1], mA, ones(n,1)); 

Notez comment en changeant la cible d'optimisation quadratique f, nous sommes en mesure d'obtenir différents plans de demi séparant les pixels blancs .

Une fois que nous avons les trois lignes, nous pouvons obtenir les points d'intersection (les déplacer en arrière de l'origine par mm):

x12=inv([L1';L2'])*ones(2,1)+mm'; 
x23=inv([L3';L2'])*ones(2,1)+mm'; 
x13=inv([L3';L1'])*ones(2,1)+mm'; 

Vous pouvez utiliser voir les résultats

imshow(bw,'border','tight'); 
hold all; 
%// plot the lines 
ezplot(gca, @(x,y) L1(1)*(x-mm(1))+L1(2)*(y-mm(2))-1, [1 340 1 352]); 
ezplot(gca, @(x,y) L2(1)*(x-mm(1))+L2(2)*(y-mm(2))-1, [1 340 1 352]); 
ezplot(gca, @(x,y) L3(1)*(x-mm(1))+L3(2)*(y-mm(2))-1, [1 340 1 352]); 
%// plot the intersection points 
scatter([x12(1) x23(1) x13(1)],[x12(2) x23(2) x13(2)],50,'+r'); 

enter image description here

+0

Le code fonctionne très bien sur certaines des images que j'ai, mais il semble rencontrer quelques problèmes si je lui donne certaines images comme celle-ci: http://imgur.com/qqg3cKS Y at-il moyen de résoudre ce problème? – user3315340

+0

@ user3315340 jouer un bit avec le terme 'f' dans' quadprog' (le second argument) donne des solutions différentes, pour l'image que vous avez envoyée 'L3 = quadprog (oeil (2), [-1; 1], mA, ceux (n, 1)); 'donne la solution désirée. – Shai

0

Vous pouvez trouver le triangle circonscrit au minimum.

calcule d'abord la coque convexe du blob.

essayer ensuite tous les choix distincts de trois côtés de la coque, étendent les côtés par le calcul des intersections par paires et garder le triangle avec la plus petite zone positive.

enter image description here