LabVIEWForum.de
Maximalwerte in Matrix erkennen und mit zugehörigem neuen Wert überspeichern - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein)
+---- Forum: Datenbank & File IO (/Forum-Datenbank-File-IO)
+---- Thema: Maximalwerte in Matrix erkennen und mit zugehörigem neuen Wert überspeichern (/Thread-Maximalwerte-in-Matrix-erkennen-und-mit-zugehoerigem-neuen-Wert-ueberspeichern)

Seiten: 1 2


Maximalwerte in Matrix erkennen und mit zugehörigem neuen Wert überspeichern - MartinNewBee - 31.01.2018 16:33

Hallo,
ich arbeite derzeit an einem Projekt für die Uni und bin in Folge dessen dabei ein Bildbearbeitungsprogramm in LabView zu schreiben. Das klappt auch alles schon ganz gut. Ich erzeuge aus zwei einem Referenzbild und einem fortlaufenden Scannbild ein Differenzbild. Aus dem Differenzbild lass ich mir dann mittels dem Intensitätsgraphen eine Matrix aller Grauwerte (für jeden Pixel) auslesen. Nun zu meinem Problem. Der Scann hat unterschiedlich viele Schritte und ich möchte eine Schleife programmieren, die für jeden Pixel in der Matrix des Differenzbilds den Maximalwert behält, diesen jedoch am ende nicht abspeichert, sondern mit der jeweiligen Scannerposition (ein x-Wert) überschreibt. Am Ende soll quasi eine Matrix der Bildpixel mit den unterschiedlichen Scannerpositionen für Maximalwerte des Intensitätsgraphen entstehen.

Meine Probleme sind im Wesentlichen:
- Ich bekomme eine Intensitätsmatrix für jede Scannerposition, aber ich weiß nicht wie ich diese verpacken muss damit nicht jede einzeln vorliegt sondern immer nur der Maximalwert für jeden Pixel in der Matrix behalten wird. Ich möchte nicht viele einzelne Matrizen haben sondern am Ende nur eine.
- Wie kann ich die Intensitätsmatrix mit der Scannerposition verknüpfen, damit für jeden maximalen Intensitätswert der richtige Wert der Position eingetragen wird. Oder dass überhaupt eine Scannerposition eingetragen wird.

Anbei ist ein Auszug aus meinem Programm.

Ich hoffe ich hab es nicht allzu verwirrend geschrieben und mein Problem wird klar. Ich bin Anfänger in LabView, daher no hate pls^^
Ich bedanke mich schon mal und hoffe ihr könnt mir weiterhelfen.

Beste Grüße


RE: Maximalwerte in Matrix erkennen und mit zugehörigem neuen Wert überspeichern - GerdW - 31.01.2018 21:11

Hallo Martin,

Zitat:mittels dem Intensitätsgraphen eine Matrix aller Grauwerte (für jeden Pixel) auslesen.
- Ein Intensitätsgraph zeigt keine "Matrix" an, sondern ein 2D-Array.
- wenn du mit Arrays arbeitest, solltest du Arrayfunktionen verwenden - und nicht Matrix-Funktionen… (Jedenfalls nicht so wie bei dir.)

Zitat:immer nur der Maximalwert für jeden Pixel in der Matrix behalten wird.
Was genau willst du haben? Willst du ein 2D-Array haben, in dem jedes Element den Maximalwert aus allen "Scans"/"Intensitätsgraphen" darstellt? Dann nimm doch einfach die MinMax-Funktion…
(Bitte beachte meine Wortwahl: ich versuche wirklich die LabVIEW-Bezeichnungen aus der LabVIEW-Hilfe zu den einzelnen Elementen etc. zu verwenden, um möglichst eindeutig zu formulieren!)
[attachment=58737]

Zitat:Ich hoffe ich hab es nicht allzu verwirrend geschrieben und mein Problem wird klar. Ich bin Anfänger in LabView, daher no hate pls^^
Kein "hate", nur "Manöverkiritik" Big Grin:
- zu viele lokale Variablen, zu wenige Schieberegister
- vollkommmen unaufgeräumt: wie soll man da durchblicken, wo du in 1 Monat auch nicht mehr durchblickst?


RE: Maximalwerte in Matrix erkennen und mit zugehörigem neuen Wert überspeichern - MartinNewBee - 02.02.2018 09:58

Hallo Gerd,
danke für deine Tipps und die schnelle Antwort. Ich hab jetzt erstmal versucht das Choas etwas zu beseitigen. Deine Lösung zu den Maximalwerten hat super funktioniert, besten Dank!
Jetzt hab ich nur noch das Problem, dass ich den Maximalwerten jetzt noch jeweils den passenden x-Scannwert zuordnen muss. Beispielsweise verfährt der Scanner in 10 Schritten von 3,2-3,3 mm. wie kann ich jetzt innerhalb deiner zuvor gezeigten Schleife für die Maximalwerte hier gleich den X-Scannwert zuordnen lassen (am Besten in einem separaten Array).

Beste Grüße


RE: Maximalwerte in Matrix erkennen und mit zugehörigem neuen Wert überspeichern - GerdW - 02.02.2018 10:10

Hallo Martin,

