Optimierung eines Programms zur Bildmustererkennung
Studento
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 10.05.2021, 17:01
Titel: Optimierung eines Programms zur Bildmustererkennung
Moin, im Rahmen einer Aufgabe für mein Studium habe ich ein Programm zur Erkennung von Bildmustern geschrieben.
Soweit funktioniert auch alles, allerdings kommentierte meine Professorin, dass das Programm noch vergleichsweise langsam liefe - bei Studierenden sei der Matlab-Code häufig schlecht optimiert. Die Hauptaufgabe war erfüllt und damit war das Thema eigentlich auch durch, allerdings frage ich mich trotzdem, wie man dieses Programm noch optimieren kann. Da ich noch nicht lange mit Matlab arbeite, habe ich von vielen Funktionen noch keine Ahnung, die man hierzu vielleicht kennen sollte.
Mein Programm liest zunächst zwei Schwarz-Weiß-Bilder ein, bestimmt deren Dimensionen und berechnet, wie viele Ausschnitte man aus diesem Bild ausschneiden kann, die die selbe Größe haben wie das Muster. Dann werden in einer Schleife (an dieser Stelle liegt wohl das Hauptproblem) alle möglichen Teilausschnitte per Kreuzkorrelation mit dem gesuchten Muster verglichen. Anschließend wird die Position des Ausschnitts mit der größten Übereinstimmung ermittelt und sowohl der Ausschnitt als auch die Matrix aller Kreuzkorrelationswerte dargestellt.
Ich kann mir einfach nicht vorstellen, wie ich den Teil mit der Schleife beschleunigen kann, da ich ja nunmal jedes mögliche Teilbild einmal mit dem Muster kreuzkorrellieren muss.
bild = bild(:,:,1); % Wir muessen nur eine der drei Dimensionen betrachten, da
muster = muster(:,:,1); % die Bilder in allen drei Dimensionen gleich sind
teilbilder_vertikal = (bild_hoehe - muster_hoehe) - 1; % Wie oft passt der Musterausschnitt in das Bild?
teilbilder_horizontal = (bild_breite - muster_breite) - 1;
[x, y] = find(ismember(ergebnismatrix, max(ergebnismatrix(:)))); % Position der maximalen Uebereinstimmung finden
result = bild(y:(y+muster_hoehe-1),x:(x+muster_breite-1));
str=sprintf('Die beste Übereinstimmung befindet sich an der Stelle X=%d, Y=%d.',x,y);
disp(str);
intuitiv würde ich sagen, dass
xcorr2
helfen könnte. Ich sehe aber auf Anhieb nicht, wie man damit deine Ergebnisse reproduzieren kann.
Ein anderer Gedanke kann sein, Moving Window-Operationen wie movsum zu verwenden, um Ergebnisse wiederzuverwenden. Ich habe das mal vor langer Zeit für corr gemacht, und es war ein ziemlicher Aufwand. Für corr2 wird es sicher nicht weniger, also erst mal xcorr2 ansehen. :)
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Studento
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 19.05.2021, 16:20
Titel:
@Harald: Ich habe deinen Beitrag erst heute gesehen, das klingt sehr gut! xcorr2 kenne ich noch nicht, werde ich mir aber gleich mal ansehen. Moving-Window-Operationen klingen (zumindest nach meiner kurzen Recherche) allerdings auch sehr sinnvoll, vielleicht sollte ich mich da sowieso mal schlau machen. Danke für deine Antwort!
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.