RAW-RGB vom CMOS-Bildsensor zur Graustufenkonvertierung

Ich versuche, ein Bild mit dem Farbbildsensor OV7740 zu erzeugen. Soweit ich weiß, ist der Sensor standardmäßig so konfiguriert, dass er 10-Bit-parallele RAW-RGB-Daten liefert (aufgrund eines integrierten Bayer-Filters). Wie sollten diese Daten verarbeitet/skaliert werden, um Graustufenbilddaten zu erhalten?

EDIT: Ich denke, die Diskussion meines Problems kann hier gefunden werden .

was hast du bisher probiert? Mit was für einem Board arbeitest du? Es gibt viele Register in diesen Sensoren ... Können Sie das Datenblatt bekommen? Ich weiß, dass die größeren alle unter NDA sind. Schließlich, was verbindest du es?
Haben Sie versucht, den normalen Graustufenalgorithmus zu verwenden?
@SomeHardwareGuy Ich lese die digitale Ausgabe des Sensors und zeige diese Daten als 10-Bit-Graustufenbild an. Ich erwarte, dass der Sensor standardmäßig eine vernünftige Ausgabe liefert (RGB-Rohwert, alle Einstellungen sind im Auto-Modus), daher habe ich keines der Register berücksichtigt. Kann kein Datenblatt bekommen. Ich treibe es mit einem FPGA und leite die Daten dann zum Abtasten auf die NI-PCI-Karte um. Daher müssen die Daten, die ich abtaste, verarbeitet werden, um ein vernünftiges Bild zu erhalten.
@IgnacioVazquez-Abrams Ich denke, ich könnte es verwenden (ich denke, Sie meinen die Skalierung von 0,21 R + 0,72 G + 0,07 B). Allerdings muss ich es zuerst von raw rgb in rgb konvertieren . Ich hatte gehofft, dass es eine Abkürzung gibt, um rohes RGB in Graustufen umzuwandeln, da die Sensoren alles in Graustufen sehen.
Ich habe mir die Produktbeschreibung angesehen und sie behauptet, 8-Bit-YUV ausgeben zu können. Sie sollten in der Lage sein, den Y-Kanal zu gamma-skalieren.
@IgnacioVazquez-Abrams Das wird kompliziert. Ich habe keine geeignete Optik, um ein Bild auf die Ebene des Sensors zu fokussieren. Um eine 8-Bit-YUV-Ausgabe zu erhalten, muss ich in die Register des Sensors schreiben. Es wird schwierig sein, all diese Dinge auf einmal zu tun, da ich nicht weiß, welcher Teil des Systems nicht richtig funktioniert. Ich hatte also gehofft, die Ausgabedaten so zu verwenden, wie sie mit der Verarbeitung sind, dann ein richtiges optisches Setup zu erstellen und dann zu versuchen, Register für eine benutzerdefinierte Konfiguration zu überschreiben. Wie erhalte ich einen Y-Kanal aus rohem YUV?
Vermutlich würden Sie das Y-Byte aus dem YUV-Triplet extrahieren.
@IgnacioVazquez-Abrams Ich bin mir nicht sicher, was du mit Triplett meinst . Für jedes Pixel bekomme ich nur einen Wert.
Sie erhalten Y, U und V alle in einem Byte? Schlimmste. Kamera. Immer.
@ Ignacio Vazquez-Abrams Wahrscheinlich. Es ist ein Sensor, keine Kamera. Ich lese einen parallelen Strom von 10-Bit-Werten für jedes Pixel. Bei 640*480 Pixeln erhalte ich 640*480 10bit Rohdatenwerte. Sie müssen zuerst "demosaikiert" werden.

Antworten (1)

Ein hochqualitativer Demosaik-Prozess ist voller Subtilität, aber es kann eine sehr billige Antwort erhalten werden, wenn Sie einen Verlust von 50 % bei der räumlichen Auflösung akzeptieren können. Summieren Sie einfach Gruppen von vier Sensorpixeln, um ein einzelnes graues Pixel zu erhalten. Angenommen, Ihr Sensor hat ein "typisches" Bayer-Filtermuster, gibt es doppelt so viele grüne Sensoren wie entweder rote oder blaue. Das Summieren von quadratischen Gruppen von vier Pixeln ergibt dann Y = 2*G + R + B, was die blaue Komponente überbetont, aber für einfache Fälle wie die Überprüfung des Fokus des optischen Systems ist dies kein Problem.

