Verfasst am: 08.05.2015, 12:08
Titel: Kantendetektion: Position der Kante in Bildmatrix bestimmen
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:
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:
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 = [1010101010];
% 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);
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.
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.
Einstellungen und Berechtigungen
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
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.