Maximalwerte in Matrix erkennen und mit zugehörigem neuen Wert überspeichern
Wenn dein Problem oder deine Frage geklärt worden ist, markiere den Beitrag als "Lösung",
indem du auf den "Lösung" Button rechts unter dem entsprechenden Beitrag klickst. Vielen Dank!
Maximalwerte in Matrix erkennen und mit zugehörigem neuen Wert überspeichern
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
31.01.2018, 21:11 (Dieser Beitrag wurde zuletzt bearbeitet: 31.01.2018 21:13 von GerdW.)
RE: Maximalwerte in Matrix erkennen und mit zugehörigem neuen Wert überspeichern
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!)
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" :
- 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
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
02.02.2018, 10:10 (Dieser Beitrag wurde zuletzt bearbeitet: 02.02.2018 10:11 von GerdW.)
RE: Maximalwerte in Matrix erkennen und mit zugehörigem neuen Wert überspeichern
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
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.
RE: Maximalwerte in Matrix erkennen und mit zugehörigem neuen Wert überspeichern
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!)
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
08.02.2018, 11:25 (Dieser Beitrag wurde zuletzt bearbeitet: 08.02.2018 11:35 von GerdW.)
RE: Maximalwerte in Matrix erkennen und mit zugehörigem neuen Wert überspeichern
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?
RE: Maximalwerte in Matrix erkennen und mit zugehörigem neuen Wert überspeichern
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…