image addieren < Matlab < Mathe-Software < Mathe < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 15:25 Di 16.02.2010 | Autor: | JanaS |
Hallo!
Eigentlich macht das Programmieren ja Spass, aber ein Schritt vor und zwei zurück ist irgendwie nervig :-(. Ich will ein Bild rotieren, ohne rot90 oder so zu verwenden. Immerhin habe ich es geschafft, dass das Bild gedreht wird, nur sind die Farben jetzt etwas komisch...
Warum funktioniert meine if-Abfrage nicht?
??? Error: File: C:\ Programme\ MatlabR12\ work\ img_ rotate.m Line: 16 Column: 4 (das ist hier: if z = 1)
Assignment statements cannot produce a result.
Ohne diese Abfrage geht es nicht, weil dann ein Fehler kommt, wenn ich z.B. ein graues Bild einlese, was ja aus einer Matrix (x,y) besteht.
Und warum kann ich nicht rechnen img = img_ 1 + img_ 2 + img_ 3? Das Bild, dass dabei herauskommt, besteht nur aus rot, gelb und blau, aber nicht übereinandergelegt. Wie muss ich das rechnen, damit die drei Matrizen wieder übereinander gelegt werden?
Vielen Dank und viele Grüsse von Jana
PS: img_ 1 hat eigentlich kein Leerzeichen, aber sonst wird das hier sehr komisch angezeigt, deshalb habe ich überall zwischen img_ und der Zahl ein Leerzeichen eingefügt
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 16:31 Di 16.02.2010 | Autor: | Frasier |
Hallo Jana,
die Dinge, die mir auffallen:
-in die erste Zeile (die mit function...) gehört am Ende kein Semikolon,
-du nennst sowohl das, was an img_rotate übergeben wird als auch die Rückgabe img. Das sollte man nicht machen.
-du hast schon wieder vergessen, dass man mit == auf Gleichheit prüft, nicht mit =,
-so wie du die drei Ebenen von img in [mm] img_1, img_2 [/mm] und [mm] img_3 [/mm] aufteilst musst du am Enden natürlich die [mm] img_1, img_2 [/mm] und [mm] img_3 [/mm] wieder auf 3 Ebenen verteilen und nicht einfach in einer Ebene addieren.
lg
F.
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 18:01 Di 16.02.2010 | Autor: | JanaS |
> Hallo Jana,
> die Dinge, die mir auffallen:
> -in die erste Zeile (die mit function...) gehört am Ende
> kein Semikolon,
> -du nennst sowohl das, was an img_rotate übergeben wird
> als auch die Rückgabe img. Das sollte man nicht machen.
> -du hast schon wieder vergessen, dass man mit == auf
> Gleichheit prüft, nicht mit =,
> -so wie du die drei Ebenen von img in [mm]img_1, img_2[/mm] und
> [mm]img_3[/mm] aufteilst musst du am Enden natürlich die [mm]img_1, img_2[/mm]
> und [mm]img_3[/mm] wieder auf 3 Ebenen verteilen und nicht einfach
> in einer Ebene addieren.
> lg
> F.
Hallo Frasier!
Warum gehört in die erste Zeile kein Semikolon hin? An der Funktion ändert das aber nichts, die anderen 3 Unterprogramme laufen.
Dass die Eingabe und die Rückgabe beide img heissen, war in der Aufgabenstellung vorgegben. Deshalb habe ich die so genannt.
Das == habe ich tatsächlich wieder vergessen, sorry! Aber das ändert an der Fehlermeldung nichts :-(. Mit einem grauen Bild als Eingabe bekomme ich folgende Fehlermeldung:
??? Index exceeds matrix dimensions.
Und es ist mir schon klar, dass ich die Bilder auf unterschiedlichen Ebenen addieren muss (ich habe sie ja auch aus unterschiedlichen Ebenen geholt), aber wie geht das? Ich habe versucht, aus img_ 1(x,y) ein img_ 1(x,y,1) zu machen, aber das hat nicht geklappt.
Viele Grüsse, Jana
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 18:27 Di 16.02.2010 | Autor: | Frasier |
Hallo Jana,
das Semikolon in der Funktionsdefinition ist einfach überflüssig. Man kann es hinschreiben, man kann es weglassen.
Wenn du eine neue Matlab-Version bekommen hast, wird dir der Editor das auch als Warnung angeben.
Dass Eingabe und Ausgabe gleich heißen ist nicht verboten, aber schlecht lesbar. Ich würde das nicht machen.
Das sich die Fehlermeldung auf graue Bilder bezieht habe ich überlesen.
Ein RGB-Bild ist ja eine Höhe x Breite x 3 - große Matrix.
Ein graues Bild hat nur eine Ebene, ist also Höhe x Breite x 1 groß. Dann kann man natürlich nicht auf die 2. oder 3. Ebene zugreifen.
Du musst also vor den Zeilen
1: | img_2 = img(:,:,2);
| 2: | img_3 = img(:,:,3); |
prüfen, ob es img(:,:,2) und img(:,:,3) überhaupt gibt.
Im Fall eines RGB-Bildes kannst du am Ende die Matrizen so zusammensetzen
1: | img(:,:,1)=img_1;
| 2: | img(:,:,2)=img_2;
| 3: | img(:,:,3)=img_3; |
lg
F.
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 19:00 Di 16.02.2010 | Autor: | JanaS |
> Hallo Jana,
> das Semikolon in der Funktionsdefinition ist einfach
> überflüssig. Man kann es hinschreiben, man kann es
> weglassen.
> Wenn du eine neue Matlab-Version bekommen hast, wird dir
> der Editor das auch als Warnung angeben.
> Dass Eingabe und Ausgabe gleich heißen ist nicht
> verboten, aber schlecht lesbar. Ich würde das nicht
> machen.
> Das sich die Fehlermeldung auf graue Bilder bezieht habe
> ich überlesen.
> Ein RGB-Bild ist ja eine Höhe x Breite x 3 - große
> Matrix.
> Ein graues Bild hat nur eine Ebene, ist also Höhe x
> Breite x 1 groß. Dann kann man natürlich nicht auf die 2.
> oder 3. Ebene zugreifen.
> Du musst also vor den Zeilen
> [mm][code]img_2[/mm] = img(:,:,2);
> [mm]img_3[/mm] = img(:,:,3);[/code]
> prüfen, ob es img(:,:,2) und img(:,:,3) überhaupt gibt.
> Im Fall eines RGB-Bildes kannst du am Ende die Matrizen so
> zusammensetzen
> [mm][code]img(:,:,1)=img_1;[/mm]
> [mm]img(:,:,2)=img_2;[/mm]
> [mm]img(:,:,3)=img_3;[/code][/mm]
> lg
> F.
Hallo Frasier,
so wie Du vorgeschlagen hast, die Bilder wieder zusammenzusetzen, habe ich das auch probiert. Aber das klappt nicht. Ich bekomme ein total rotes Bild (img ist gerade ein Bild mit Tiefe 3).
Und was die graue Variante angeht: ich habe ja eine Abfrage gemacht
[x y z]=size(img);
[mm] img_0 [/mm] = uint8(zeros(x,y));
[mm] img_0 [/mm] = [mm] double(img_0); [/mm]
if z == 1
[mm] img_2 [/mm] = [mm] img_0;
[/mm]
[mm] img_3 [/mm] = [mm] img_0;
[/mm]
elseif z == 2
[mm] img_3 [/mm] = [mm] img_0;
[/mm]
end
Ich habe also die Grösse der Matrix bestimmt mit size und da ist z entweder 1, 2 oder 3. 1 bei grauen Bilder, 3 bei Farbbildern und 2 bei eventuell schon veränderten Bildern mit Tiefe 2.
Dann habe ich eine Matrix (x,y) erstellt mit lauter Nullen, damit die anderen Abfragen einfach durchlaufen können und ich da nicht noch unterscheiden muss. Wenn also ein Bild nur die Tiefe 1 oder 2 hat, ist die restliche oder sind die restlichen Matrizen einfach Matrizen mit Nullen. Und abgefragt habe ich indem ich if == z gefragt habe. Aber das wirft ja die Fehlermeldung raus...
Verwirrte Grüsse, Jana
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 09:29 Mi 17.02.2010 | Autor: | Frasier |
Hi Jana,
du kannst den Quelltext zwischen [ code] und [ /code] setzen, ohne die Leerzeichen. Dann wird er nicht umformatiert.
Du hast zwar die Abfrage gemacht, aber erst nachdem du mit
1: | img_2 = img(:,:,2);
| 2: | img_3 = img(:,:,3); |
auf die 2. und 3. Ebene zugreifst. Und bei einem grauen Bild geht das eben in die Hose.
Du musst zu erst die Abfrage machen, dann kannst du den Zugriff auf nicht vorhandene Elemente vermeiden.
lg
F.
|
|
|
|