dazu habe ich mir überlegt könnte man beispielsweise Spielbauklötzchen auf einem Tisch ausbreiten, ein Foto knippsen und anschließend das Programm dahingehend erweitern, dass es die verschiedenene Formen wiedererkennt.
ok, ok, ich geb's ja zu: das klingt alles sehr wirr
ich habe jetzt mal meinem Bruder kurzer hand ein paar der namenhaften spielbauklötzchen entwendet und ein schnelles Foto geschossen, welches ihr im folgenden finden könnt:
Nun frage ich mich, ob es grundsätzlich möglich wäre in diesem Foto die Anzahl der gelben Bauklötzchen zu bestimmen?
Schwierigkeiten liegt offensichtlich darin, dass die Klötzchen verschieden gedreht sind, Belichtungsprobleme (Schatten), Überdeckungen durch andere Klötzchen, etc...
Bevor ich den Post hier gemacht habe, hatte ich logischerweise diverse andere Quellen (erfolglos) durchstöbert (wie bespw. das Matlab FileExchange).
Vielen Dank im voraus für jede Form der Hilf, die ihr geben könnt
offensichtlich hat niemand so eine Problemstellung und ich wollte nicht schon wieder darauf hinweisen, dass es sich hierbei um Mustererkennung handelt. Das Thema ist hier im Forum bereits häufiger thematisiert worden. Ich würde in einem ersten Schritt vorrangig die Schatten mit einer anderen Hell/Dunkel-Verteilung zu mindern. Diese werden auf jeden Fall Probleme bereiten.
Eine gerade nicht elegante, aber funktionieren Methode wäre, mit dem Befehl normxcorr2.m ein Muster zu suchen. Wenn das Muster dann anders liegt, könnte man mit mit mehreren Drehungen immer wieder abfragen, ob eine Deckung besteht.
Es kann auch hilfreich sein, das Bild in Farbauszüge aufzuteilen und dort zu suchen. So hat man zumindest den gesuchten Farbbereich etwas eingegrenzt oder vielleicht sogar genau eingegrenzt.
Vielleicht ist das zumindest ein Einstieg - wenn auch nicht optimal. Es ist also nicht mangelndes Interesse. Eine Antwort sollte zumindest weiter helfen und nicht noch mehr Fragen aufwerfen.
Ich habe mir im Forum nun mal sämtliche Einträge zum Thema Mustererkennung durchgelesen. Ich habe dabei festgestellt, dass es vermutlich viel sinn macht, wenn ich erstmal mit einem einfacheren Bild arbeite, wie dem folgenden (in dem die Klötzchen zumindest schonmal nicht verkehrt herum liegen):
als erstes habe ich mich mal dem Belichtungsproblem gewidmet und dazu einige stunden verschiede dinge ausprobiert. Am besten gefallen hat mir allerdings das Ergebnis, welches mit dem folgenden code erzielt wurde (gefunden auf mathworks.co.uk):
shadow_lab = applycform(shadow, srgb2lab); % convert to L*a*b*
% the values of luminosity can span a range from 0 to 100; scale them % to [0 1] range (appropriate for MATLAB(R) intensity images of class double) % before applying the three contrast enhancement techniques
max_luminosity = 1.2;
L = shadow_lab(:,:,1)/max_luminosity;
% replace the luminosity layer with the processed data and then convert % the image back to the RGB colorspace
shadow_imadjust = shadow_lab;
shadow_imadjust(:,:,1) = imadjust(L)*max_luminosity;
shadow_imadjust = applycform(shadow_imadjust, lab2srgb);
Du solltest zumindest soweit sein, ein Klötzchen tatsächlich zu finden und dann mit evtl. Drehungen beschäftigen. Du kannst nach Geometrien suchen oder nach Farben. Ich kann dir aus zeitlichen Gründen nur Denkanstöße geben. So auch diesen:
Code:
image1 = imread('Geometrisch.tif'); % Einlesen des Bildes
B = rgb2gray(image1); % umwandeln des Bildes in ein Graustufenbild figure; imshow(B);
thresh = graythresh(B); % automatische Bestimmung eines Schwellenwertes, um Vorder- und Hintergrund zu unterscheiden
C = im2bw(B,thresh); % Umwandeln des Graustufenbildes in ein b/w-Bild (Schwarz-Weiß oder auch binär) in Abhängigkeit des vorherbestimmten Schwellenwertes
C = ~C; % Da du einen weißen Hintergrund hast und weiß immer als '1' interpretiert wird figure; imshow(C);
C = imclearborder(C,4); % Damit werden automatisch alle zusammenhängenden Objekte, die Kontakt zu mindestens einem Bildrand haben, auf '0' gesetzt und damit Schwarz gemacht
D = imfill(C,'holes'); % Hier werden alle schwarzen Bereiche, die komlett von weißen Bereichen umgeben sind, auf weiß gesetzt und damit zu dem Objekt hinzugefügt figure; imshow(D);
E = bwlabel(D); % Hier werden alle Bereiche gelabelt, das heißt, dass jedes selbständige Objekt eine interne Nummer zugewiesen bekommt (es wird markiert)
stats = regionprops(E,'BoundingBox','Extent'); % hier wird ein struct "stats" mit den Feldern "BoundingBox" und "Extent" gebildet. In diesen Feldern wird zum einen die Position und Größe des das Objekt umfassenden Rechtecks (BoundingBox) und das Verhältnis zwischen Anzahl der Pixel des Objekts und Anzahl der Pixel der BoundingBox (Extent) for i=1:numel(stats) % Wenn die Abweichung der Breite minus die Höhe des umfassenden Rechtecks kleiner ist als 0.1 und gleichzeitig die Flächen übereinstimmen muss es ein Quadrat sein ifabs((stats(i).BoundingBox(3)-stats(i).BoundingBox(4))) < .1 && stats(i).Extent==1 display('Quadrat');
% Wenn die Abweichung der Breite minus die Höhe des umfassenden Rechtecks kleiner ist als 0.1 und das Flächenverhältnis zwischen 0.7 und 1 liegt, dann ist es ein Kreis elseifabs((stats(i).BoundingBox(3)-stats(i).BoundingBox(4))) < .1 && (.7<stats(i).Extent && stats(i).Extent<1) display('Kreis');
% Wenn das Flächenverhältnis gleich 1 ist, aber die Breite und Höhe nicht übereinstimmen, dann muss es ein Rechteck sein elseifisequal(stats(i).Extent,1) display('Rechteck');
% Da es hier nur 4 mögliche Fälle gibt, muss alles andere ein Dreieck sein else display('Dreieck');
end end
Noch ein kleiner Hinweis. Eine kleine Prüfung hat ergeben, dass Klötzchen mit bestimmten Funktionen, die ein m*n*3 Bild benötigen, nicht gefunden werden. Wenn aber das gleiche Klötzchen in den Farbauszügen gesucht wird, wird es auch gefunden. Farbauszüge spielen also eine wichtige Rolle. Du solltest dir mal einige Funktionen ansehen, wie man Farbauszügen unterschiedlich handhaben 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.