View Full Version : [FRAGE] - Bsp2c - 2 lokale Maxima finden
klaustaler
22-10-2007, 16:14
hi!
weiß jemand, wie man genau auf die 2 lokalen maxima kommt? Ich hab bisher mit dieser Formel rumprobiert:
a = imhist(korn);
lokMax = find((a(2:end-1) - a(1:end-2)) > 50);
Aber der Wert 50 ist einfach willkürlich gewähtl und ich bekomme dadurch mehrere lokale Maxima. Klar könnte ich den Wert hochdrehen, bis nur mehr 2 werte übrigbleiben, aber das ist ja dann nicht für jedes Bild gleich...
Ableiten geht ja auch nicht, weil ich histogramme habe und keine funktionen.
Außerdem ist bei der obigen Zeile ja auch nicht der Mindestabstand von 25 Grauwerten berücksichtigt...
danke schonmal!
der flo
Es gibt natürlich mehrere Vorgehensweisen, aber mit einem einzigen Befehl läßt sich das Problem nicht lösen.
Man kann sich z.B. das erste Maximum suchen und anschließend alle Histogrammwerte in dessen Umgebung auf Null setzen. Dann muß man wiederum das Maximum suchen und erhält somit das zweite Maximum.
LG
Sebastian (GDBV-Tutor)
So hab ichs gemacht :)
Nur braucht man für die Suche nach dem minimum eine Kopie des originalen Histogramms, sonst stehen da ja Nuller drinnen....
Lg
Spite
edit:
ups schon alt
Noch eine Frage zum Treshold:
Soll ich einen Bereich von zB25 festlegen? oder soll ich (hab ich grad probiert ->) den Bereich verkleinern, wenn auch der Kontrast kleiner ist??
Frage: Soll das Minimum außerhalb der Bereiches liegen??, Dann muß ich das noch einbauen....
noch eine Frage:
ich habe ein Bild in Blöcke unterteilt (Blockgröße zB 80 Pixel) zB korn.tif, dann bekomme ich folgende Tresholds (Positionen entsprechen den Block-Positionen):
treshold:
202 202 195 195 189
200 197 199 196 186
199 196 200 125 190
202 197 201 194 189
Das kann ja nicht sein, oder?? einzig vorletzteSpalte/vorletzteZeile liefert mir einen guten Wert, ich komm nicht drauf wieso......... :(
Und zum "interpolieren" nehme ich imresize(treshold, [xsize ysize], 'bilinear') das stimmt soch oder?? (wird zumindest schön interpoliert ;) ).
Ich denke mein fehler liegt irgendwo in der treshold1 methode, die für jeden Block aufgerufen wird, woran kanns liegen?
Wenn jemand einen Tipp hat, nur her damit ;)
Lg
Spite
Ich habe jetzt den Bereich zur Minimumsuche eingeengt auf:
max1 + bereich - max2 - bereich, somit bekomme ich zZ sowas:
treshold =
89 80 105 93 67
76 113 48 91 80
98 118 113 100 96
94 103 61 68 114
Sieht doch gleich besser aus ;)
Lg
spite
ej, wie macht ihr das genau mit dem herausfinden der beiden maxima?? und was bedeutet der punkt: "Das Minimum zwischen den beiden gefundenen Maxima ist der gesuchte Schwellwert."
bitte um tipps.... thx
Du erstellst ein Histogramm deines Bildes, das ist dann ein Vektor mit den Grauwerten (ist der Index - 1) und der Anzahl der Pixel mit diesem Grauwert.
Dann suchst du den Index des Grauwertes mit den meisten Pixeln und löscht rund um diesen Index alle Werte (denn sonst wäre wahrscheinlich der 2.Maxwert gleich daneben....
Dann hast einen Vektor mit einem Bereich der 0 ist, und in dem suchst du noch einmal und erhälst den 2. Maximalwert.
Nun nimmst vom Original-Histogramm den Ausschnitt ziwschen den beiden Maximalwerten her und suchst den minimalwert - das is dann dein Threshold, so habs ich zumindest......
Lg
Spite
Noch eine Frage zum Treshold:
Soll ich einen Bereich von zB25 festlegen? oder soll ich (hab ich grad probiert ->) den Bereich verkleinern, wenn auch der Kontrast kleiner ist??
Ein fixer Wert genügt. Allerdings gibt es keinen optimalen Wert dafür für alle Bilder. Dein Vorschlag macht also schon Sinn, ist aber nicht gefordert.
Frage: Soll das Minimum außerhalb der Bereiches liegen??, Dann muß ich das noch einbauen....
Wie meinst Du das?
noch eine Frage:
ich habe ein Bild in Blöcke unterteilt (Blockgröße zB 80 Pixel) zB korn.tif, dann bekomme ich folgende Tresholds (Positionen entsprechen den Block-Positionen):
treshold:
202 202 195 195 189
200 197 199 196 186
199 196 200 125 190
202 197 201 194 189
Das kann ja nicht sein, oder?? einzig vorletzteSpalte/vorletzteZeile liefert mir einen guten Wert, ich komm nicht drauf wieso......... :(
Das ganze hängt pro Bild satrk von der Blockgröße und dem Mindestabstand zw. den Maxima ab. Veränder mal die Parameter und schau, obs besser wird.
Und zum "interpolieren" nehme ich imresize(treshold, [xsize ysize], 'bilinear') das stimmt soch oder?? (wird zumindest schön interpoliert ;) ).
Wieso interpolieren? Die Ausgabe sollte ja ein Binärbild sein, das den Hintergund von den Objekten trennt.
LG
Sebastian (GDBV-Tutor)
Wie meinst Du das?
Das meinte ich so:
zB.:
Histogramm h
max1(h) = 40
max2(h) = 150
löschBereich = 25
Soll ich dann den gesamten Bereich zwischen 40:150 zur Minimumssuche nehmen, oder den Bereich(40+löschBereich ): (150-löschBereich).
Wenn ich 2. mache, komme ich auf das 2.threshold ergebnis von oben, sonst auf das erste......
Eventuell hatte ich vorher einen Fehler drinnen, bevor ich das Umgestellt habe auf die 2. Methode....
Wieso interpolieren? Die Ausgabe sollte ja ein Binärbild sein, das den Hintergund von den Objekten trennt.
Weil im Skriptum steht, das man die threshold werte für jeden Pixel des Bildes interpolieren soll, also jeder Pixel einen eigenen Threshold besitz oder nicht??
Lg
Spite
Das meinte ich so:
zB.:
Histogramm h
max1(h) = 40
max2(h) = 150
löschBereich = 25
Soll ich dann den gesamten Bereich zwischen 40:150 zur Minimumssuche nehmen, oder den Bereich(40+löschBereich ): (150-löschBereich).
Den gesamten Bereich zwischen 40:150
Weil im Skriptum steht, das man die threshold werte für jeden Pixel des Bildes interpolieren soll, also jeder Pixel einen eigenen Threshold besitz oder nicht??
Jeder Block (als z.B: 80x80) hat einen eigenen Threshold, nicht jedes Pixel. Deine Interpolation kann man schon machen und macht auch Sinn, ist aber nicht gefordert.
LG
Sebastian (GDBV-Tutor)
Nachdem ich nicht zur VO kommen kann geh ich nach Skriptum vor, und da steht das eindeutig drinnen (außerdem sind da auch die Ergebnisse um einiges besser (siehe Thresholds von ganz oben - aber wie gesagt, ev. waren da auch Fehler drinnen noch).....
Ok ich probiers nochmal aus mit dem ganzen Bereich zwischen del Maxima...
Danke
Lg
Spite
Nachdem ich nicht zur VO kommen kann geh ich nach Skriptum vor, und da steht das eindeutig drinnen (außerdem sind da auch die Ergebnisse um einiges besser (siehe Thresholds von ganz oben - aber wie gesagt, ev. waren da auch Fehler drinnen noch).....
Wo steht das, daß man die Thresholds interpolieren soll? Im VO-Skriptum oder in den Übungsangaben?
LG
Sebastian (GDBV-Tutor)
Im Skriptum, Seite 21 vorletzte Zeile :)
Lg
Spite
Hab momentan leider kein Skriptum bei mir.
Wie gesagt, es macht schon Sinn, ist hier aber nicht gefordert.
LG
Sebastian (GDBV-Tutor)
sry, jetzt wieder eine 'dumme' frage.. ich rufe bei mir im code die fkt threshold1 nach dem ich mir die Bilddaten einlese auf, und nur beim ersten aufruf bearbeitet er mir alles und liefert was richtiges zurück und bei den anderen beiden liefert er mir nur leere werte, glaube es führt gar nicht das aus was es sollte... hatte jemand ähnliche probleme???
bzw.. liege ich richtig bei den funktionsaufrufen???
danke..!!
Kann es sein, daß Du irgendwie eine Matrix mit Namen threshold1 im Speicher hast? Das könnte das Problem sein.
LG
Sebastian (GDBV-Tutor)
Kann es sein, daß Du irgendwie eine Matrix mit Namen threshold1 im Speicher hast? Das könnte das Problem sein.
na es war nichts mit einer matrix... es war ein etwas trauriges Problem, unlogisches und unverständliches denken meinerseits, absolut falscher gedankengang! aber jetzt habe ich das soweit fertig das alles passen sollte.
hätte aber eine frage ob jemand vllt. die bilder uploaden könnte damit man das vergleichen kann.. ja ich würds selber machen aber iregendwie schaffe ich es nicht diese 'upzuloaden' (geiles wort :)) ) .. wenn ichs schaffe mache ich das ee, aber im moment gehts irgendwie nicht!!
noch eine weitere Frage; wie unterteilt man das bild in Blöcke zu je 80x80 pixel?? iregendwie bin ich schon unkonzentriert und check nichts mehr...
bitte um eine funktion bzw. um ansatz wie ich das Bild in 80x80 pixel unteteilen kann??
wie habt ihr das gemacht??
Man geht einfach in ner for-Schleife die Blöcke durch und übergibt diese der Threshold-Funktion.
Noch einfacher geht es mit der Funktion blkproc.
LG
Sebastian (GDBV-Tutor)
Man geht einfach in ner for-Schleife die Blöcke durch und übergibt diese der Threshold-Funktion.
Noch einfacher geht es mit der Funktion blkproc.
Danke für den Hinweis, ist mir zwar peinlich zu sagen aber ich kämpfe schon Stundenlang mit der 'blkproc' - Funktion und checke einfach nichts was da genau abläuft.. Ich nehm mal an ich rufe es in meinem Sourcecode auf und sollte dann in dieser Funktion zb. 'x= blkproc(image, [80 80], fun);' mein threshold aufrufen.. aber verstehe vorerst zero was dieses fun sein sollte, laut der Help "fun is a function handle that accepts an m-by-n matrix, x, and returns a matrix, vector, or scalar y." und nun verstehe ich gar nicht mehr wie man das mit der threshold2 funktion verknüpfen sollte/könnte??
aaah; matlab und ich :shinner:
Für fun schreibst Du einfach ein function handle für die threshold1-Funktion:
x=blkproc(image,[80 80],@threshold1);
LG
Sebastian (GDBV-Tutor)
Nachdem ich das shcon manuell eingebaut habe werde ich nicht mehr umsteigen auf die blkproc, wobei das natürlich kammoter gewesen wäre :)
Also mit einer doppelten for Schleife (ist nicht so schlimm, weil zB e nur 4x5 Blöcke vorhanden sind) einfach einen Block ausschneiden, und das Resultat in eine neue Matrix speichern.....
Lg
Spite
Wie lautet der matlab-Befehl, der die Daten um das erste Maximum löscht und der um das lokale Maximum herauszufinden?
Wie lautet der matlab-Befehl, der die Daten um das erste Maximum löscht und der um das lokale Maximum herauszufinden?
Befehl gibts da keinen, das geht am besten über Indizierung: histogram((maxim-25):(maxim+25)) = 0;
setzt den Bereich +- 25 vom Maximum auf 0.
Aufpassen muß man da nur, daß man keine Werte außerhalb des Histogramms indiziert.
LG
Sebastian (GDBV-Tutor)
signalout
16-11-2007, 21:14
im grunde haben wir die methode treshhold jetzt fertig. einzig die sache mit der methode als eigene datei macht uns noch ein bisschen zu schaffen.
wie kann ich eine methode in eine eigene datei schreiben (in unserem falle wäre das treshhold1.m) und sie dann in der bsp2c.m aufrufen?
im grunde haben wir die methode treshhold jetzt fertig. einzig die sache mit der methode als eigene datei macht uns noch ein bisschen zu schaffen.
wie kann ich eine methode in eine eigene datei schreiben (in unserem falle wäre das treshhold1.m) und sie dann in der bsp2c.m aufrufen?
Ihr deklariert threshold1 als Funktion und schreibt sie in threshold1.m
LG
Sebastian (GDBV-Tutor)
klaustaler
18-11-2007, 15:46
kuck mal in der hilfe von matlab nach. da steht drin, wie du die funktion deklarierst. die m-datei muss dann lediglich den selben(!) namen haben, wie eure funktion. dann schmeißt du sie in den gleichen ordner wie die bsp.m und kannst sie von dort aus aufrufen.
Müssen wir auch beim ersten lokalen Maximum einen Mindestabstand von 25 Pixel berücksichtigen(in dem Fall vom Rand , von 0 bzw 255) oder nur wenn wir das zweite bestimmen?
Müssen wir auch beim ersten lokalen Maximum einen Mindestabstand von 25 Pixel berücksichtigen(in dem Fall vom Rand , von 0 bzw 255) oder nur wenn wir das zweite bestimmen?
Nur beim zweiten.
LG
Sebastian (GDBV-Tutor)
vBulletin® v3.7.1, Copyright ©2000-2009, Jelsoft Enterprises Ltd.