Zitat:das Problem, dass ich den Maximalwerten jetzt noch jeweils den passenden x-Scannwert zuordnen muss. … (am Besten in einem separaten Array).
Du willst also zu jedem Element in deinem 2D-MAX-Array wissen, bei welcher X-Position es ermittelt wurde?
Dann musst du auch alle Elementen einzeln vergleichen und bei einem neuen MAX-Wert den Eintrag im "Positions-Array" anpassen…

Code:
i,j = Array-Größe
FOR i
  FOR j
   IF intensität[i,j] > max[i,j] THEN
     max[i,j] := intensität[i,j]
     pos[i,j] := x-position
   ENDIF
  NEXT j
NEXT i

Wirklich weniger lokale Variablen sind das aber nicht. "Aufgeräumt" ist das Bild auch nicht.
Und warum stellst du die ganzen numerischen Werte als Strings dar - und nicht eben als numerische Werte?


RE: Maximalwerte in Matrix erkennen und mit zugehörigem neuen Wert überspeichern - MartinNewBee - 02.02.2018 11:27

Hallo Gerd,
ja das mit dem Code hatte ich mir auch schon mal überlegt. aber wie setze ich das ganze in LabView um? bin echt ein blutiger Anfänger was das Programmieren betrifft.

Das Thema mit den lokalen Variablen habe ich registriert, allerdings funktioniert das Programm so gerade und ich hab schon etwas gebraucht, um das so weit hinzubekommen. Daher würde ich das erstmal so lassen, aber ich behalte es im Hinterkopf und versuche daran zu arbeiten.

Meine Idee für LabView war: Ich setze beim ersten Schritt Einträge gleich dem X-Scannwert in einem neuen Array (bzw. in einer Matrix, wenn das denn geht). Anschließend fährt der Scanner einen Schritt weiter, mit deiner Schleife werden die Max-Werte behalten und kann ich dann meiner Matrix nicht einfach sagen, wenn neuer Wert behalten wird im Intensitätsarray, dann überschreib den Matrixeintrag mit neuem X-Scannwert.

Am Ende Brauch ich eigentlich nur ein Raster (ob Array oder Matrix ist eigentlich wurst) mit x = horizontale Pixel, y = vertikale Pixel und z= X-Scannwerte bei Maximaler Intensität.


Beste Grüße


RE: Maximalwerte in Matrix erkennen und mit zugehörigem neuen Wert überspeichern - GerdW - 02.02.2018 11:52

Hallo Martin,

die zwei FOR-Loops in meinem Pseudocode oben erledigen die ganze Array-Indizierung dank Autoindizierung.
Du brauchst nur den Vergleich in der innersten Loop programmieren…

Probier's mal aus! (Da lernst du auch gleich die LabVIEW-Grundlagen dabei!)


If than Für Matrixeinträge - MartinNewBee - 08.02.2018 11:17

Hallo,
wie muss ich eine If/than-Funktion für eine komplette Matrix darstellen, die alle einzelnen Einträge abfrägt?
Bsp:
M_x,y
if z < 10;
than set z =! 0;

mit dem Select-tool kann ich das zwar für eine einfache Zahl machen, aber sobald ich eine Matrix anschließen möchte funktioniert es nicht mehr.
Danke schonmal


RE: If than Für Matrixeinträge - GerdW - 08.02.2018 11:25

Hallo Martin,

ich hoffe, du arbeitest mit 2D-Arrays und nicht etwa mit Matrizen…

Lösung: zwei FOR-Loops mit Autoindizierung. (Gehört zu den LabVIEW-Grundlagen…)

(Ich habe mal deine Themen zusammengefügt - ich wusste doch, dass wir das Thema schon einmal besprochen hatten!)


RE: Maximalwerte in Matrix erkennen und mit zugehörigem neuen Wert überspeichern - MartinNewBee - 08.02.2018 13:40

Hallo Gerd,

Ich hab mich mal daran versucht das in mein Programm einzubauen (bin mittlerweile auch schon daran es nochmal neu zu programmieren, damit die Strukturierung besser wird). Jetzt hab ich allerdings das Problem, dass die beiden For-Schleifen nicht ausgeführt werden, und das Programm in die Pause nach jeder äußeren For-Schliefe geht. Hast du mir n Tipp was ich anders machen muss? Oder stimmt mein Gedankengang überhaupt nicht?

Danke dir.


RE: Maximalwerte in Matrix erkennen und mit zugehörigem neuen Wert überspeichern - GerdW - 08.02.2018 13:57

Hallo Martin,

Zitat:Jetzt hab ich allerdings das Problem, dass die beiden For-Schleifen nicht ausgeführt werden, und das Programm in die Pause nach jeder äußeren For-Schliefe geht.
Das könnte an dem roten Rahmen liegen, der die äußere Loop markiert: das ist ein Breakpoint - und den kann man auch wieder (durch Rechtsklick auf den Rahmen) löschen…

- Für das "IF a> b THEN a ELSE b" gibt es die MinMax-Funktion bei den Vergleichsoperationen!
- Wozu das 2D-Array des Intensitätsgraphen durch sich selbst dividieren und dann mit "Tank" multiplizieren? (Was kommt wohl dabei heraus, wenn im Graph eine Null steht?) Warum nicht einfach "Tank" selbst in die FOR-Loops hineinverdrahten???
- Warum arbeitest du immer noch mit Matrizen anstatt einfacher 2D-Arrays???
- Warum ist "Tank" nicht in einem Schieberegister gespeichert? Das wären dann schon mal 2 lokale Variablen weniger…