Hallo miteinander,
ich soll für ein Projekt Bilder miteinander vergleichen, arbeite aber zum ersten Mal mit LABView. Die Bilder sind Schwarz/Weiß (grau) und einige sind etwas dunkler als Andere.
Ein Bild kann ja beispielsweise mit dem Befehl "JPEG-Datei lesen" in ein Nicht-Numerischen-Cluster zerlegt werden und dann mit dem Befehl "1D-Pixmap nach 2D" in ein 2D-Array umgewandelt werden.
Somit werden ja die 3 RGB Werte im 2D-Array gespeichert, oder?
{{0, 0, 0} //für Schwarz und, {255, 255, 255} //für Weiß und natürlich die Grausstufen dazwischen}
Jetzt schon mal meine erste Frage: Wie werden diese Werte im Array gespeichert? Als Dezimalzahlen oder als Hexadezimalzahlen? Der Befehl "1D-Pixmap nach 2D" gibt mir ja ein Numerischen Wert aus, somit sollte es ja eigentlich die Dezimalzahlen sein, oder habe ich hier etwas falsch verstenden?
Mich interessieren natürlich auch nicht die 3 Werte sondern, da die Bilder eh nur Schwarz/Weiß sind, ein zusammengefasster Wert (z.B. 127 für Grau) Wie kann ich das bewerkstellingen?
Ich habe auch schon versucht das 2D-Array mit der Funktion "Array umformen" in ein 1D-Array umzuwandeln, aber dann wird der Summenwert aus dem Array = 0 womit auch immer der Mittelwert 0 wird. Wo ist hier mein Denkfehler? Beim umwandeln
Im Anhang habe ich ein Bild des Blockdiagramms und 2 Testbilder eines in Halb Schwarz und Halb Weis und eines im Grauton der RGB Farben 127. Ziel ist, das beide Bilder den Selben Wert ergeben.
Danke schon mal im Voraus
Hallo Manfred,
herzlich willkommen im Forum!
Zitat:arbeite aber zum ersten Mal mit LABView
Was man an der Schreibweise von LabVIEW (!) merkt…
Schau mal in meine Signatur!
Zitat:Wie werden diese Werte im Array gespeichert?
RGB, je ein Byte…
Als Dezimalzahlen oder als Hexadezimalzahlen?
Wo ist der Unterschied? Zahl ist Zahl!
Du bekommst ein U8-Array…
Zitat:Der Befehl "1D-Pixmap nach 2D" gibt mir ja ein Numerischen Wert aus, somit sollte es ja eigentlich die Dezimalzahlen sein, oder habe ich hier etwas falsch verstenden?
Du bekommst ein U8-Array mit den Pixelwerten.
Es sind eben U8-Werte, ob du sie nun als Dezimal- oder auch Hex-, Binär- oder Oktalzahl anzeigen lässt, bleibt dir überlassen…
Zitat:da die Bilder eh nur Schwarz/Weiß sind, ein zusammengefasster Wert (z.B. 127 für Grau) Wie kann ich das bewerkstellingen?
Du könntest die 3 RGB-Werte mitteln. Es gibt aber auch andere Methoden, einen Grauwert zu bestimmen.
Literaturstudium oder Wikipedia helfen da weiter…
Zitat:Ziel ist, das beide Bilder den Selben Wert ergeben.
Wenn das Ziel ist, immer den gleichen Wert auszugeben, solltest du eine Konstante verwenden!
Wie wäre es, statt einer Konstante "16384" einfach mal immer die korrekte Anzahl an Pixeln zu verwenden?^
Außerdem:
[
attachment=59643]
- Wenn du ein 24bit-Bild einliest, solltest du auch dessen Bilddaten verwenden…
- Ich habe hier nur das LSB ( wie Byte) verwendet, da du ja Graustufenbilder benutzt…
Hallo GerdW,
schon mal ein riesiges Danke, dass du dir die Mühe gemacht hast! Das VI funktioniert super! Ich hätte allerdings noch ein paar Fragen!
Zitat:Wie wäre es, statt einer Konstante "16384" einfach mal immer die korrekte Anzahl an Pixeln zu verwenden?^
Die Bilder haben eine Abmessung von 128 x 128 Pixel, macht zusammen 16384. Ich dachte dies müsse die Größe des Arrays sein? Aber egal, brauche ich ja nicht.
Das VI von dir funktioniert zwar, aber ich kann es nicht ganz nachvollziehen. Vllt kannst du mir ein paar Sachen erklären, da ich es gern verstehen möchte:
Du benutzt hier zweimal hintereinander die "Zahl teilen"-Funktion (ich werde auch aus der Hilfe von LabVIEW nicht schlau) und benutzt weiter den lo(x) (numerisch niedrigstwertiges Byte). Was genau macht diese Funktion? Und warum zweimal hintereinander? Mittelst du damit die RGB Werte?
Diese Frage hat sich erledigt, durch etwas "rumspielen" habe ich jetzt verstanden, was die "Zahl teilen"-Funktion bewirkt.
Aber warum benutzt du 2 mal den lo(x) Ausgang? Somit musst du doch die Funktion 2 mal verwenden, anstatt nur einmal den hi(x) Ausgang? Dadurch kann man eine der beiden Funktionen sparen, habe ich jetzt mitbekommen.
Außerdem benutzt du dann die Funktion "Matrixgröße" und multiplizierst dann Zeilen- und Spaltenzahl, macht soweit Sinn um die gesamte Größe der Matrix (Array?) zu ermitteln. Wieso funktioniert die Funktion "Array-Größe" in diesem Fall nicht? Du verwendest ja auch für den Dividend des Mittelwertes die Funktion "Array-Elemente addieren".
Danke schon mal im Vorraus
Hallo Manfred,
Zitat:Die Bilder haben eine Abmessung von 128 x 128 Pixel, macht zusammen 16384.
Momentan haben sie vielleicht diese Größe, in Zukunft dann vielleicht nicht mehr. Und dann viel Spaß beim Debuggen…
Warum also nicht so programmieren, dass man aus seinen VIs nicht auch gut modularisierbare Funktionen machen kann?
Zitat:Aber warum benutzt du 2 mal den lo(x) Ausgang?
Weil ich das niederwertigste Byte aus deinem U32 haben will.
Dazu muss ich das U32 zweimal teilen.
Andere Alternative wäre ein AND mit 0x000000FF…
Zitat:Somit musst du doch die Funktion 2 mal verwenden, anstatt nur einmal den hi(x) Ausgang? Dadurch kann man eine der beiden Funktionen sparen, habe ich jetzt mitbekommen.
Der "hi(x)"-Ausgang liefert dir meist einen Wert nach dem Schema 00XX (Hex-Schreibweise, XX für beliebige Werte) - muss das aber nicht immer tun: LabVIEW verwendet für bestimmte Farbwerte auch das oberste Byte…
Zitat:Außerdem benutzt du dann die Funktion "Matrixgröße" und multiplizierst dann Zeilen- und Spaltenzahl, macht soweit Sinn um die gesamte Größe der Matrix (Array?) zu ermitteln.
Man kann Matrix-Funktionen auch auf 2D-Arrays anwenden, so wie diese. Der Vorteil ist hier, dass man manchmal beide Werte einzeln benötigt und so auch gleich bekommt. Bei ArraySize müsste man dan erst wieder IndexArray verwenden.
Zitat:Wieso funktioniert die Funktion "Array-Größe" in diesem Fall nicht?
Die würde ebenso funktionieren. Niemand hat was anderes behauptet…
Nochmal Danke für deine Antwort GerdW,
Zitat:Zitat:Außerdem benutzt du dann die Funktion "Matrixgröße" und multiplizierst dann Zeilen- und Spaltenzahl, macht soweit Sinn um die gesamte Größe der Matrix (Array?) zu ermitteln.
Man kann Matrix-Funktionen auch auf 2D-Arrays anwenden, so wie diese. Der Vorteil ist hier, dass man manchmal beide Werte einzeln benötigt und so auch gleich bekommt. Bei ArraySize müsste man dan erst wieder IndexArray verwenden.
Sorry, das ist mir zu hoch... Ich habe das gerade probiert und bekomme jetzt jedes mal unterschiedliche Werte... Nach "Array-Größe" habe ich die Funktion "Array indizieren" angehängt und je nachdem welche Konstante ich für den Index eingebe bekomme ich andere Werte?
Hallo Manfred,
Zitat:Sorry, das ist mir zu hoch... Ich habe das gerade probiert und bekomme jetzt jedes mal unterschiedliche Werte... Nach "Array-Größe" habe ich die Funktion "Array indizieren" angehängt und je nachdem welche Konstante ich für den Index eingebe bekomme ich andere Werte?
Ein 2D-Array hat zwei Dimensionen, ArraySize liefert also ein Array mit 2 Elementen (Anzahl Zeilen, Spalten).
Wenn du jetzt den Index am IndexArray änderst, bekommst du einmal die Spaltenzahl, und einmal die Zeilenzahl: wie bei MatrixSize eben auch…
Bei mehrdimensionalen Arrays liefert ArraySize dann eben Arrays mit noch mehr als 2 Elementen.
Hallo GerdW,
ja, habe es jetzt auch hinbekommen. Die beiden Elemente muss ich dann miteinander multiplizieren, das hatte mir noch gefehlt...
Danke nochmal, werde nach Silvester wahrscheinlich noch ein paar Fragen haben, aber die sind dann ein anderes Thema...