WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Kantendetektion: Position der Kante in Bildmatrix bestimmen

 

petermueller46
Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 08.05.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.05.2015, 13:08     Titel: Kantendetektion: Position der Kante in Bildmatrix bestimmen
  Antworten mit Zitat      
Hallo,
ich bin noch recht frisch im Arbeiten mit Matlab und sitze nun an meinem ersten größeren Projekt. Ich will kontollieren ob eine CCD Kamera wackelt. Die Idee: Ich zerlege das aufgenommene Filmmaterial in Einzelbilder, suche mir ein paar charakteristische Kanten heraus die nicht von sich aus wackeln sollten (Häuserwände) und bestimme deren Position. Die Positionen in den verschieden Bildern sollten also konstant sein, dh. der Plot Position auf Zeit eine zur x-Achse parallele Gerade sein.

Mein Vorgehen will ich an einem vereinfachten Beispiel überprüfen:

Code:
       

clear all;
close all;
clc;


A= [0,0,0,0,0,0,0,0;...
    0,0,0,0,0,0,0,0;...
    0,0,0,0,0,0,0,0;...
    0,0,0,0,0,0,0,0; ...
    1,1,1,1,1,1,1,1;...
    2,2,2,2,2,2,2,2; ...
    3,3,3,3,3,3,3,3;...
    3,3,3,3,3,3,3,3];

% A= [0,0,0,0,0,0,0,3;...
%     0,0,0,0,0,0,2,3;...
%     0,0,0,0,0,2,3,3;...
%     0,0,0,0,1,2,3,3; ...
%     0,0,0,1,2,2,3,3;...
%     0,0,1,1,2,3,3,3; ...
%     0,1,1,2,3,3,3,3;...
%     0,1,2,3,3,3,3,3];
   
[Gx, Gy]=imgradientxy(A);
G=(Gx.^2+Gy.^2).^(1/2);
 


Ich sehe mir also ersteinmal zwei sehr einfache Kanten an, bevor ich mich auf das tatsächlich aufgenommene Bildmaterial stürze (wo ich mir dann Einzelkanten mit imcorp herauspicken will).

Und nun das Problem, an dem ich gerade Verzweifele: Kanten zeigen sich ja durch einen großen Gradienten. Man müsste also nur eine Gerade durch den Schwerpunkt der Werte dieser Matrix legen und sich die (x,y) Positionen ausgeben lassen. Das muss doch irgendwie gehen!?!

Versuch:

Die Matrix als 3d plot darzustellen und zu fitten. Fitfunktion auf ihr Maximum hin untersuchen:


Code:
   


[m,n]=size(G);
[X,Y]=meshgrid(1:m,1:n);
f=G(:);


surf(X,Y,G)
[xData, yData, zData] = prepareSurfaceData( X, Y, G );

% Set up fittype and options.
ft = fittype( 'C*exp(-(x-x0)^2/(2*sigmax^2)-(y-y0)^2/(2*sigmay^2))', 'independent', {'x', 'y'}, 'dependent', 'z' );
opts = fitoptions( 'Method', 'NonlinearLeastSquares' );
opts.Display = 'Off';
opts.StartPoint = [10 10 10 10 10];

% Fit model to data.
[fitresult, gof] = fit( [xData, yData], zData, ft, opts );

% Plot fit with data.
figure( 'Name', 'Gaussfit an die Kante' );
h = plot( fitresult, [xData, yData], zData );
legend( h, 'Gaussfit an die Kante', 'G vs. X, Y', 'Location', 'NorthEast' );
% Label axes
xlabel X
ylabel Y
zlabel G
grid on
view( 68.5, -4.0 );

coeffnames(ft)
formula(ft)
 coeff= coeffvalues(fitresult)



 



Das mit dem Gaussfit funktioniert für die erste Kante klappt ganz gut, verasagt aber schon bei der zweiten, etwas komplizierteren (siehe Bilder). Dann muss ich aber immer noch die Maximalline der gefundenen Funktion, den "Kamm" der Kante bestimmen.

Gibt es nicht eine einfache Möglichkeit eine Regression durch die Punktverteilung zu legen? Eine Möglichkeit die "Schwerpunktslinie" der Punktwolke zu bestimmen?

Ich wäre für jede Anregung oder Idee sehr dankbar.

Gaussfit1.jpg
 Beschreibung:
Fit der ersten Kante

Download
 Dateiname:  Gaussfit1.jpg
 Dateigröße:  37.04 KB
 Heruntergeladen:  532 mal
Gaussfit2.jpg
 Beschreibung:
Fit der zweiten Kante

Download
 Dateiname:  Gaussfit2.jpg
 Dateigröße:  37.01 KB
 Heruntergeladen:  542 mal
Private Nachricht senden Benutzer-Profile anzeigen


Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 08.05.2015, 13:12     Titel:
  Antworten mit Zitat      
wo ich das gelese hab musste ich an http://de.mathworks.com/help/vision.....int-feature-matching.html denken. vielleicht hilft dir ja punkt 2 weiter.
grüße
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
petermueller46
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 08.05.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.05.2015, 14:06     Titel:
  Antworten mit Zitat      
Vielen Dank für die wahnsinnig schnelle Antwort. Ich habe mir den Link angesehen: ja Punkt zwei passt zu meinem Problem. Ich hatte auch schon mit den eingebauten, gängigen Kantendetektoren wie canny und soeble herum gespielt, die haben wesentlich besser detektiert als detectFASTFeature, den ich noch nicht kannte. Dieser hat den Vorteil das man sich die Kantenpunkte direkt ausgeben und in eine Matrix cornerpoints schreiben lassen kann.

Tatsächlich war mein erster Versuch an das Problem heranzugehen: Bilder mit canny in Kantenbilder transformieren, der nur 0 für keine Kante und 1 für Kante liefert, dann jeweils zwei Bilder zu addieren und die Matrixeinträge setzten nach: 1 wenn die Addition 2 ergibt, 0 sonst. So bleiben nur die Kanten übrig die in allen Bildern vorhanden sind. Am Ende war aber leider alles einfach schwarz, keine Kante war übrig. Das mag am Rauschen liegen, oder minimalem wackeln der Kamera, jedenfalls schreibt canny eben tatsächlich nur einpixelbreite Kanten, was genauer ist als die Auswertungsprogramme, die später mit der Kamera betrieben werden sollen. Außerdem ist das Resultat rein grafisch, ich hätte da gerne etwas handfesteres.

Mit den eingebauten Detektoren hatte ich eigentlich abgeschlossen und wollte das Problem lieber von Hand lösen (Dann verstehe ich auch wenigsten alle Schritte die ablaufen).

Die Idee mit dem bestimmen der Schwerpunktlinie fand ich ziemlich gut. Schade das ich da so schnell nicht weiter komme. Es muss doch irgendwie möglich sein die zu bestimmen.

Danke auf jedenfall für die Anregung mit detectFASTFeature, mal sehen ob man das nicht doch einfach benutzen kann.
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.