LabVIEWForum.de
Teile eines Arrays integrieren - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein)
+--- Thema: Teile eines Arrays integrieren (/Thread-Teile-eines-Arrays-integrieren)

Seiten: 1 2


Teile eines Arrays integrieren - Tobias218 - 09.04.2013 10:58

Hallo zusammen,

ich stehe vor einem Problem was die Auswertung meiner Daten angeht. Ich habe Bilder mit eine ICCD-Kamera aufgenommen und diese schon als Array (1024 x 1024 Felder) gespeichert. Um Signale vom Untergrund zu unterscheiden, benutze ich die Threshold-Funktion, die ich für jedes Bild neu einstellen muss.
Hierzu gehe ich jede Zeile des Array einzeln durch und alle Werte, die unterhalb der Thresholdgrenze liegen (oder zu wenige Pixel hintereinander auftauchen (z.B. "Hot Spots")) werden mit "0" überschrieben.
Damit will ich ein Array erzeugen in dem ausschließlich Signale auftauchen. Diese sind leider nicht immer perfekt rechteckig und auch nicht an der selben Stelle. Ich möchte sie aber automatisch erkennen und aufsummieren.

Alle meine bisherigen Ideen funktionieren nicht. Einfach das Array Linie für Linie durchsuchen und bei einem Wert ungleich 0 einen Kasten fester Größe ziehen bzw. mit Teil-Array ausschneiden und mit Arrayelemente addieren funktioniert nicht, da meine Signale nicht immer gleich groß sind und so auch schon Intensitäten von Nachbarsignalen erfasst werden können. Außerdem wird das Pixel in der obersten Zeile des Signals gefunden. Wenn das auch die obere linke Ecke des Rechtecks darstellt, werden z.B. kreisförmige Signale beschnitten.

Ein Algorithmus der sobald er ein Signal gefunden hat in einem bestimmten Muster das Signal abläuft, kann ich in LabView leider nicht programmieren, da es eine nahezu unendlich lange Verschachtelung von True/False-Cases ergibt. Oder es funktioniert und ich habe es falsch angegangen Blush

Und wenn ich jeweils Zeilenweise die unter der Signalkurve eingeschlossene Fläche addiere, habe ich keine Ahnung, wie ich mehrere dieser Signalkurven sinnvoll verknüpfen kann, falls die Indizes nicht gleich sind.

tl;dr
Gesucht ist eine Möglichkeit, um geometrisch unförmige Signale eines Arrays aufzusummieren.

Ich hoffe, ihr könnt mir bei meinem Problem helfen.

Viele Grüße
Tobias


RE: Teile eines Arrays integrieren - Kasi - 09.04.2013 12:04

tl;dr indeed
kannst du vielleicht einfach mal ein Beispiel-Bild reinstellen, an dem du deine Auswertungswünsche illustrierst?


RE: Teile eines Arrays integrieren - Tobias218 - 09.04.2013 15:08

Hallo Kasi,

ich habe mal zwei verschiedene Bildausschnitte hochgeladen. Das eine ist eine Realprobe und sowohl nicht rechteckig als auch eher unregelmäßig geformt. Daher ist eine Auswertung von Hand zeitaufwendig. Da ich recht viele Bilder habe, dauert es zu lange alle Bilder von Hand in Excel oder Origin auszuwerten.

Das zweite Bild ist die Aufnahme von einem USAF 1951 Testtarget um die Auflösung zu bestimmen. Hier sind die Signale zwar nahezu rechteckig aber auch unterschiedlich groß. Für die Auswertung wären die waagerechten Balken am linken und rechten Rand interessant.

Beide Bilder sind Screenshots aus der Herstellersoftware, die leider zum Auswerten meiner Bilder eher ungeeignet ist. Die Farbskala ist eine Falschfarbenskala. Alle Pixel bestehen nur aus dem Intensitätswert ohne RGB-Informationen.

Ich hoffe, dass hilft ein wenig weiter.

Viele Grüße
Tobias


RE: Teile eines Arrays integrieren - Kasi - 10.04.2013 08:23

Also willst du im Grunde die Gesamtintensität jedes einzelnen Objekts aufsummieren, richtig?
Untergrund würde ich auch erstmal mit threshold auf null setzen. Wenn der Untergrund variiert, kann man das auch ganz gut über den ersten Peak beim Intensitäts-Histogramm lösen.
Zusammenhängende Objekte...das wird interessant. Man könnte eine Art "Fressverfahren" machen:

1) Das komplette untergrundbereinigte 2D-Bild-Array nach einem Wert > 0 durchsuchen.
2) Sobald ein Punkt > 0 gefunden wird, wird dieser in ein neues Array als Objektpunktearray eingetragen und der Punkt auf 0 gesetzt.
3) Nachbarpunkte (x+/-1, y+/-1, wenn man ganz auf Nummer sicher gehen will, sollte man auch diagonal springen) nach weiteren Werten > 0 absuchen und dem gleichen Objektpunktearray zuschreiben, Wert wieder auf 0 setzen. Schritt 3 bei den jeweiligen Nachbarpunkten > 0 solange wiederholen, bis alle Nachbarn null sind.
4) Zurück zu Schritt 1) (mit angepasstem Startindex) , das nächste Objektpunktearray vollschreiben und solange wiederholen, bis das 2D-Bild-Array durch ist.