Also für eine typische Anordnung von Pixeln, die so aussieht:

G R G R G R....
B G B G B G
G R G R G R
B G B G B G
.
.
.

Sie würden einen Y-Ausgang für jede Vierergruppe mit einer niedrigeren räumlichen Auflösung erhalten:

Y   Y   Y

Y   Y   Y

Die Implementierung kann in Hardware (wie in einem FPGA) mit nur genügend Speicher zum Speichern einer halben Scanzeile erfolgen, da Sie die Eingangspixel paarweise in der ersten Zeile summieren können, dann paarweise und einschließlich der Summe der vorherigen Zeile auf jeder zweite Reihe.

Sie könnten auch so viele Y-Pixel wie Eingaben erzeugen, indem Sie ein gleitendes Fenster erstellen, das den Speicherwert einer vollständigen Abtastzeile in der Hardware erfordern würde.

Um es "richtig" zu machen, sind eine Reihe von Verarbeitungsschritten erforderlich, aber die Kernoperation besteht darin, räumliche Filter anzuwenden, um separate R, G, und Bmonochrome Bilder mit identischer Auflösung zu schätzen, wobei darauf geachtet wird, sie richtig auszurichten. Angesichts dieser ausgerichteten Bilder ist es einfach, Ybei jedem Pixel zu berechnen.

Eine Implementierung eines ziemlich ausgeklügelten Demosaik-Systems findet sich in dcraw , das rohe Sensordaten verarbeitet und JPG-Bilder ausgibt. Sensorrohdaten können von vielen High-End-Digitalkameras bezogen werden, sind jedoch normalerweise mit Geschäftsgeheimnissen belastet, was ihre Interpretation für Dritte schwierig macht. Coffin und seine Benutzergemeinschaft haben große Anstrengungen unternommen, um die von solchen Kameras geschriebenen Rohdateiformate rückzuentwickeln. Aber es kann auch in Ihrem Kontext verwendet werden.

Bei der Entwicklung von Kameraprojekten habe ich in der Vergangenheit rohe Pixel direkt von CMOS-Sensoren genommen, wie sie im RAM erfasst wurden, sie in eine Datei kopiert und die Datei durch dcraw geleitet.

Das damit verbundene Problem für eine Prototyp-Kamera ist, Ihre erste Prototyp-Optik in den Fokus zu bekommen, um Pixel zu haben, die etwas bedeuten könnten, und so zu beweisen, dass das Ganze funktioniert, indem Sie ein fertiges JPG Ihrer Bank zeigen.

Der erste Schritt besteht darin, die Testmustermodi in Ihrem Sensor zu finden und zu verwenden. Damit können Sie in der Regel Referenzmuster mit bekanntem Inhalt erhalten, um Ihre Elektronik und Ihren Datenfluss zu testen. Dann können Sie mit einiger Gewissheit, dass die Rohpixel aussagekräftig sind, zu einer echten Optik wechseln und sich darauf konzentrieren, dass die Optik Ihnen ein scharfes Bild liefert.

Eine Technik, die ich in der Vergangenheit für eine Kamera mit einem M12-Objektivhalter verwendet habe, bestand darin, das Objektiv mit dem Objektivhalter auf einem Evaluierungsboard mit Software, die eine Live-Ansicht auf einem PC ermöglichte, ziemlich gut zu fokussieren. Dann verriegelte ich das Objektiv und bewegte den gesamten Objektivhalter zu meinem Prototyp. Aufgrund geringfügiger Abweichungen in der Sensorposition relativ zur Leiterplatte und zum Montageloch war es nicht perfekt, aber es war gut genug, um ein erkennbares Bild zu erhalten.

Du hast Recht. Ich sollte nur einfache Berechnungen anstellen, wie Sie gesagt haben, und mein System in den Fokus rücken. Dann kann ich mit mehr Selbstvertrauen spielen. Danke für deinen Rat.
RBerteig, Ihre Antwort gefällt mir sehr gut, und ich würde gerne mehr über Ihr Projekt erfahren, RAW-Pixel direkt aus CMOS-Sensoren zu entnehmen, wie sie im RAM erfasst wurden, sie in eine Datei zu kopieren und die Datei durch dcraw zu leiten. Ich versuche, die Funktion und die Hardware zu verstehen, um eine solche Aufgabe zu erfüllen. Vielen Dank, ich weiß, es ist ein altes Thema.