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

Optimierung eines Programms zur Bildmustererkennung

 

Studento

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.05.2021, 17:01     Titel: Optimierung eines Programms zur Bildmustererkennung
  Antworten mit Zitat      
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.

Dies ist mein Programm:
Code:

%% Setup

bild = imread('kaetzchen.jpg');
muster = imread('kae.jpg');

bild = bild(:,:,1);     % Wir muessen nur eine der drei Dimensionen betrachten, da
muster = muster(:,:,1); % die Bilder in allen drei Dimensionen gleich sind

dim_bild = size(bild);
dim_muster = size(muster);

bild_hoehe = dim_bild(1);
bild_breite = dim_bild(2);

muster_hoehe = dim_muster(1);
muster_breite = dim_muster(2);

teilbilder_vertikal = (bild_hoehe - muster_hoehe) - 1; % Wie oft passt der Musterausschnitt in das Bild?
teilbilder_horizontal = (bild_breite - muster_breite) - 1;

ergebnismatrix = zeros(teilbilder_horizontal, teilbilder_vertikal);

%% Berechnung der Kreuzkorrelation

for i = 1:teilbilder_vertikal
    for j = 1:teilbilder_horizontal
       
        bildausschnitt = bild(i:(i+muster_hoehe-1),j:(j+muster_breite-1));
        ergebnismatrix(j,i) = corr2(bildausschnitt, muster);
       
    end
end

[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);

%% Bilder anzeigen

figure();
subplot(311);
imshow(bild);
title('Originalbild');

subplot(312);
imshow(muster);
title('gesuchtes Muster');

subplot(313);
imshow(result);
title('beste Übereinstimmung');

%% 3D-Korrelationsmatrix

dim_erg = size(ergebnismatrix);

erg_breite = dim_erg(1);
erg_hoehe = dim_erg(2);

xr = 1:erg_breite;
yr = 1:erg_hoehe;
[X,Y] = meshgrid(xr,yr);
figure();
waterfall(X', Y', ergebnismatrix);
 


Die verwendeten Bilder habe ich angehängt.

Für Tipps wäre ich sehr dankbar!

kae.jpg
 Beschreibung:
gesuchtes Muster

Download
 Dateiname:  kae.jpg
 Dateigröße:  3.61 KB
 Heruntergeladen:  276 mal
kaetzchen.jpg
 Beschreibung:
Bild

Download
 Dateiname:  kaetzchen.jpg
 Dateigröße:  90.32 KB
 Heruntergeladen:  285 mal


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 10.05.2021, 19:18     Titel:
  Antworten mit Zitat      
Hallo,

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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Studento

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.05.2021, 16:20     Titel:
  Antworten mit Zitat      
@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!
 
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.