Auswertungsmöglichkeiten:
a) Anzahl des Objektpunktearrays bewerten. Hat das Objekt nur 1 oder 2 Punkte wird's als Cosmic klassifiziert und rausgeschmissen.
b) Mittelwert des Objektpunktearrays bilden
c) Koordinaten des Objektpunkte festhalten (Dann sollte es allerdings eher ein array von Objektpunktclustern werden) und so über min/max die Ausmaße des Objekts bestimmen. Oder auch jeweils das gefundene Einzelobjekt nochmal "plotten".

Hattest du dir sowas in der Art vorgestellt?


RE: Teile eines Arrays integrieren - Tobias218 - 10.04.2013 09:00

Zitat:2) Sobald ein Punkt > 0 gefunden wird, wird dieser in ein neues Array als Objektpunktearray eingetragen und der Punkt auf 0 gesetzt.
3) Nachbarpunkte (x+/-1, y+/-1, wenn man ganz auf Nummer sicher gehen will, sollte man auch diagonal springen) nach weiteren Werten > 0 absuchen und dem gleichen Objektpunktearray zuschreiben, Wert wieder auf 0 setzen. Schritt 3 bei den jeweiligen Nachbarpunkten > 0 solange wiederholen, bis alle Nachbarn null sind.

Genau das ist es was ich gerne möchte und auch schon versucht habe. Leider ist es mir nicht gelungen einen vernünftiges VI zu schreiben um das auch umzusetzen. Meinen Versuch habe ich abgebrochen, als ich erkannt habe, dass es in einer unendlichen Verkettung von True/False-Cases enden wird. Und leider ist mir da noch keine Möglichkeit eingefallen, um das zu umgehen.

Bei der Auswertung hatte ich vor die Intensitätssumme zu nutzen, da diese ein Maß für meine Analytkonzentration ist und robuster als die Peakhöhe (über min/max) ist. Das sollte aber recht einfach sein, sobald ich weiß welche Peaks auftauchen (und wo sie liegen).


RE: Teile eines Arrays integrieren - Kasi - 10.04.2013 11:29

(10.04.2013 09:00 )Tobias218 schrieb:  [...] als ich erkannt habe, dass es in einer unendlichen Verkettung von True/False-Cases enden wird

Manche nennen es unendlich, ich nenne es rekursiv Wink
Ich hab mal was zusammengeklickt, leider ist es (erwartungsgemäß) extrem langsam. Es ist aber bestimmt auch noch lange nicht optimal programmiert. Also nimm dir eine Tasse Tee, während du bei der Betrachtung des Live-Bilds die Objekte verschwinden siehst. Das Endergebnis habe ich mir nicht angeschaut, soviel Zeit hatte ich in meiner Mittagspause nicht Big Grin
Das Hauptvi (LabVIEW 2009) ist sehr groß, da ich eins deiner Beispielbilder grob übernommen habe (wirklich nur grob, die falschfarben sorgen für entsprechende Ringmuster in der 24bit-Farbmap, die ich mit entsprechend zu hoch gewähltem threshold alle wieder rausschmeiße), daher hier die gezippte Version.


RE: Teile eines Arrays integrieren - Tobias218 - 10.04.2013 15:05

Vielen Dank,
ich glaube, es ist genau so wie ich das brauche. Ich bin gerade erst dabei mich in das VI vollständig reinzudenken.


RE: Teile eines Arrays integrieren - Kasi - 10.04.2013 19:35

Also, mal abgesehen davon dass die Grundidee funktioniert ist das Speichermanagement scheinbar katastrophal. Ich nehme an, das liegt an meiner Art, die gefunden object-point-arrays als 2d-Array zu bündeln. Das explodiert dann dementsprechend, wenn er ein großes Objekt findet. Hier mal die aufgezeichnetne Loop-Zeiten, der Spike ist beim großen Objekt. Danach scheint es der Performance zusehends schlechter zu gehen. Außerdem liegt die Grundlaufzeit pro Reihe schon etwa 420ms. Sehr interessant, wenn man bedenkt, dass man die komplette Untergrundbereinigung des Arrays kaum mitbekommt.


RE: Teile eines Arrays integrieren - Kasi - 11.04.2013 14:55

Manchmal hat man einen netten Einfall, wie zum Beispiel dieses Live-Bild und vergisst, was man genau LabVIEW damit antut. Also, wenn ich das Live-Bild auf den äußeren For-Loop beschränkte und mir nur die Summen ausgeben lasse, läuft das Ding auch in vernünftiger Geschwindigkeit.


RE: Teile eines Arrays integrieren - Tobias218 - 12.04.2013 09:43

LabVIEW berechnet das live Bild bei jedem Schleifendurchlauf neu, wenn es in der inneren Schleife steht, sehe ich das richtig?

Ich bin gerade auch schon dabei, das ganze meinen Bedürfnissen anzupassen. Vor allem die Ausgabe der Werte möchte ich noch etwas umgestalten.