Laden...

Strukturen in Bildern erkennen und vermessen

Erstellt von EFK381 vor 15 Jahren Letzter Beitrag vor 15 Jahren 4.967 Views
E
EFK381 Themenstarter:in
92 Beiträge seit 2008
vor 15 Jahren
Strukturen in Bildern erkennen und vermessen

Hallo!

Ich drehe mich irgendwie ein bisschen im Kreis und wollte euch daher mal wieder um eure Hilfe bitten. Ich versuche derzeit ein einfaches Tool zu entwickeln, welches von mir erstellte Bilder (640x480 bei 8Bit SW) lädt (pro Arbeitsgang ca 30 Stück) und wie folgt "auswertet":
In jedem Bild sind neben Hintergrungerscheinungen zwei besonders helle Leuchtpunkte ca 10x10 Pixel groß) zu sehen, immer an anderen Stellen. Ich benötige den Abstand dieser Punkte!

Bild rein -> Punkte automatisch finden -> Abstand ermitteln und speichern -> nächstes Bild

Bevor ich jetzt Anfange mich mit einer Menge Arrays herumzuschlagen und mir zu überlegen wie ich denn nun z.B. immer die hellsten Punkte finde, wollte ich Fragen ob ihr vielleicht Algorithmen kennt die mir zumindest in Teilbereichen bei meiner Aufgabe helfen würden.

Ist es überhaupt der richtige Weg alle Bilder in Arrays zu packen? Wie sonst?

🤔
Bin wirklich für jede Hilfe sehr dankbar!

Gelöschter Account
vor 15 Jahren

also technisch gesehen wird dir die task parallel lib mit dem Parallel.For am meisten helfen. zumindest was das abarbeiten von vielen gleichen aufgaben anbelangt.

was das finden der punkte betrifft, so ist das bedeutend schwieriger. in erster linie benötigst du einen effizienten lesenden zugriff auf die bilder. hier kann dir diese klasse weiterhelfen: Bitmap-Manipulation (MemBitmap)

dann musst du in 2 schleifen die hellste farbe und deren koordinaten ermitteln. anschließend ermittelst du mithilfe von füllalgorithmen den mittelpunkt des zuletzt gemerken hellsten punktes und schon hast du den ersten punkt und dessen abmessungen. selbiges noch einmal durchführen, wobei du den zuvor gefundenen punkt und dessen abmessungen ignorierst und schon hast du den 2. punkt.

925 Beiträge seit 2004
vor 15 Jahren

Das hört sich stark nach Head-Tracking an. Interessantes Thema. Halt uns mal auf dem Laufenden!

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo EFK381,

Ich drehe mich irgendwie ein bisschen im Kreis

ich kann dich beruhigen. Da wo der Mensch in der Lage ist, auf einen Blick zu sagen, wo sich die beiden Leuchtpunkte befinden, muss der Computer immer noch (wenn auch vielleicht parallelisiert) Pixel für Pixel durchgehen, um am Ende zu dem gleichen Ergebnis zu kommen. Du musst also keine Wunderalorithmen implementieren, sondern ganz elementar und primitiv die Helligkeitswerte der einzelnen Pixel betrachten. Wenn die Leuchtpunkte wirklich die Pixel mit maximaler Helligkeit im Bild enthalten, ist die Aufgabe relativ einfach in der Art zu lösen, wie JAck30lena es schon beschrieben hat.

herbivore

E
EFK381 Themenstarter:in
92 Beiträge seit 2008
vor 15 Jahren
Ich habs ja geahnt..

Hmm... WEnn ich ehrlich bin hätte ich es sooo schlecht auch nicht gefunden wenn Du mir einen wunderalgorithmus genannt hättest herbivore. 😁
Aber gut, dann eben selber ein bisschen Hirnschmalz reinstecken.
Von Parallel.For habe ich gestern schon gelesen als ich dieses Forum nach nuetzlichen Themen zu meiner Frage durchsuchte, scheint die neue Patentlösung zu sein was? Dann setze ich mich ertmal damit auseinander...

Dass die Punkte im Moment noch die hellsten im Bild sind ist eine Vereinfachung, die ich mir zum Anfang genehmige, irgendwann wird das wegfallen müssen, dann wird das Problem noch um einiges komplexer was?
Ich halte euch auf jeden Fall mal auf dem laufenden (Allein weil ich bestimmt noch ab und an Hilfe brauchen werde 😉 )

143 Beiträge seit 2008
vor 15 Jahren

Hallo,

was für Grafikanalyse Bibilotheken kennt ihr?
Ich hab mal mit Halcon gearbeitet. Ist aber eher für die industrielle Anwendung gedacht.

