PDA

View Full Version : [Frage] Beispiel 2 - Mittelwertfilter und Grauwerte spreizen


Unic0der
20-10-2004, 15:19
Ich hätte folgende Fragen zu Beispiel 2:

1) Dürfen wir glaubt ihr " fspecial('average'... " für den Mittelwertfilter verwenden (in der Angabe steht ja fspecial nicht unter den Befehlen die wir verwenden sollen)?

2) Ich kann mir irgendwie nicht ganz vorstellen was mit "spreizen der Grauwerte im Bereich XY" gemeint ist. Bitte um Erklärung. :)

oliwise
20-10-2004, 22:31
Zumindest wird im Übungsskriptum auf Seite 11, Punkt 2.1.6, letzter Satz ganz unten, auf die Funktion hingewiesen

oliwise
20-10-2004, 22:37
Betrefflich den Grauwerten muss ich ebenfalls auf das Ü-Skriptum Seite 11, Punkt 2.1.6 verweisen.

Unic0der
20-10-2004, 23:03
Zumindest wird im Übungsskriptum auf Seite 11, Punkt 2.1.6, letzter Satz ganz unten, auf die Funktion hingewiesen

Jo, ist schon klar, aber in der Angabe zu Beispiel 2 steht ja - ich zitiere - "Folgende MatLab Kommandos können verwendet werden: imread, figure, imshow, imrotate, conv2, min, max, mean, std"

Da fspecial nicht darunter ist frage ich mich daher ob wir es verwenden dürfen ...

Betrefflich den Grauwerten

D.h. "spreizen" bedeutet einfach nur auf die Werte 0-255 zu skalieren. Passt. :)

oliwise
20-10-2004, 23:58
Naja, ich weiß nicht. Eigentlich gehts ja auch ohne, oder? Also besser nichts riskieren, bzw. in der nächsten Übung den Tutor fragen

Unic0der
26-10-2004, 10:27
Laut Skriptum Seite 11 soll ja die leere Matrix in imshow die Werte auf 0 - 255 abbilden. Nur: Wieso geschieht das bei mir nicht wenn ich

imshow(Eule_bearb,[]);

mache?

buschti
26-10-2004, 12:23
Laut Skriptum Seite 11 soll ja die leere Matrix in imshow die Werte auf 0 - 255 abbilden. Nur: Wieso geschieht das bei mir nicht wenn ich

imshow(Eule_bearb,[]);

mache?

Das müßte eigentlich schon funktionieren. Was wird denn bei Dir angezeigt?

hajaj
26-10-2004, 15:01
Das müßte eigentlich schon funktionieren. Was wird denn bei Dir angezeigt?Nun gut - ich habe das selbe Problem - hier ein Beispiel: Sagen wir ich lese das modifizierte Farbbild eule_mod.bmp ein:

OriginalEule = imread('eule_mod.bmp');

und mache dann ...

figure;
imshow(OriginalEule,[]);

... dann ist meine Ausgabe auch ein Farbbild. Und das sollte doch nicht sein, oder?

buschti
26-10-2004, 18:44
Nun gut - ich habe das selbe Problem - hier ein Beispiel: Sagen wir ich lese das modifizierte Farbbild eule_mod.bmp ein:

OriginalEule = imread('eule_mod.bmp');

und mache dann ...

figure;
imshow(OriginalEule,[]);

... dann ist meine Ausgabe auch ein Farbbild. Und das sollte doch nicht sein, oder?

Doch, natürlich. Wenn Du ein Farbbild einliest, wird das als m-by-n-by-3 Array abgespeichert und auch richtig als Farbbild von imshow angezeigt. Wenn Du aber z.B. imshow(OriginalEule(:,:,1),[]); verwendest, wird ein Grauwertbild, das die Intensitäten des R-Kanals beschreibt, angezeigt.

Also:
m-by-n Arrays werden als Grauwertbild angezeigt
m-by-n-by-3 Arrays werden als Farbbilder angezeigt

hajaj
26-10-2004, 19:51
Danke für die tolle Erklärung. Jetzt ist es klar. :thumb:

Zwei Fragen habe ich aber noch:

