LabVIEWForum.de - Pixelanzahl in Graustufenbild bestimmen

LabVIEWForum.de

Normale Version: Pixelanzahl in Graustufenbild bestimmen
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo liebe LV-Gemeinde,

seit geraumer Zeit plage ich mich mit dem Versuch herum, die Pixelanzahl eines Graustufenbildes zu bestimmen, nur leider ohne Erfolg und mit viel Frust und daher hoffe ich dass ihr mir vielleicht helfen könnt.

Ich will ein VI erstellen, dass ein Graustufenbild (8 bit=255 Werte, normalerweise 640 * 480 Pixel) von der Festplatte lädt und dann von jedem einzelnen Pixel den Grauwert bestimmt. Am Ende möchte ich die Grauwerte aller Pixel aufsummieren und auf dem Bildschirm als Zahl angeben.

Das Bild einlesen klappt, auch konnte ich die Pixelwerte in ein Array übergeben und z.B. in einer Excel-Tabelle ausgeben und ansehen um zu verifizieren dass soweit alles funktioniert hat.

Nun hänge ich jedoch bei der Aufgabe, die Werte aus dem Array korrekt zu lesen/sortieren und dann aufzusummieren. Mein zugegebenermaßen geringes LabVIEW Wissen scheitert jedes Mal an diesem Punkt.

Ich habe schon versucht mit dem Block "Add Array Elements" die Zellen zu addieren, jedoch stimmt das Ergebnis nicht (wäre wohl zu einfach). -> siehe angefügtes VI

Ich habe auch schon versucht, dass Array mit mehreren unterschiedlichen Array-Blöcken zu be-/verarbeiten, jedoch bekomme ich immer falsche Ergebnisse heraus.
Es ist auch merkwürdig, dass sobald die Summe die Zahl 255 übersteigt, LabVIEW wieder von null anfängt zu zählen, obwohl ich doch einen U64-Zahlentyp benutze (oder woher kommt das Problem?)

Könnt ihr mir mit dem Array helfen? Ich verzeifel so langsam daran, wäre also dankbar für eure Hilfe.

Gruß

Lv09_img2
Hab leider kein Vision...

...aber ich würd es so machen:

[attachment=29364]
[attachment=29369]

Gruß SeBa


PS:
evtl. nach Vision verschieben...
Vielen Dank Seba,

es hat völlig genügt nur die U64 Umwandlung zu machen, die ganzen Sachen mit den Arrays sind dabei völlig überflüssig. Vielen Dank, hätte ich bloß früher gefragt, hätte ich mir 3 Tage Arbeit erspartSmile
Nur noch eine Frage, was macht denn die U64 Umwandlung und warum bricht er sonst bei 255 ab obwohl ich es mit U64 anzeige?

Danke nochmalWink
Hallo Mr. Wong,

"was macht denn die U64 Umwandlung und warum bricht er sonst bei 255 ab obwohl ich es mit U64 anzeige?"
Überlege doch mal kurz, wieviele U8-Werte du (durchschnittlich) aufsummieren kannst, bevor du den Wertebereich eines U8 überschreitest! Und dann stelle dir obige Frage nochmal...Smile
Hi GerdW,

du hast vollkommen recht, es bringt mir ja nichts die Werte mit U64 anzuzeigen wenn ich sie davor nur als U8 zulasse, daher muss ich natürlich auch die Umwandlung machen. Entschuldigung für die dumme Frage.

Bei genauerem Überlegen fällt mir auch auf, dass meine Methode mit der Grautwertpixelzählung ziemlich sinnlos ist, da ich eigentlich zwei Grauwertbilder anhand ihrer Pixel vergleichen wollte.

Daher sollte ich besser die Grauwertdifferenz jedes einzelnen Pixels zweier Bilder bestimmen, beziehungsweise deren Betrag.
Daher funktioniert die Methode mit der einfachen Summierung des Arrays natürlich nicht mehr.

Ich habe jetzt versucht, die beiden Bilder von einander zu "subtrahieren" und dann die Grauwertgesamtpixel zu berechnen, dies würde auch soweit funktionieren falls jedes Pixel bei Bild 1 immer einen mindestens gleich großen bzw. größeren Grauwert als das korrespondierende Pixel bei Bild 2 hätte sofern ich die Subtraktion Bild 1 - Bild 2 vornehme.

Hat jedoch z.B. ein gewisses Pixel in Bild 1 den Grauwert 54, das zugehörige Pixel in Bild 2 jedoch den Grauwert 55, so erhalte ich als Ergebnis 255 was natürlich total falsch ist um mir mein gesamtes Ergebnis verfälscht. Richtigerweise sollte in diesem Fall das Ergebnis 1 (also der Betrag) sein um ein korrektes Pixelergebnis zu erhalten.

Ich fürchte jetzt komme ich nicht um die Array-Aufsplittung bzw. Zerlegung rum, oder?
Hat jemand ne Idee wie ich das bewerkstelligen könnte? Kann mir jemand Tipps geben bzw. mir unter die Arme greifen?

Vielen Dank im Voraus,

Gruß Mister Wong
Hallo Mr. Wong,

einfach das Ergebnis der Subtraktion nach I8 wandeln...
Danke GerdW für die ultraschnelle Antwort,

ich werds gleich probieren. Das mit der Typenumwandlung scheint sehr praktisch in LabVIEW zu sein, so hab ich das noch nie betrachtet.

So, ich habs probiert, funktioniert ja super. LabVIEW ist echt stark wenn man es richtig beherrscht.

Es ist mir ein wenig peinlich nochmal ne ne Frage zu stellen, aber wenn ich jetzt noch daran interessiert wäre nicht nur die Pixelfehlerdifferenz zu bestimmen sondern auch generell die Anzahl der Pixel, deren Werte unterschiedlich sind, funktioniert das auch so einfach oder müsste ich da nun wirklich zu Arrays greifen?

Viele Grüße

Mister Wong
Hallo MrWong,

Ungleich, Bool nach 1/0, nach U32, SumArray...
Hallo GerdW,

danke für den Tipp mit der Pixelanzahl, das funktioniert super.

Allerdings klappt die Bestimmung der Pixelfehlerdifferenz so wie du es vorgeschlagen hast nicht völlig korrekt.
Ich hab nach der Subtraktion und nach der Konvertierung in I8 Werte im Bereich von -127 bis +127.
Danach muss man noch den Betrag nehmen um nur positive Zahlen zu erhalten, sonst bekäme ich ein falsches Ergebnis.
Außerdem muss man glaube ich danach wieder z.b. in U64 wandeln um einen genügend großen Zahlenbereich für die Berechnung der Pixelfehlerdifferenz zu erhalten. Wenn man danach die Summe bildet scheint das Ergebnis richtig zu sein.

Allerdings gibt es einen kritischen Punkt. Wenn der Grauwertunterschied zweier Pixel exakt 128 beträgt erhält man durch die Konvertierung in U32/U64 komplett falsche Werte. Dazu muss man jedoch sagen dass es ziemlich unwahrscheinlich ist, dass bei zwei ähnlichen Bildern es einen so enormen Unterschied in den Grauwerten zweier Pixel gibt.

Vielen Dank nochmal !

Gruß

Mister Wong
Referenz-URLs