Verfasst am: 16.06.2008, 17:40
Titel: Beispiel: Erkennen von geometrischen Formen in Bildern
Es geht um das Erkennen einfacher geometrischer Formen in Bildern. Dabei beschränke ich mich hier auf die Möglichkeiten Dreieck, Kreis, Quadrat, Rechteck.
Code:
image1 = imread('ball.jpg'); % Einlesen des Bildes
B = rgb2gray(image1); % umwandeln des Bildes in ein Graustufenbild
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
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
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');
Ich hab das mal mit coin.jpg von Matlab probiert. Liefert mir allerdings nen Schmarrn. Gib doch ein paar Infos mehr dazu bitte: Wie groß die Dreiecke,..., sein dürfen damit sie erkannt werden oder ob man das Bild vorher noch ein wenig manipulieren muss.
das Problem liegt darin, dass ich diesen Code in Bezug auf ein spezielles Problem geschrieben habe. Hier findest du aber Bilder mit denen der Code auf jeden Fall funktioniert: http://www.gomatlab.de/viewtopic,p,7676.html#7676
Ich habe gerade ein ähnliches Problem (sicher nur eine Zeile)
und zwar hab ich einen Bildausschnitt, aus einem binärbild und ich möchte nur wissen, ob sich darin weiße Pixel befinden. Wenn dem so ist, soll er eine Antwort ausgeben.
kennt dazu jemand den passenden Befehl?
Danke schonmal...
_________________
Lauf nicht weg sagte der Drache, ich will doch nur kosten....
Hi steve, ich beschäftige mich auch mit Segmentierung, ich weiss nicht wie ich mit boundingBox arbeiten kan. wie kann ich es auf das original bild ploten lssen!?
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.