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

Zeichnen von Rechteck in Matlab

 

Gast

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.08.2011, 11:08     Titel: Zeichnen von Rechteck in Matlab
  Antworten mit Zitat      
Hallo,

ich glaube ihr werdet über die Frage schmunzeln, aber sie ist dennoch ernst gemeint.

Hier erstmal mein Problem:
In einem Video möchte ich Kreise erkennen. Hierzu hole ich mir jeden einzelnen Frame und bearbeite ihn:
1. Binärbild
2. Auf den Bereich zuschneiden, der mich interessiert (ist immer der gleiche)
3. Morphologische Operatoren
4. BoundingBox benutzen um die Koordinaten der einzelnen Segmente zu bekommen

Nun sollen ja Kreise gefunden werden, also:
Abfrage für jede Region, ob die Höhe gleich der Breite der BoundingBox ist.
Wenn dies der Fall ist, dann möchte ich gerne einen grünen Kasten direkt ins Bild malen, indem ich an den einzelnen Koordinaten den Farbwert veränder.
Und hier liegt das Problem!
Von der BoundingBox kriege ich ja die obere linke Ecke, Breite und Höhe und kann mir so dann das Rechteck berechnen.
Nun weiß ich aber leider nicht, wie ich den Farbwert an den entsprechenden Pixeln so ändern kann, dass ich in meinem S/W-Bild einen grünen Kasten habe vielleicht hat jemand von euch da ne Idee. Wenn jemand Verbesserungsideen zum Code hat, auch gerne genommen.

Code:
% Ein Teil meines bisherigen Ansatzes
for m = 1 : num
           
            boundingbox = foo(m).BoundingBox;
            ULx = floor(boundingbox(1));
            ULy = floor(boundingbox(2));
            width = boundingbox(3);
            height = boundingbox(4);
           
            % Bildregion im alten Bild ausgeben und BoundingBox einzeichnen
            % aber nur regionen, die gleich hoch und breit sind
            % => Kreisschilder
            if(width == height)
                for posLine=ULy:(ULy+height)
                    if(posLine == ULy || posLine == ULy+height)
                        for posCollumn=ULx:(ULx+width)
                            % ganze Linie einfärben (waagerechte)

                        end
                    else
                        % nur linken und rechten Randpixel grün färben
                        % (senkrechte)

                    end
                end
            end
        end
 


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 13.08.2011, 18:54     Titel: Re: Zeichnen von Rechteck in Matlab
  Antworten mit Zitat      
Hallo Gast,

In welchem Format ist denn das Original-Bild gespeichert?
Wenn es ein RGB-Bild ist, also [Breite x Höhe x 3], müssen einfach nur die entsprechenden Pixel-Werte gesetzt werden.
Code:
C = [0, 1, 0];  % Grün
RGB = rand(200, 400, 3);
x = 80;
y = 20
w = 100;
h = 80;
RGB(x:x+w, [y, y+h], 1) = C(1);
RGB(x:x+w, [y, y+h], 2) = C(2);
RGB(x:x+w, [y, y+h], 3) = C(3);

RGB([x, x+w], y:y+h, 1) = C(1);
RGB([x, x+w], y:y+h, 2) = C(2);
RGB([x, x+w], y:y+h, 3) = C(3);

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.08.2011, 22:48     Titel:
  Antworten mit Zitat      
Hey Jan,

erstmal danke für deine Antwort.

Das Ursprungsbild ist im RGB-Format und wird dann in ein S/W-Bild mittels
Code:

umgewandelt. Wenn ich das richtig sehe, ist es dann nurnoch ein [Breite x Höhe x 1] Format und da soll dann eben der Grüne Kasten eingezeichnet werden.

Problematisch sehe ich da ganz einfach [Breite x Höhe x 1] != [Breite x Höhe x 3].
Treffe mich morgen mit Freunden, die vielleicht ne Idee haben, aber bin trotzdem für Lösungen offen Smile
 
Sco
Forum-Meister

Forum-Meister


Beiträge: 699
Anmeldedatum: 15.08.10
Wohnort: Dundee
Version: 2008a, 2010a
     Beitrag Verfasst am: 14.08.2011, 23:28     Titel:
  Antworten mit Zitat      
Hallo,

so z.B:
Code:

BW = imread('circles.png');
rp = regionprops(BW,'BoundingBox');
figure,imshow(BW);
hold on
rectangle('Position',rp.BoundingBox,'EdgeColor','red');
 


Nätürlich könntest du dir es auch mit dem plot (oder patch) Befehl zeichnen und über das Binärbild legen, dann müsstes du eben zuvor die Eckpunkte bestimmen. Minimalbeispiel:
Code:

figure, plot([1 1 10 10 1],[1 10 10 1 1],'r');
xlim([0 11]);
ylim([0 11]);
 

Ansonsten gibt es auch noch einige Beispiele in der Matlab Hilfe wie man die Ränder von Objekten farbig einzeichnet (also exakt und nicht nur das kleinst mögliche Rechteck drumherum).
Siehe hierfür z.B. die Hilfe (und Beispiele) von "bwboundaries":

Code:


MFG

Sco
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 15.08.2011, 03:45     Titel: Re: Zeichnen von Rechteck in Matlab
  Antworten mit Zitat      
Hallo Gast,

Zitat:
Wenn dies der Fall ist, dann möchte ich gerne einen grünen Kasten direkt ins Bild malen, indem ich an den einzelnen Koordinaten den Farbwert verändere.

Hier liegt ein Problem: Wenn Du das Bild in ein BW-Bild umgewandelt hast, kannst Du nicht mehr einzelne Pixels grün färben. Aber Du könntest ein RGB-Bild verwenden, welches nur weiße und schwarze Pixel hat:
Code:
BW = rand(100, 100) > 0.5;
RGB = double(cat(3, BW, BW, BW));

Dann klappt das Setzen der grünen Pixels wieder.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
oreas
Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 15.08.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.08.2011, 09:42     Titel: Lösung gefunden
  Antworten mit Zitat      
Hallo zusammen,

nun habe ich mich endlich mal angemeldet, also die vorherigen Beiträge waren von mir Smile

habe eine Lösung gefunden, geht bestimmt einfachter, aber da das ein Prototyp ist, der mir zeigen soll, ob sich das ganze auf Hardware umsetzen lässt, reicht mir das aus.

trotzdem nochmal danke für eure Antworten.

Falls Interesse an meinem Code besteht, einfach per Mail melden.

@Jan S: genau so habe ich es gemacht, aber selbst geschrieben. Ging für mich schneller, als mich da rein zu lesen, sind ja auch nur 2 Schleifen Smile
aber trotzdem danke für den Tip
_________________

"Zwei Dinge sind unendlich, das Universum und die menschliche Dummheit, aber bei dem Universum bin ich mir noch nicht ganz sicher." Albert Einstein
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.