PDA

View Full Version : [FRAGE] - Bsp4a


Brösel
30-10-2007, 17:08
sodala, wir haben jetz alles durchgekaut von punkt 1-5 und kommen auf folgendes ergebnis bei BildA.jpg (nit erschrecken, kann sein, dass schwarz und weiß vertauscht san, aber des sollt ja koa rolle spielen...)

habts ihr des a so? oder lieg i da irgendwie daneben?

buschti
06-11-2007, 13:13
Hm, die Kanten sollten schon "durchgehender" sein. Kann sein, daß beim Verdünnen etwas schiefgelaufen ist.
Ihr müßt beachten, daß Matlab ein anderes Koordinatensystem für Bilder hat, d.h. das gilt auch für die Gradienten.

LG
Sebastian (GDBV-Tutor)

Spite82
09-11-2007, 17:19
Apropos:
Welche Punkte soll man jetzt in die myedge Funktion packen, 2 - 5?

Lg
Spite

Spite82
09-11-2007, 18:11
Frage zur Angabe (siehe oben):

Muss man alle Punkte von 2 - 5 in die myedge funktion Packen, oder soll man zB 1 - 4 in der Bsp4.m und die Punkte 2-5 in die myedge-Funktion packen??
Muß zugeben das ist nicht so ganz klar für mich...., denn u.U. muss man dann ja 2-4 ja doppelt einbaun.... (wegen den verschiedenen Ausgabe-Anforderungen von BildA und BildB oder?

Lg
Spite

buschti
09-11-2007, 18:44
Ja, die Punkte 2-5 müssen in myedge.
Schreibt es halt zweimal, macht ja nichts.

LG
Sebastian (GDBV-Tutor)

Spite82
09-11-2007, 22:05
@brösel:

Ich denke ich weiß, welchen Fehler du machst:
vertausche mal den horizontalen und den vertikalen Filter, wenn du deine Nachbarpixel bestimmst, denn den Fehler hatte ich auch, daß ich das hatte:

deltax = round(IHor(j, i)/IGradient(j, i));

aber das Brauchte:

deltax = round(IVer(j, i)/IGradient(j, i));

Wobei IVer mein mit dem [-1 0 1; -1 0 1; -1 0 1] Filter conv2-tes Bild ist, und IGradient der Gradient vom Bild....

Bei mir schaute es auch so aus, jetzt passt glaube ich.

Ich hatte jetzt ein anderes Problem:
Ich habe Hilfsvariablen, die den Index meiner beiden Nachbarn angibt auf int8 gekastet, und es wurde immer nur links oben ein kleiner Bereich bearbeitet.....
Siehe da:
ein cast auf int16 brachte die Lösung ;)

Lg
Spite

PS:
bei mir schauts jetzt so aus "myedge(bildA, 0.7, 128)", wie im Anhang, aber beim BildB habe ich keine Ahnung, wie ich die Parameter wählen soll....

brain
16-11-2007, 15:48
ich kapier irgendwie nicht wie dieser algorithmus (bzw die formel) gemeint is - kann man das irgendwo genauer nachlesen?

mfg, brain


edit: ok - einfach genauer die angabe lesen :)

hanzzz
16-11-2007, 22:30
d.h. die Funktion myedge stellt nur den Kantenoperator zur Verfügung, wird aber im MATLAB-Code niemals aufgerufen -> hab ich das richtig verstanden?

Noch eine Frage... in der Angabe steht ja

INPUTS [...] SIGMA [...] the size of the filter is chosen automatically based on SIGMA.

Wie soll man das realisieren? (if - else? :confused: ) Die fspecial-Funktion stellt das ja glaub ich nicht zur Verfügung.

brain
17-11-2007, 17:28
So, hab jetzt alles gemacht. Im Anhang mein Ergebnis - kann das so stimmen?

lg, brain

brain
17-11-2007, 19:33
d.h. die Funktion myedge stellt nur den Kantenoperator zur Verfügung, wird aber im MATLAB-Code niemals aufgerufen -> hab ich das richtig verstanden?

Noch eine Frage... in der Angabe steht ja



Wie soll man das realisieren? (if - else? :confused: ) Die fspecial-Funktion stellt das ja glaub ich nicht zur Verfügung.

ok - das würd mich auch interessieren :)

brain
17-11-2007, 19:35
So, myedge() ergibt bei mir dieses Ergebnis (Anhang) für Bild B und ein bißchen Spielen mit den Parametern.

sieht das gut aus?




mfg, brain

mak's
18-11-2007, 16:06
d.h. die Funktion myedge stellt nur den Kantenoperator zur Verfügung, wird aber im MATLAB-Code niemals aufgerufen -> hab ich das richtig verstanden? (...)