Wie kann ich am einfachsten einen String mit irgendeinem Ergebnis das in einer Variable gespeichert ist auf der Matlab Konsole ausgeben?
Bei Beispiel 2 / Punkt 6 sollen wir ja die Bildgröße ausgeben. Wie stelle ich das an? Bitte Tipps ...

buschti
26-10-2004, 20:16
Zwei Fragen habe ich aber noch:

Wie kann ich am einfachsten einen String mit irgendeinem Ergebnis das in einer Variable gespeichert ist auf der Matlab Konsole ausgeben?
Bei Beispiel 2 / Punkt 6 sollen wir ja die Bildgröße ausgeben. Wie stelle ich das an? Bitte Tipps ...

Naja, es heißt ja nur "Berechnen Sie...", man muß da sicher keine schöne Ausgabe ala "Die Bildgröße beträgt m x n" usw. haben.

Aber falls ihr es unbedingt machen wollt: für solche Fälle ist sprintf gut geeignet, einfach in der Matlab-Hilfe nachschauen.

hajaj
26-10-2004, 21:44
Ok, und wie geht das jetzt mit dem auslesen der Bildgröße?

johm
26-10-2004, 22:07
Hi,
vielleicht bin ich schon total dämlich aber ganz check ich das mit dem spreizen nicht?
was is da nun gemeint.
ich mein imshow(bla,[]) bildet automatisch auf 0-255.
oder ist nun gemeint dass wir mit 255 mulitplizieren müssen wie im bsp. darunter?
Spreizen??:confused:
das is ein wenig dürftig für mich. bin noch zu fertig von gestern:tongue1:

lg

buschti
26-10-2004, 22:50
Ok, und wie geht das jetzt mit dem auslesen der Bildgröße?

Die Bildgröße entspricht ja den Dimensionen der jeweiligen Matrix. Also einfach die Funktion size() benutzen.

buschti
26-10-2004, 23:06
Hi,
vielleicht bin ich schon total dämlich aber ganz check ich das mit dem spreizen nicht?
was is da nun gemeint.
ich mein imshow(bla,[]) bildet automatisch auf 0-255.
oder ist nun gemeint dass wir mit 255 mulitplizieren müssen wie im bsp. darunter?
Spreizen??:confused:
das is ein wenig dürftig für mich. bin noch zu fertig von gestern:tongue1:


Prinzipiell wird bei der Spreizung eine lineare Funktion auf die Pixelwerte des Bildes angewendet, die dem minimalen Wert im Bild 0 und dem maximalen Wert 255 zuweist. Dazwischen steigen die Werte linear an.

johm
26-10-2004, 23:31
ag uf hä. ich mein danke für dir erklärung.
das heißt in unserem fall jez was? ich weiß cih steh auf der leitung aber ich check das net ganz.
also gibts dafür nun eine funktion die wir anwenden sollen.
hmmm. gibts die schon in matlab oder ist die selber zu implementieren oder bin ich total auf dem holzweg?:confused:

uff...

oliwise
27-10-2004, 14:57
hab ich oben eh schon gepostet:
Ü-Skriptum Seite 11, Punkt 2.1.6.

johm
27-10-2004, 18:48
ja danke das hab ich eh schon gelsen aber ich weiß net ganz was dort gemeint ist...
genügt es jez dass man [] setzt oder nicht...
sprich was genau ist mit spreizen gemeint...
dass man dann noch *255 rechnet weil matlab das eh automatisch auf 0-255 skaliert...
vielleicht check ich das ganz einfach überhaupt net aber das is so das probl.
lg

buschti
27-10-2004, 20:54
hab ich oben eh schon gepostet:
Ü-Skriptum Seite 11, Punkt 2.1.6.

die funktion mat2gray darf aber laut angabe nicht verwendet werden

johm
27-10-2004, 21:57
uff naja jez hätt ich jez aber so gemacht...
wie ist das dann zu lösen?
mit der formel aus dem VOskriptum?
das kann ja auch nicht sein oder?

buschti
28-10-2004, 10:54
uff naja jez hätt ich jez aber so gemacht...
wie ist das dann zu lösen?
mit der formel aus dem VOskriptum?
das kann ja auch nicht sein oder?

