4

Ich versuche, einen Weg zu finden, die Eckpunkte zu diesem Binärbild in MatlabMatLab: Eckenerkennung auf Binärbild

Binary Image

ich einen Weg zu finden, haben versucht zu finden, ein Dreieck über passen dieses Bild und die Vertices finden. Ich habe versucht, Ecken zu finden, aber die Werte, die es zurückgibt, sind nicht immer korrekt.
Gibt es eine Möglichkeit, die Kanten zu schärfen, damit die Eckenfunktion bessere Ergebnisse liefern kann?

Ich schätze jeden Eingang! Vielen Dank!

enter image description here

Welche Strategie scheint einfacher und effizienter? Welche bestehenden MatLab-Funktionen könnte ich verwenden?

+1

wie viele/welche Ecken möchten Sie erkennen? Kannst du ein Bild mit den skizzierten Ecken hinzufügen? –

+0

Es sollte 3 Ecken geben und ich habe einen Anhang zur ursprünglichen Frage hinzugefügt. – user3315340

+0

Kennt jemand eine Möglichkeit für mich, die drei Ecken zu erkennen? Ich habe mir einen Blick in die Zukunft geworfen, aber ich bin mir nicht sicher, wie ich es richtig anwenden soll. – user3315340

Antwort

2

Anstatt Bildverarbeitung Ansatz, versuchen wir einen eher algebraischen Ansatz.

Sie haben weiße Pixel - 2D-Punkte in einer Ebene, und Sie möchten drei Halbebenen (gerade Linien) finden, die diese Punkte am besten vom Rest der Ebene trennen.

So lassen Sie uns

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 

Für Stabilität beginnen wir den Mittelwert aller Punkte subtrahieren - um den Ursprung, die weißen Pixel Zentrierung:

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

Nun kann eine Linie durch zwei Parameter beschrieben werden , alle Punkte (x, y), die L(1)*x + L(2)*y = 1 erfüllen. Um eine Linie zu finden, in der alle Punkte genau auf einer Seite liegen, muss diese Ungleichung für alle Punkte (x,y) der Menge gelten: L(1)*x + L(2)*y <= 1. Wir können diese Ungleichheiten zwingen und für die meisten enge Halbebene suchen L, dass diese Einschränkung erfüllen mit 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)); 

Beachten Sie, wie durch das quadratische Optimierungsziel zu ändern f, wir sind in der Lage verschiedene Halbebene zu erhalten, die weiße Pixel Trennung .

Sobald wir die drei Linien haben, können wir die Schnittpunkte erhalten (sie zurück vom Ursprung durch mm Verschiebung):

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

können Sie sehen, verwenden Sie die Ergebnisse

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

Der Code funktioniert gut auf einigen der Bilder, die ich habe, aber es scheint einige Probleme zu haben, wenn ich ihm bestimmte Bilder wie dieses gebe: http://imgur.com/qqg3cKS Gibt es eine Möglichkeit das Problem zu beheben? – user3315340

+0

@ user3315340 ein bisschen mit dem 'f' Begriff in' quadprog' (das zweite Argument) zu spielen ergibt sich mit verschiedenen Lösungen, für das Bild, das Sie gesendet haben 'L3 = Quadprog (Auge (2), [-1; 1], mA, Einsen (n, 1)); ergibt die gewünschte Lösung. – Shai

0

Sie können das minimale umschriebene Dreieck Dreieck finden.

Zuerst berechnen Sie die konvexe Hülle des Blobs.

Dann versuchen Sie alle eindeutigen Wahlen von drei Seiten des Rumpfes, verlängern Sie die Seiten, indem Sie die paarweisen Überschneidungen berechnen und behalten Sie das Dreieck mit dem kleinsten positiven Bereich.

enter image description here