Seite 1 von 1
Kamera Frame 8/16 Bit Umwandlung in Python
Verfasst: Donnerstag 3. Februar 2022, 12:57
von Kriccemis
Hallo Zusammen,
ich arbeite gerade an einem kleinen Projekt zur Bilderkennung.
Ich verwende eine IDS Kamera, welche von 8-12 Bit Bilder übertragen kann, der Hersteller hat sogar eine Bibliothek und Tutorial bereitgestellt.
Mein Problem ist es, wenn ich Bilder größer 8 Bit ausgeben lassen möchte, da die Kamera das Array immer nur als "uint8" Format übertragen.
Solange ich 8 Bit Frames aufnehme ist alles in Ordnung, aber sobald ich auf 10 oder 12 gehe bin ich etwas ratlos mit der Umwandlung.
Der Pixelwert wird in zwei Bytes im Array (Frame) gespeichert und muss wieder zusammengefügt werden, es sieht etwa so aus:
array of uint8 = [136, 4, 125, 4, 133, 5, 128, 4, 131, 5, ...]
Es müssen sozusagen immer zwei Werte zusammengefasst werden um die Bildinformation zu erhalten.
Sollte jemand das gleiche problem auch schonmal gehabt haben, wäre ich sehr dankbar über Hilfe!
Bei Bedarf kann ich gern den Code noch aufführen, aber ich denke der wird in diesem Fall nicht helfen?
Danke
Re: Kamera Frame 8/16 Bit Umwandlung in Python
Verfasst: Donnerstag 3. Februar 2022, 13:26
von Sirius3
Kommt drauf an, als welchen Typ Du die Daten vorliegen hast,
Bei numpy-Arrays mußt Du nur ein View vom richtigen Typ erzeugen:
Code: Alles auswählen
import numpy as np
data = np.array([136, 4, 125, 4, 133, 5, 128, 4, 131, 5], dtype='u1')
data = data.view('<u2')
# array([1160, 1149, 1413, 1152, 1411], dtype=uint16)
Re: Kamera Frame 8/16 Bit Umwandlung in Python
Verfasst: Donnerstag 3. Februar 2022, 13:52
von Kriccemis
Erstmal danke für die schnelle Antwort. ALso von der Kamera erhalte ich die Daten über:
Code: Alles auswählen
array = ueye.get_data(pcImageMemory, width, height, nBitsPerPixel, pitch, copy=False)
Typ: "Array of uint8"
Wenn ich es so schreibe werden dann nur Nullen ausgegeben, sicher ist der Code so nicht korrekt.
Code: Alles auswählen
array = ueye.get_data(pcImageMemory, width, height, nBitsPerPixel, pitch, copy=False)
data = np.array(array, dtype='u1')
data = data.view('<u2')
Re: Kamera Frame 8/16 Bit Umwandlung in Python
Verfasst: Donnerstag 3. Februar 2022, 15:06
von __blackjack__
@Kriccemis: Was enthält denn `array`? Wenn `data` am Ende nur 0en enthält, dann müsste `array` das auch schon getan haben. Ist die vorletzte Zeile überhaupt notwendig? Welchen Typ hat denn `array`? Was ist `ueye`? Wir müssen hier eine Menge raten.
Re: Kamera Frame 8/16 Bit Umwandlung in Python
Verfasst: Freitag 4. Februar 2022, 09:13
von Kriccemis
Ich muss mich entschuldigen für meinen letzten Post....hatte beim Test die Lichtquelle aus, daher die Nullen....oh man.
Also es geht alles, danke dafür!
Jetzt kommt ein neues Problem dazu. Das 12 Bit Bild ist in 16 Bit gespeichert, somit befinden sich alle Grauwerte unter 4000 und werden schwarz dargestellt. Gibt es eine einfache möglichkeit die Darstellung bei CV2 oder Tiff reader auf 12 Bit zu ändern?
Danke und VG!
Re: Kamera Frame 8/16 Bit Umwandlung in Python
Verfasst: Freitag 4. Februar 2022, 09:20
von __deets__
Mal 4 nehmen, das spreizt deinen Wertebereich entsprechend. Und ist in numpy trivial.
Re: Kamera Frame 8/16 Bit Umwandlung in Python
Verfasst: Freitag 4. Februar 2022, 11:22
von Kriccemis
Um auf die offene Frage einzugehen. UEYE ist eine Bibliothek zur Kamerasteuerung von IDS Kameras.
Auch wenn das anscheinend sehr trivial ist, klappt es nicht
Code: Alles auswählen
# Test Bild
array = ueye.get_data(pcImageMemory, width, height, nBitsPerPixel, pitch, copy=False)
array = array.view('<u2')
array_new1 = array * 16
# oder
array_new2 = np.multiply(array, 16)
Als Ergebnis kommen nur Nullen.
Ist das Dateiformat des Array´s der Fehler?

Re: Kamera Frame 8/16 Bit Umwandlung in Python
Verfasst: Freitag 4. Februar 2022, 11:29
von __deets__
Eh, du hast recht, es haette natuerlich 16 statt 4 sein sollen in meinem Post.
Aber es funktioniert wie gedacht:
Code: Alles auswählen
>>> import numpy as np
>>> a = np.array(range(2**12), dtype=np.uint16)
>>> a
array([ 0, 1, 2, ..., 4093, 4094, 4095], dtype=uint16)
>>> a * 16
array([ 0, 16, 32, ..., 65488, 65504, 65520], dtype=uint16)
Re: Kamera Frame 8/16 Bit Umwandlung in Python
Verfasst: Freitag 4. Februar 2022, 11:43
von Kriccemis
Wenn ich zum testen ein Array selber schreibe funktioniert es auch, aber wie man auf dem Screenshot sehen kann, bekomme ich als Ergebnis alles Nullen?!
Das verstehe ich nicht...
Re: Kamera Frame 8/16 Bit Umwandlung in Python
Verfasst: Freitag 4. Februar 2022, 12:37
von __deets__
Ich habe keine Ahnung was das fuer eine Umgebung da ist, aber die waere mein erster Kandidat fuer eine Fehlersuche.
Re: Kamera Frame 8/16 Bit Umwandlung in Python
Verfasst: Freitag 4. Februar 2022, 12:59
von Kriccemis
Also als Programmierumgebung nutze ich Spyder.
das Merkwürdige ist auch, selbst wenn ich aus dem Array einen Einzelwert in eine Variable übergebe ist dieser Null...
Bin echt Ratlos.
Re: Kamera Frame 8/16 Bit Umwandlung in Python
Verfasst: Freitag 4. Februar 2022, 13:21
von __deets__
Dazu kann ich nichts sagen, ausser: verzichte zur Ausfuehrung auf Spyder, und benutze die Kommandozeile, mit der entsprechenden Python-Version (ggf venv beachten, falls das implizit oder explizit benutzt wird). Denn wenn man ein numpy array hat, dann wird das wie gezeigt durch Multiplikation nicht alles null. Das kann nur daran liegen, dass da jemand an der Laufzeitumgebung rumfuhrwerkt, ausser Spyder habe ich da keinen Verdacht.