Doch, die Funktion ist im Vo-Skriptum abgebildet, zumindest in dem vom letzten Jahr (das aktuelle hab ich nicht). Dort heißt es halt "Kontrast strecken". Du mußt Dir eigentlich nur überlegen, wie diese Funktion ausschaut (also quasi das k und d aus der Geradengleichung y = kx + d bestimmen)

bimbo
28-10-2004, 13:30
seh ich das eh richtig, dass die anwendung des mittelwertfilters nix anderes als


erg = conv2(bild,filter);

ist, wobei filter eine 3x3 matrix mit lauter "1/9" ist

Waxy
28-10-2004, 14:54
Jo, du siehst das richtig so!
War mir auch nicht 100%ig sicher und hab deshalb den Übungsleiter gefragt, ob das passt!

johm
28-10-2004, 15:33
danke das is genau das was ich hören wollte vielen dank!!;)

hajaj
29-10-2004, 11:48
Doch, die Funktion ist im Vo-Skriptum abgebildet, zumindest in dem vom letzten Jahr (das aktuelle hab ich nicht). Dort heißt es halt "Kontrast strecken". Du mußt Dir eigentlich nur überlegen, wie diese Funktion ausschaut (also quasi das k und d aus der Geradengleichung y = kx + d bestimmen)

Ufff ... Reden wir da von der selben Gleichung? Die im heurigen Skriptum steht was zu Kontrast strecken auf Seite 21 und lautet
T(g) = (255/b-a)*(g-a)

Und um ehrlich zu sein habe ich keinen Schimmer wie ich das jetzt in Matlab umsetzen soll. :(

Bitte um Hilfe, bin verzweifelt. :ahhh:

Btw: Buschti, bist du Tutor? Weilst dich so super auskennst. :)

(EDIT) Wieso hat es eigentlich noch vor ein paar Tagen in dem Thread geheißen, dass man zum Grauwertspreizen einfach nur imshow(Eule_bearb,[]); machen muss? Stimmt das jetzt nicht mehr, oder?(/EDIT)

buschti
29-10-2004, 14:02
Ja, ich bin Tutor.

Genau die Gleichung meine ich. Die Umsetzung in Matlab ist nicht schwierig. g ist das bearbeitete Grauwertbild, a und b sind das Minimum bzw. Maximum im Grauwertbild. Also mußt Du lediglich a und b mit min() und max() bestimmen und diese Funktion anwenden (aber nicht vergessen den .* Operator für die Multiplikation zu nehmen)

imshow(Eule_bearb,[]) macht wohl intern genau das selbe, hier müßt Ihr aber wirklich das Bild selbst spreizen.

johm
29-10-2004, 15:31
neeeeeiiiiiiiiinnnnn ich hab den punkt vergessen....
mannooooo danke für den tip ...
naja dann nochmal*g*

andras98
29-10-2004, 17:26
hmmm...


a=min(M);
b=max(M);
N=(255./(double(b)-double(a)));
N=N.*(double(M)-double(a));

??? Error using ==> -
Matrix dimensions must agree.


Was mich auch wundert ist, dass das min/max ein Vektor mit 600 Elementen ist. Sollte das nicht nur ein Element sein? S21 im Vorlesungsskript sagt leider nicht viel aus ...

lg,

andreas

buschti
29-10-2004, 17:54
hmmm...



Was mich auch wundert ist, dass das min/max ein Vektor mit 600 Elementen ist. Sollte das nicht nur ein Element sein? S21 im Vorlesungsskript sagt leider nicht viel aus ...


Bevor man eine Funktion benutzt, sollte man immer die Matlab-Hilfe verwenden um zu schauen, was die Funktion eigentlich genau macht.
max() von einer Matrix ergibt einen Zeilenvektor, der das Maxmimum der Spalte der Matrix enthält. max() von einem Vektor ergibt den maximalen Wert in dem Vektor. Genau gleich verhält es sich mit min(). Das heißt, Du mußt max() bzw. min() Dein Grauwertbild als Vektor übergeben.

