Hiho,
es handelt sich eigentlich um ein recht "simples" Problem, leider habe ich dafür noch keine wirklich zufriedenstellende Lösung gefunden..
Mein Programm soll die Position und Breite eines Elektronenstrahls auf einer großen Kamera (4k*4k, 16bit) bestimmen - es gibt immer nur einen Spot, dieser kann einige hundert bis einige zehn Pixel breit sein, hier mal ein Ausschnitt:
Ich fitte den Spot mit einer Gauss surface an, was eigentlich gut klappt, jedoch macht es natürlich nur Sinn, einen kleinen Bereich um den Spot herum zu fitten und nicht das ganze 4k*4k Bild (allein schon weils ewig dauern würde). Daher versuche ich im ersten Schritt die Position des Peaks grob zu bestimmen und eine gewisse Umgebung dieses Punktes fitten zu lassen; die Breite der Fit-Box drumherum lege ich erstmal manuell fest, da die zu fittenden Datensätze ziemlich gleichartig sind..
Nun ist es bei realen Messdaten ja so, dass sie teils verrauscht sind, der Peak evtl. schwach ist oder der Hintergrund nicht wirklich homogen. Noch schlimmer: manchmal gibts "kosmische Events" im Szintillator, wobei dann einzelne Pixel enorme Count-Werte bekommen (viel höher als der Elektronen-Peak, dafür nur 1-2 Pixel breit).
Meine Herangehensweise ist bisher folgende: Zuerst lasse ich 2 IMAQ Filter drüberlaufen (den lowpass und einen Gauss Kernel, jeweils 5x5). Danach werden X- und Y-Achse linear gemittelt (IMAQ LinearAverages) und der jeweilige Maximalwert ist die X- bzw. Y-Koordinate des Peaks.
Das funktioniert recht schnell (
.. Ich muss manchmal auch das Bild drehen, das verfälscht auch die Werte an den Rändern beim Mitteln..
Bei starken kosmischen Events reicht die Glättung durch die 2 Filter manchmal nicht aus und es wird der falsche Peak erkannt..
Gibt es eine elegante und wirklich zuverlässige Methode, die Position von Peaks zu erkennen (evtl. mit manueller Vorgabe von Mindest- oder Maximalbreite)? Ich hab auch schon an die Threshold-Funktion gedacht (bzw. davon gelesen), aber die liefert auch nur Maximalwerte und würde bei übersteuerten Pixeln nicht funktionieren, oder?
Ich hab noch nicht allzuviel Erfahrung mit Vision, vielleicht hab ich da nen genialen Trick übersehen und ihr könnt mir auf die Sprünge helfen...