Matlab Bildbearbeitung < Matlab < Mathe-Software < Mathe < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 17:02 Do 04.02.2010 | Autor: | JanaS |
Hallo!
Ich habe diese Frage in keinem Forum auf anderen Internetseiten gestellt.
Ich habe einige Fragen zur Bildbearbeitung in Matlab.
1. Gehe ich recht in der Annahme, dass ein beliebiges Bild immer das Format HöhexBreitex3 hat? Also z.B. 200x300x3? Und die 3 deshalb wegen der Farben rot, gelb und blau?!
2. Wenn ich ein Bild habe im Format 200x300x3 und will das verändern, wie gehe ich da vor? Ich möchte es einmal dunkler machen. Und dann möchte ich das gleiche (unveränderte) Urpsrungsbild noch in Graustufen darstellen mit der Formel Y=0.3R+0.59G+0.11B.
Dunkler machen bedeutet doch, dass ich die einzelnen Elemente der Matrix verringere (Matrix mit nur Nullen = schwarzes Bild). Oder? Kann ich dann einfach eine Matrix definieren mit beispielsweise 20 an allen Stellen und die von der Ursprungsmatrix abziehen? Wie verhindere ich, dass die Matrix an sowieso schon schwarzen/dunklen Stellen negative Werte bekommt?
Und zu den Graustufen: Ich habe 3 Matrizen, die ich zu einer addiere, indem ich 0.3*1.Matrix + 0.59*2.Matrix + 0.11*3.Matrix rechne?
Vielen Dank schonmal!
Viele Grüsse von Jana
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 18:47 Do 04.02.2010 | Autor: | Infinit |
Hallo Jana,
der Einfachheit halber habe ich meine Antworten in Deine Fragen eingegliedert.
Viele Grüße,
Infinit
> Hallo!
>
> Ich habe diese Frage in keinem Forum auf anderen
> Internetseiten gestellt.
>
> Ich habe einige Fragen zur Bildbearbeitung in Matlab.
>
> 1. Gehe ich recht in der Annahme, dass ein beliebiges Bild
> immer das Format HöhexBreitex3 hat? Also z.B. 200x300x3?
> Und die 3 deshalb wegen der Farben rot, gelb und blau?!
Ja, das sind die drei Farbauszüge rot, grün und blau, die als Matrizen behandelt werden.
>
> 2. Wenn ich ein Bild habe im Format 200x300x3 und will das
> verändern, wie gehe ich da vor? Ich möchte es einmal
> dunkler machen. Und dann möchte ich das gleiche
> (unveränderte) Urpsrungsbild noch in Graustufen darstellen
> mit der Formel Y=0.3R+0.59G+0.11B.
>
> Dunkler machen bedeutet doch, dass ich die einzelnen
> Elemente der Matrix verringere (Matrix mit nur Nullen =
> schwarzes Bild). Oder? Kann ich dann einfach eine Matrix
> definieren mit beispielsweise 20 an allen Stellen und die
> von der Ursprungsmatrix abziehen? Wie verhindere ich, dass
> die Matrix an sowieso schon schwarzen/dunklen Stellen
> negative Werte bekommt?
Ja, eine einfache Bildverarbeitung kannst Du so machen. Je höher der Wert in der entsprechenden Matrize ist, umso intensiver erscheint die jeweilige Farbe. Du änderst damit also die Farbintensität und nicht die Helligkeit. Negative Werte machen hier, wie Du schon geschrieben hast, keinen Sinn. Du musst also beim Rechnen darauf achten, dass der Minimal- und der Maximalwert nicht überschritten werden.
>
> Und zu den Graustufen: Ich habe 3 Matrizen, die ich zu
> einer addiere, indem ich 0.3*1.Matrix + 0.59*2.Matrix +
> 0.11*3.Matrix rechne?
>
Ja, das ist die bekannte Formel, um aus den drei Farbauszügen die Helligkeit zu bestimmen. Auch hier musst Du auf die Begrenzung des Wertebereichs achten.
> Vielen Dank schonmal!
>
> Viele Grüsse von Jana
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 19:21 Do 04.02.2010 | Autor: | JanaS |
> Hallo Jana,
> der Einfachheit halber habe ich meine Antworten in Deine
> Fragen eingegliedert.
> Viele Grüße,
> Infinit
>
> > Hallo!
> >
> > Ich habe diese Frage in keinem Forum auf anderen
> > Internetseiten gestellt.
> >
> > Ich habe einige Fragen zur Bildbearbeitung in Matlab.
> >
> > 1. Gehe ich recht in der Annahme, dass ein beliebiges Bild
> > immer das Format HöhexBreitex3 hat? Also z.B. 200x300x3?
> > Und die 3 deshalb wegen der Farben rot, gelb und blau?!
>
> Ja, das sind die drei Farbauszüge rot, grün und blau, die
> als Matrizen behandelt werden.
> >
> > 2. Wenn ich ein Bild habe im Format 200x300x3 und will das
> > verändern, wie gehe ich da vor? Ich möchte es einmal
> > dunkler machen. Und dann möchte ich das gleiche
> > (unveränderte) Urpsrungsbild noch in Graustufen darstellen
> > mit der Formel Y=0.3R+0.59G+0.11B.
> >
> > Dunkler machen bedeutet doch, dass ich die einzelnen
> > Elemente der Matrix verringere (Matrix mit nur Nullen =
> > schwarzes Bild). Oder? Kann ich dann einfach eine Matrix
> > definieren mit beispielsweise 20 an allen Stellen und die
> > von der Ursprungsmatrix abziehen? Wie verhindere ich, dass
> > die Matrix an sowieso schon schwarzen/dunklen Stellen
> > negative Werte bekommt?
>
> Ja, eine einfache Bildverarbeitung kannst Du so machen. Je
> höher der Wert in der entsprechenden Matrize ist, umso
> intensiver erscheint die jeweilige Farbe. Du änderst damit
> also die Farbintensität und nicht die Helligkeit. Negative
> Werte machen hier, wie Du schon geschrieben hast, keinen
> Sinn. Du musst also beim Rechnen darauf achten, dass der
> Minimal- und der Maximalwert nicht überschritten werden.
Vielen Dank erstmal!
Irgendwie schaffe ich es nicht, die Matrizen zu subtrahieren. Ich habe jetzt das Bild in 3 Matrizen (200,300) zerlegt. Dann habe ich eine Matrix definiert, (200,300), die überall 20 stehen hat. Kann ich jetzt nicht einfach diese Matrizen subtrahieren? Die haben doch die gleiche Dimension. Warum geht das nicht? Und wie kann ich verhindern, dass negative Werte in der Matrix auftauchen?
Achso, kann das Subtraktionsproblem daran liegen, dass das Bild uint8 array ist und die 20er Matrix dubble array?
>> niklas1D=niklas1-D
??? Error using ==> -
Function '-' not defined for variables of class 'uint8'.
niklas1 ist die erste Matrix des Bildes, D ist die 20er Matrix.
> >
> > Und zu den Graustufen: Ich habe 3 Matrizen, die ich zu
> > einer addiere, indem ich 0.3*1.Matrix + 0.59*2.Matrix +
> > 0.11*3.Matrix rechne?
> >
>
> Ja, das ist die bekannte Formel, um aus den drei
> Farbauszügen die Helligkeit zu bestimmen. Auch hier musst
> Du auf die Begrenzung des Wertebereichs achten.
>
> > Vielen Dank schonmal!
> >
> > Viele Grüsse von Jana
>
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 19:34 Do 04.02.2010 | Autor: | Infinit |
Hallo Jana,
üblicherweise rechnet man in diesem Umfeld mit Integerwerten, was aber nicht unbedingt sein muss. Auf jeden Fall sollten aber die Arrays vom gleichen Typ sein.
Das Verhindern negativer Zahlen geht nur mit einer kleinen if-Abfrage.
Ich kenne die Syntax von Matlab nicht genau, aber so etwas wie
if (x > y then x-y else 0)
sollte weiterhelfen.
Viele Grüße,
Infinit
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 19:39 Do 04.02.2010 | Autor: | JanaS |
> Hallo Jana,
> üblicherweise rechnet man in diesem Umfeld mit
> Integerwerten, was aber nicht unbedingt sein muss. Auf
> jeden Fall sollten aber die Arrays vom gleichen Typ sein.
> Das Verhindern negativer Zahlen geht nur mit einer kleinen
> if-Abfrage.
> Ich kenne die Syntax von Matlab nicht genau, aber so etwas
> wie
> if (x > y then x-y else 0)
> sollte weiterhelfen.
> Viele Grüße,
> Infinit
Ich habe gerade herausgefunden, dass ich die Matrix als double definieren muss, um + und - rechnen zu können. Das habe ich jetzt erstmal gemacht. Mit dem if then else muss ich nochmal überlegen, wie ich das am besten schreibe. Danke schonmal!
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 19:57 Do 04.02.2010 | Autor: | Infinit |
Hallo Jana,
bei dem von Dir angegebenen Befehl kann ich keine Differenzbildung erkennen. Arbeitest Du wirklich mit Matrizen?
Viele Grüße,
Infinit
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 20:17 Do 04.02.2010 | Autor: | JanaS |
> Hallo Jana,
> bei dem von Dir angegebenen Befehl kann ich keine
> Differenzbildung erkennen. Arbeitest Du wirklich mit
> Matrizen?
> Viele Grüße,
> Infinit
Hallo Infinit,
die Differenzbildung habe ich hinbekommen. Ich habe erst das Bild von uint8 in double array umgewandelt (niklas = double(niklas) + 1), dann die Matrix mit Einsen in double array (IMG = double(IMG) + 1). Dann kann ich niklas-IMG (niklasdunkel = niklas - 10*IMG) rechnen und bekomme eine neue Matrix heraus. Allerdings mit teilweise negativen Werten, weil meine if-Abfragen alle nicht funktionieren. :-(.
Ich habe versucht:
if niklas - 10*IMG < 0
niklasdunkel = 0
end
niklasdunkel = niklas - 10*IMG;
Aber da kommen genau die Werte heraus, die sich rechnerisch ergeben. Nur meine if-Abfrage wird ignoriert.
Ich bin völliger Neuling beim Programmieren und noch stellt sich für mich alles als höllisch kompliziert dar...
Viele Grüsse, Jana
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 16:03 Fr 05.02.2010 | Autor: | Frasier |
Hallo Jana,
du könntest ganz normal
niklasdunkel = niklas - 10*IMG;
berechnen, und anschließend mit
niklasdunkel(niklasdunkel<0)=0;
alle negativen Elemente zu 0 setzen.
Kommst du damit zurecht?
lg
F.
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 11:16 So 07.02.2010 | Autor: | JanaS |
Super! Vielen Dank für Eure Hilfe! Ich habe es sogar geschafft, das zu einem Programm zu verwursten, so dass das Bild automatisch eingelesen wird, dunkler gemacht wird und mit neuem Namen gespeichert wird.
Für Euch ist das wahrscheinlich nichts besonderes, aber für mich ist das ein grosser Erfolg, weil ich ÜBERHAUPT NICHT programmieren kann...
Jetzt muss ich das Bild nur noch in Grautöne umwandeln, aber das dürfte hoffentlich nicht so schwer sein.
Viele Grüsse von Jana
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 11:39 So 07.02.2010 | Autor: | Infinit |
Hallo Jana,
das ist doch prima, herzlichen Glückwunsch.
Wenn Du mit der Grautonwandlung das Umsetzen in ein Schwarz-Weiss-Bild meinst, dann ist das nicht so schwer. Die Gleichung für die Helligkeit Y kennst Du ja bereits.
Eine kleine Bemerkung am Rande: Jedes Bild besteht ja aus Pixeln, und jedes dieser Pixel wird durch ein Farbtripel aus Rot, Grün und Blau beschrieben. Wenn Du Dir die Y-Gleichung anschaust, stellst Du fest, dass es mehrere Farbkombinationen geben kann, die zum gleichen Helligkeitseindruck führen.
Viele Grüße,
Infinit
|
|
|
|