johm
29-10-2004, 19:43
sprich entweder du machst das was buschti gar net gefällt und machst einfach max(max(matrix))
oder wie ich schon mal früher geschrieben hab-
vector = matrix(:))

das sollt hinhauen...
hoff ich hab mir das richtig gemerkt sonst schau an anderer stelle nach hab das eh schon mal gepostet.
lg

thewulf
30-10-2004, 12:53
Ja, ich bin Tutor.

Genau die Gleichung meine ich. Die Umsetzung in Matlab ist nicht schwierig. g ist das bearbeitete Grauwertbild, a und b sind das Minimum bzw. Maximum im Grauwertbild. Also mußt Du lediglich a und b mit min() und max() bestimmen und diese Funktion anwenden (aber nicht vergessen den .* Operator für die Multiplikation zu nehmen)

Was macht der .* Operator? Ich hab das ganze jetzt als eine Matrixoperation gemacht (eine Matrix mit lauter a von der Bildmatrix subtrahiert und dann die Matrix mit dem Skalierungsfaktor multipliziert). Is das falsch?

Matthias
30-10-2004, 14:13
Was macht der .* Operator? Ich hab das ganze jetzt als eine Matrixoperation gemacht (eine Matrix mit lauter a von der Bildmatrix subtrahiert und dann die Matrix mit dem Skalierungsfaktor multipliziert). Is das falsch?

Alle .irgendwas Operatoren wenden die Operationen elementweise an. D.h. wenn du 2 gleich große Matrizen hast, und diese mit .* multiplizierst, dann wird 1/1 von Matrix 1 mit 1/1 von Matrix 2 multipliziert usw.
* würde ja eine normale Matrixmultiplikation machen.

thewulf
30-10-2004, 14:18
Alle .irgendwas Operatoren wenden die Operationen elementweise an. D.h. wenn du 2 gleich große Matrizen hast, und diese mit .* multiplizierst, dann wird 1/1 von Matrix 1 mit 1/1 von Matrix 2 multipliziert usw.
* würde ja eine normale Matrixmultiplikation machen.

Ok, dann passt das bei mir eh. Ich multipliziere die Matrix mit einem Skalar.

Unic0der
31-10-2004, 11:17
Ich hab mal mein Bild von der Eule mit gespreizten Grauwerten angehängt (also die Ausgabe von Beispiel 2.5). Schaut das bei euch genau so aus?

EDIT: Das Originalbild hat ja 450x600 Pixel, mein bearbeitetes aber witzigerweise nur 449x599 Pixel. Geht das so OK, oder sollte das bearbeitete Bild exakt gleich groß sein?

thewulf
31-10-2004, 12:13
bei mir sieht das ganz anders aus. nämlich so, wie das bild davor ohne manueller spreizung, ausgegeben mit imshow(I, []).

die größe ist bei mir durch die anwendung des mittelwertfilters auf 602x452 gewachsen. anbei mein ergebnisbild.

jpeg (85 kb) (http://stud4.tuwien.ac.at/~e0225152/images/ergebnis.jpg)
png (224 kb) (http://stud4.tuwien.ac.at/~e0225152/images/ergebnis.png)

lEn00x
31-10-2004, 17:25
@thewulf: unser bild sieht auch so aus.

thewulf
31-10-2004, 17:31
dann ist ja gut.

was ich mittlerweile aber noch geändert habe: damit die faltung so arbeitet, wie im skriptum beschrieben (also kein padding am bildrand, um den filter auf jeden pixel anwenden zu können), habe ich der conv2-funktion den parameter 'valid' mitgegeben. dadurch wird das bild in jeder dimension um 2 pixel kleiner statt größer (nicht erreichbare pixel werden einfach abgeschnitten).

was meint ihr dazu? welches ist wohl das gewünschte ergebnis?

Unic0der
31-10-2004, 19:22
was meint ihr dazu? welches ist wohl das gewünschte ergebnis?

Ich vermute, das eher deine ursprünglichen 602x452 Pixel passen. Weil wenn man den Mittelwertfilter mittels fspecial macht erhält man das selbe Ergebnis.