Gruß Timo

E
EFK381 Themenstarter:in
92 Beiträge seit 2008
vor 15 Jahren
Leider geht das so garnicht...

Also, ich habe mich jetzt mal ein wenig mit meinem Problem beschäftigt, und bin schon ziemlich schnell wieder an meine Grenzen gestoßen. Einfach nach dem hellsten Pixeln suchen funzt leider nicht, da*erstens dauernd "Störpixel" im Bild sind, die auf 255 und damit weiß stehen, aber nicht zu den zu suchenden Punkten gehören, und *zweitens die Punkte manchmal so hell sind, dass sie in der gesamten Größe (die ja variiert von Bild zu Bild) weiß sind.

Meine primitive Suche findet also einfach immer sehr sehr viele "hellste" Punkte in jedem Bild.
Da muss ich dann jetzt wohl noch sowas wie eine Mindestgröße für eine zusammenhängende Fläche hellster Punkte einführen, um Fehler von den gesuchten Punkten unterscheiden zu können.
Einfach jedes neue Pixel in ein kurzes Array (sagen wir z.B. der länge 6 als willkürlich definierte Mindestbreite eines Leuchtpunktes) schieben und erst dann nen Punktfund melden wenn das gesamte "Sucharray" nen bestimmten Schwellwert übersteigt?! (also jedes der 6 Einzelpixel)

Ich probiere einfach mal ne Weile rum.

War jetzt keine richtige Frage, aber vielleicht fällt einem ja was schlaues dazu ein, sonst gibts die Tage ne Lösung nach viel probieren... 😉

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo EFK381,

du hattest ja schon oben geschrieben:

Dass die Punkte im Moment noch die hellsten im Bild sind ist eine Vereinfachung, die ich mir zum Anfang genehmige, irgendwann wird das wegfallen müssen, dann wird das Problem noch um einiges komplexer was?

Und als ich mir neulich kurz dazu Gedanken gemacht hatte, wie das zu lösen wäre, wenn die Bedingung nicht erfüllt ist (was ja jetzt eingetreten ist), bin ich im Prinzip auf das gleiche gekommen, was du jetzt vorschlägst, also den Durchschnitt zusammenhängender Punkte berechnen und das Maximum dieses Durchschnitts suchen. Ich hatte das zwar mir einer Fläche (von sechs Pixeln Durchmesser) überlegt, aber vermutlich tun es sechs nebeneinander liegende Pixel auch.

Du bist also weiterhin auf dem richtigen Weg.

Natürlich brauchst du die Werte nicht extra in ein extra Array zu schreiben, um den Durchschnitt zu berechnen. Das kannst du direkt aus den Pixeln aus dem Bild machen.

herbivore

Gelöschter Account
vor 15 Jahren

poste doch mal so ein beispielbild.

E
EFK381 Themenstarter:in
92 Beiträge seit 2008
vor 15 Jahren
Beispiel

Klar, sobald ich heut Abend an meinem Rechner bin gibts auch nen Bild, hier hab ich keine.
Beim Träumen heut Nacht hab ich mir dann auch schon mal überlegt wie ich Deinen Hinweis

Natürlich brauchst du die Werte nicht extra in ein extra Array zu schreiben, um den Durchschnitt zu berechnen. Das kannst du direkt aus den Pixeln aus dem Bild machen.

noch umsetze herbivore. Ich glaube zumindest im Kopf habe ich damit dann jetzt eine schöne Lösung vorliegen, ob die auch so schön funktioniert sehe ich dann heut abend.
Bis dahin..

K
593 Beiträge seit 2007
vor 15 Jahren

Hallo,

ich hab mich mit solchen Problemen schon äufters rumgeschlagen. Man kann es wie Herbivore sagt schon einfach zusamhängende weißen Pixeln machen. Man kann es sich auch ein wenig einfacher machen in dem man ein Filter über das Bild schickt die alle vereinzelten weißen Pixeln in Schwarze Defeniert. Dazu benutzt man einfach eine Matrix und prüft bei jedem Pixel ob es drumherumliegende weiße Pixel gibt und wenn es genug gibt bleibt er weiß wenn es zu wenige drumherum sind wird der schwarz. So einfach 😃

Gruß Daniel

B
77 Beiträge seit 2008
vor 15 Jahren

Hallo EFK381,

diese Links könnten interesstant für Dich sein:

http://www.codeproject.com/KB/audio-video/Optical_Flow_Estimation.aspx
http://www.codeproject.com/KB/audio-video/featuretracking.aspx

Hoffentlich nützt es was...

Grüße

Udo

