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

Farb- und Formerkennung von Bauklötzen aus Bilddatei

 

jakilax
Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 29.11.13
Wohnort: Solingen / London
Version: ---
     Beitrag Verfasst am: 29.11.2013, 19:00     Titel: Farb- und Formerkennung von Bauklötzen aus Bilddatei
  Antworten mit Zitat      
Hallo Liebe Leute,

angespornt von einem doch recht alten Eintrag hier im Board (http://www.gomatlab.de/geometrische.....d-jpg-erkennen-t1788.html), habe ich mich gefragt, ob man die Problemstellung noch ein bisschen ausbauen könnte:

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 Very Happy
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:


hier mal ein Foto, welches "bearbeitet" werden sollte:
https://www.dropbox.com/s/tr1t0pasvf1qzw8/testfoto.jpg

das hier meine ich mit "gelbes Klötzchen":
https://www.dropbox.com/s/v028zevisiz7y99/gelbeskloetzchen.jpg


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 Smile

lg
Jaki
Private Nachricht senden Benutzer-Profile anzeigen


jakilax
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 29.11.13
Wohnort: Solingen / London
Version: ---
     Beitrag Verfasst am: 02.12.2013, 12:15     Titel: Besteht kein Interesse?
  Antworten mit Zitat      
ok, schade, dass bislang niemandem was eingefallen ist bzw. niemand die Lust hatte das Problem zu diskutieren.
Private Nachricht senden Benutzer-Profile anzeigen
 
Hubertus
Forum-Meister

Forum-Meister


Beiträge: 1.034
Anmeldedatum: 08.01.09
Wohnort: Hamburg
Version: ---
     Beitrag Verfasst am: 02.12.2013, 12:34     Titel:
  Antworten mit Zitat      
Moin,

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.

Zumindest wünsche ich dir viel Erfolg!

Hubertus
Private Nachricht senden Benutzer-Profile anzeigen
 
jakilax
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 29.11.13
Wohnort: Solingen / London
Version: ---
     Beitrag Verfasst am: 02.12.2013, 23:22     Titel:
  Antworten mit Zitat      
Vielen Dank Hubertus für deine Hilfe.

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):

Code:
shadow = imread('train12.jpg');

srgb2lab = makecform('srgb2lab');
lab2srgb = makecform('lab2srgb');

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

shadow_histeq = shadow_lab;
shadow_histeq(:,:,1) = histeq(L)*max_luminosity;
shadow_histeq = applycform(shadow_histeq, lab2srgb);

shadow_adapthisteq = shadow_lab;
shadow_adapthisteq(:,:,1) = adapthisteq(L)*max_luminosity;
shadow_adapthisteq = applycform(shadow_adapthisteq, lab2srgb);

figure(1);
subplot(1,2,1), imshow(shadow);      % imshow or imagesc
subplot(1,2,2), imshow(shadow_imadjust);
 



Das Ergebnis kann im folgenden bewundert werden:

https://www.dropbox.com/s/0v1noox961y1v5n/3.jpg

was mich allerdings extrem beschäftigt ist: Lässt sich damit was anfangen?
Private Nachricht senden Benutzer-Profile anzeigen
 
Hubertus
Forum-Meister

Forum-Meister


Beiträge: 1.034
Anmeldedatum: 08.01.09
Wohnort: Hamburg
Version: ---
     Beitrag Verfasst am: 03.12.2013, 06:46     Titel:
  Antworten mit Zitat      
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
    if abs((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
    elseif abs((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
    elseif isequal(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


Quelle: unbekannt

Da hat sich jemand Gedanken über Geometrien gemacht.
Private Nachricht senden Benutzer-Profile anzeigen
 
Hubertus
Forum-Meister

Forum-Meister


Beiträge: 1.034
Anmeldedatum: 08.01.09
Wohnort: Hamburg
Version: ---
     Beitrag Verfasst am: 03.12.2013, 10:25     Titel:
  Antworten mit Zitat      
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.
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 - 2025 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.