jep, myedge() stellt den entwickelten operator in einer funktion zur verfügung. d.h. du solltest myedge ein bild + die 2 parameter übergeben können und die funktion soll ein binäres kantenbild zurückgeben.


Wie soll man das realisieren? (if - else? :confused: ) Die fspecial-Funktion stellt das ja glaub ich nicht zur Verfügung.

bzgl. fspecial: h = fspecial('gaussian', hsize, sigma) (aus der matlab hilfe) wobei hsize die filter größe ist.
für euch gilt dann: gauss = fspecial('gaussian', 6*sigma+1, sigma);
mit mesh() könnt ihr den filter (z.b.: mesh(gauss)) als 3D plot ausgeben und so überprüfen ob die größe richtig gewählt wurde.

grüße markus

mak's
18-11-2007, 16:08
So, myedge() ergibt bei mir dieses Ergebnis (Anhang) für Bild B und ein bißchen Spielen mit den Parametern.

sieht das gut aus?

mfg, brain

jep, das schaut richtig aus...

grüße markus

hanzzz
18-11-2007, 16:22
für euch gilt dann: gauss = fspecial('gaussian', 6*sigma+1, sigma);


aber das funktioniert ja nur bei ganzzahligen Sigmas, denn hsize muss ja ein integer sein...

klaustaler
18-11-2007, 20:26
hab ich irgendwo in der matlab hilfe gefunden:

n = ceil(SIGMA*3)*2+1;

roogi
18-11-2007, 20:43
he, könnte mir vllt. jemand etwas genauer erklären wie man beim 4a punkt 5 vorgehen sollte?? checke echt weder 5a,b od. c??
hilfreiche tipps/verweise/... sind gern gesehen :cool:!
danke

mak's
19-11-2007, 13:12
hab ich irgendwo in der matlab hilfe gefunden:

n = ceil(SIGMA*3)*2+1;

stimmt natürlich, tut mir leid das hab ich vergessen...
grüsse markus

roogi
19-11-2007, 14:45
beim punkt 5a;
wie mache ich dass das ich für jeden kantenpixel in die dx/b und dy/b richtung gehe bzw. wie ist das gemeint??
und was bedeutet es wird einfach zum nächsten der 8 Nachbarn gerundet??
Und in welchem Zusammenhang kommt der Winkel hierbei vor??

buschti
19-11-2007, 16:08
beim punkt 5a;
wie mache ich dass das ich für jeden kantenpixel in die dx/b und dy/b richtung gehe bzw. wie ist das gemeint??
und was bedeutet es wird einfach zum nächsten der 8 Nachbarn gerundet??
Und in welchem Zusammenhang kommt der Winkel hierbei vor??

an jeder Stelle/Kantenpixel hast Du ja einen Wert für b, dx und dy. (dx/b,dy/b) ist dann der normierte Gradientenvektor, d.h. der Gradientenvektor zeigt Dir auf den Nachbarn und der negative Gradient auf den anderen Nachbarn.
In der Regel ist (dx/b,dy/b) nicht ganzzahlig, deswegen einfach mit round() runden.

LG
Sebastian (GDBV-Tutor)

roogi
19-11-2007, 17:07
an jeder Stelle/Kantenpixel hast Du ja einen Wert für b, dx und dy. (dx/b,dy/b) ist dann der normierte Gradientenvektor, d.h. der Gradientenvektor zeigt Dir auf den Nachbarn und der negative Gradient auf den anderen Nachbarn.
In der Regel ist (dx/b,dy/b) nicht ganzzahlig, deswegen einfach mit round() runden.
LG
Sebastian (GDBV-Tutor)

... naja, ich bin total verwirrt! mir ist klar das ich das alles habe also b, dx und dy... nur weis ich jetzt nicht soll ich jetzt für das berechnete dx wider dx/b und für das dy das dy/b nehmen und ausrechnen also pixel für pixel, oder was auch immer... oder ist da was anderes durch das schauen sie sich...

naja, bevor ich weiter nerve werde ich mir wieder das skriptum vor die augen führen und versuchen aus iregendwo iregendetwas darüber herauszulesen... vllt. wirds mir dann klarer.. aber bis jetzt, heavy :shinner:

danke!!

buschti
19-11-2007, 17:13
Schau Dir mal den Theorie-Teil an, v.a. Kapitel 4.2 "Non-Maximum Unterdrückung". Diese Methode zum Verdünnen wird nämlich auch beim Canny Edge Detector verwendet und ist hier prima erklärt.

LG
Sebastian (GDBV-Tutor)

bara
22-11-2007, 19:28
"Wenden Sie die Funktion auf BildB.jpg an und zeigen Sie sowohl das verdünnte als auch das unverdünnte Ergebnis."


-> ist damit gemeint, dass ich in E zwei Bilder zurückgeben soll?

wenn ja, wie funktioniert sowas?

// hat sich erledigt, habs schon herausgefunden.