E
EFK381 Themenstarter:in
92 Beiträge seit 2008
vor 15 Jahren
Sorry, ist später geworden...

Nun, im Anhang mal eines der noch einfacheren Bilder. Es kannn durchaus vorkommen dass der Kontrast Punkt/Hintergrund nicht so perfekt ist wie hier, da entweder der Hintergrung deutlich heller (und mit Strukturen) oder/und der gesuchte Punkt deutlich dunkler sein kann.
@ Kaji Erster Gedanke: "Was soll das denn bitte bringen ausser dass ich noch öfter durchs Bild iterieren muss?" Dann aber wuchs mein Interesse und so langsam glaube ich das ist garnicht mal schlecht. Mit diesem Filter kann man sich gleich ein "Korrekturverfahren" vorstellen. Mal angenommen ich finde im Bild 7 Punkte statt der 2 gesuchten (Helligkeitsschwellwert zu tief oder aber eben Punktgröße - herbivores und meine "Mittelwertlänge"- zu klein, so dass eben einfach auch Strukturen gefunden werden, die garnicht gefunden werden sollen.
Mit dieser Filtervariante wäre es einfach den Filter ncoh einmal drüber laufen zu lassen mit größerer "Nachbarnanzahl" um dann erneut nanch Punkten zu suchen. Noch zu viele? Nochmal.. usw...
Ansonsten sehe ich aber keine wirklichen Vorteile, oder?
Och man, schon wieder so spät, jetzt kann ich wieder nur kurz probieren 😦

1.361 Beiträge seit 2007
vor 15 Jahren

Hi,

erstens dauernd "Störpixel" im Bild sind, die auf 255 und damit weiß stehen, aber nicht zu den zu suchenden Punkten gehören, und

Was sind denn das für Störpixel? Wo kommen die her? Hast du davon auch ein Beispielbild?

Wenn du mit Überstrahlungen zu rechnen hast und trotzdem den Fleckmittelpunkt suchsts, bietet es sich, das Bild einfach weichzuzeichnen und dann den "Finde-die-zwei-hellsten-Punkte"-Algorithmus stupide drauf laufen zu lassen.
(Die Glättung muss allerdings mit Gaussfilter entstehen [mit dem Radius wie deine Flecken], weil nur der in etwa das Signal wiederspiegelt, das deine hellen Flecken erzeugen - Prinzip der Korrelation)

Könnte jedenfalls klappen. (Kannst ja mal die Bilder mit Gimp oder Photoshop per hand vor-weichzeichnen). [Wenn dus dann selbst implementierst, der Performance wegen unbedingt den Filter separieren. Und der Genauigkeit wegen evtl. mit Float-Werten arbeiten anstatt mit bytes.]

beste Grüße
zommi

K
593 Beiträge seit 2007
vor 15 Jahren

Hallo,

ja zommi hat es wohl mal wieder ein wenig besser erklärt 😃 Ich wollte nix anderes als das du das Bild im Prinzip Weichzeichnest. Du bearbeitest das Bild vor und wertest es danach aus. Damit du bestenfalls keine Störungen hast. Es ist echt einfacher meiner Meinung nach.

D
500 Beiträge seit 2007
vor 15 Jahren

Hallo zusammen,

ich habe diesen Thread ein wenig überflogen und dabei ist mir aufgefallen, dass hier von Helligkeitsproblemen geredet wird. In welchem Farbraum betrachtest Ihr die Werte (RGB)? Würde es nicht Sinn machen das Bild bspw. in den (HSV/HSL) Farbraum zu überführen, um die Helligkeit von Anfang an als Störfaktor auzuschliessen? Anschliessend betrachtet man nur den Farbton und die Sättigung nicht aber die Helligkeit. Generell sollte ja eine Vorverarbeitung (siehe Vorverarbeitung unter Artikel Mustererkennung) stattfinden. Interessant dabei ist fuer das Entfernen von Rauschen die Signalmittelung.
Schau Dich noch ein wenig auf der Wiki Seite um, denn es sollte auf jeden Fall bereits existierende Algorithmen bzw. Klassen geben, die es Dir ermoeglichen einen Filter (in einer Matrix) zu definieren, um Deine Elemente im Bild zu finden.

Gruss, DaMoe

1.361 Beiträge seit 2007
vor 15 Jahren

Ganz am Anfang stand:

640x480 bei 8Bit SW

also nur Graustufen.

beste Grüße
zommi

D
7 Beiträge seit 2009
vor 15 Jahren

hallo
ich hab ein kleines problem und hoffe, dass mir jemand helfen kann
also ich habe eine beliebige fläche (kreis, gezackt) die eine andere farbe hat als der rest des bildes. ich möchte den umfang dieser fläche berechnen. überlegt habe ich mir das ich es so mache indem ich die pixel an der grenze der fläche erkenne und mir somit den umfang ausrechnen kann. weiß vl jemand von euch ob und wie das geht?

lg

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo deibl31,

ich denke es ist einfacher und verlässlicher, den Durchmesser zu bestimmen.

Siehe auch Bildverarbeitung - Einfaches Beispiel - Grundformen finden und zählen

herbivore

D
7 Beiträge seit 2009
vor 15 Jahren

hallo herbivore

bei einem kreis hast du recht...danke! aber was mach ich bei einer unsymmetrischen form die zb auch noch gezackt ist?

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo deibl31,

da bekommst du dann das Problem der Messung der Küstenlänge:

Wegen der sehr unregelmäßigen Form mancher Küsten hängt die ermittelte Länge stark von der Genauigkeit der benutzten Kartengrundlage und der Genauigkeit der Messung ab. Dabei zeigt sich, dass feinere Messungen zu einer größeren Küstenlänge führen. Der Mathematiker Benoît Mandelbrot hat die Längenbestimmung einer Küste mit der von selbstähnlichen Kurven verglichen.

herbivore

D
7 Beiträge seit 2009
vor 15 Jahren

naja in meinem fall ist es nicht so, da ich ja ein bild habe welches ich nicht immer weiter vergrössern will denn ich hab schon den größt möglichen zoom und möchte daraus nur die pixel ermitteln

Gelöschter Account
vor 15 Jahren

edit: alles quatsch was ich geschrieben habe...

hier was dir helfen könnte:
du kennst doch bestimmt aus photoshop diesen komischen zauberstab, der beliebige formen selektieren kann? such mal im forum nach ihm.. ich meine mich zu erinnern, das wir das problem zumindest theorethisch gelöst hätten.

308 Beiträge seit 2005
vor 15 Jahren

Hallo EFK381,

schau dir mal diese Bibliothek an: AForge.

Die sollte alles, was du Brauchst können.

/cadi

E
EFK381 Themenstarter:in
92 Beiträge seit 2008
vor 15 Jahren
Zurück zu meinem Thema? ;-)

Da bin ich mal wieder eine Zeit lang mit so viel anderem Kram beschäftigt dass ich nicht dazu komme an meinem Projekt weiter zu machen bzw. hier was zu schreiben und schon "entgleitet" die Diskussion hier zu einem anderen Thema, doch dann, kurz bevor ich mich mal wieder melden will, gibt's auch was neues für mich und meine Frage! 😉
Danke! AForge. bietet ja so ziemlich das was ich machen wollte... aber inzwischen habe ich mir selbst was gebaut.
Jetzt bin ich bei (meinem von mir selbst definierten) Level drei des Problems angelangt. Die Bilder enthalten auch hellere Konturen als die gesuchten... Bin gerade damit beschäftigt irgendwie die gesuchte Kontur zu formalisieren, damit ich nur nach dieser in den Bildern "suchen" kann....

Nur so als Info...

L
36 Beiträge seit 2006
vor 15 Jahren

Hallo EFK381 ...

Ich hatte mal mit etwas Ähnlichem zu tun. Da ging es darum in einer Höhenkarte einer Landschaft, die als Grauwert-Array gegeben war, alle zusammenhängenden Flächen zwischen bestimmten Höhenwerten zu finden. Zum Beispiel "Finde alle zusammenhängenden Flächen, die zwischen 100 und 200 Meter Höhe liegen und entferne alle Flächen, die nicht mindestens X-Pixel groß sind."

Nach etlichem hin und her habe ich das dann halbwegs gelöst bekommen und die Verarbeitungszeit lag bei etwa 30ms für ein 512x512 Bild. Wenn du die Einzelpixel mittels Filter vorher entfernst, dürfte das wahrscheinlich auch für dein Problem anwendbar sein. Ohne diese Vorverarbeitung bekommst du halt, bei etwas schlechterer Laufzeit sehr viel mehr "Regionen" der Größe 1, die du dann wegschmeißen kannst.

Die größten gefundenen Regionen in einem bestimmten Graubereich dürften dann wahrscheinlich die hellen Flecken sein die du suchst. Alternativ könnte man die gefundenen Regionen sicher auch auf eine "ungefähre Kreisform" testen. Wenn du mittlerweile eine bessere Lösung gefunden hast, lass es mich wissen. Eventuell kann ich die ja auch verwenden. 😁

Der (relativ schlecht dokumentierte) Code ist hier zu finden:

[Erledigt] Region Growing - Performance/CodeRevision?