2009-10-08 10 views
5

Ich möchte die RGB-Werte für jedes Pixel aus einem Rohbild lesen. Kann mir jemand sagen, wie ich das erreichen kann? Danke für die Hilfe!Ermitteln der RGB-Werte für jedes Pixel aus einem Rohbild in C

das Format meiner RAW-Bild ist. CR2, die von der Kamera kommen.

+2

Sie müssen angeben, wie das "rohe Bild" dargestellt wird und welches Format es hat. – sharptooth

+2

Definieren Sie "Rohbild". Ist es eine Bilddatei? Wenn ja, welche Art von Datei? Oder versuchen Sie, eine Bildschirmaufnahme zu machen?Bearbeiten Sie Ihre Frage, um die Details hinzuzufügen. – Artelius

+1

Welches Format ist Ihr "rohes" Bild. Ist es eine Bitmap oder eine Bilddatei, die vielleicht von einer Kamera stammt? – ChrisBD

Antwort

1

Ein RAW - Bild ist ein unkomprimiertes Format. Sie müssen also nur auf den Punkt zeigen, an dem sich Ihr Pixel befindet (überspringt jeden möglichen Header und addiert dann die Größe des Pixels mal die Anzahl der Spalten mal die Anzahl der Zeilen plus die Anzahl der colum), und lesen Sie dann, was auch immer die Binärdaten dem Layout der Daten (mit Masken und Verschiebungen, Sie wissen) ein aussagekräftiges Format geben.

Das ist das allgemeine Verfahren, für Ihr aktuelles Format müssen Sie die Details überprüfen.

4

Angenommen das Bild ist w * h Pixel, und gespeichert in True "gepackten" RGB-Format ohne Alpha-Komponente, jedes Pixel wird drei Bytes benötigen.

Im Speicher wird die erste Zeile des Bildes könnte in ehrfürchtigen ASCII Grafiken wie folgt dargestellt werden:

R0 G0 B0 R1 G1 B1 R2 G2 B2 ... R(w-1) G(w-1) B(w-1) 

Hier ist jede R n G n und B n ein einzelnes Byte repräsentiert , geben die rote, grüne oder blaue Komponente des Pixels n dieser Scanline. Beachten Sie, dass die Reihenfolge der Bytes für verschiedene "rohe" Formate unterschiedlich sein kann. Es gibt keinen vereinbarten Weltstandard. Verschiedene Umgebungen (Grafikkarten, Kameras, ...) machen es aus welchen Gründen auch immer anders, man muss nur das Layout kennen.

ein Pixel auslesen kann dann durch diese Funktion erfolgen:

typedef unsigned char byte; 
void get_pixel(const byte *image, unsigned int w, 
       unsigned int x, 
       unsigned int y, 
       byte *red, byte *green, byte *blue) 
{ 
    /* Compute pointer to first (red) byte of the desired pixel. */ 
    const byte * pixel = image + w * y * 3 + 3 * x; 
    /* Copy R, G and B to outputs. */ 
    *red = pixel[0]; 
    *green = pixel[1]; 
    *blue = pixel[2]; 
} 

Beachten Sie, wie die Höhe des Bildes nicht dafür benötigt wird, zu arbeiten, und wie die Funktion von Grenzen Prüfung frei ist. Eine Produktionsqualitätsfunktion könnte stärker gepanzert sein.

aktualisieren Wenn Sie diesen Ansatz Sorgen machen wird zu langsam sein, können Sie natürlich die Pixel nur eine Schleife über, statt:

unsigned int x, y; 
const byte *pixel = /* ... assumed to be pointing at the data as per above */ 

for(y = 0; y < h; ++y) 
{ 
    for(x = 0; x < w; ++x, pixel += 3) 
    { 
    const byte red = pixel[0], green = pixel[1], blue = pixel[2]; 

    /* Do something with the current pixel. */ 
    } 
} 
+0

Wenn er nur 1 Pixel abfragen muss, ist Ihre Funktion in Ordnung. Wenn er jedoch alle Pixel verarbeiten muss, ist diese Funktion nicht der richtige Weg, da es zu langsam ist (Funktions-Overhead + 3 Multiplikationen für jedes Pixel) – Toad

+0

@reinier: Das könnte stimmen, vorausgesetzt, es wurde kein Inlining verwendet. Ich habe ein explizites verschachteltes Snippet hinzugefügt, um das auch zu zeigen. Vielen Dank. – unwind

+0

@unwind Ich habe eine JPG-Datei, ich habe imagemagick und angewendet Schwelle, und das ändert alle Pixel über dem Schwellenwert als schwarz und andere weiß. Jetzt möchte ich nach jedem Pixel suchen, ob es schwarz oder weiß ist. Wird die obige Methode funktionieren? Was ist der Wert für Rot, Grün und Blau? 255? – Kraken

5

Keine der Methoden geschrieben, so weit wahrscheinlich mit arbeiten eine Kamera "rohe" Datei. Die Dateiformate für Raw-Dateien sind für jeden Hersteller urheberrechtlich geschützt und können zusätzlich zu den Pixeldaten Belichtungsdaten, Kalibrierungskonstanten und Weißabgleichinformationen enthalten, die wahrscheinlich in einem gepackten Format vorliegen, in dem jeder Puxel mehr als ein Byte belegt aber weniger als zwei.

Ich bin sicher, es gibt Open-Source-Raw-Datei-Konverter-Programme da draußen, die Sie konsultieren könnten, um die Algorithmen zu finden, aber ich weiß nichts von der Spitze meines Kopfes.


dachte nur an eine zusätzliche Komplikation. Die RAW-Datei speichert keine RGB-Werte für jedes Pixel. Jedes Pixel zeichnet nur eine Farbe auf. Die anderen beiden Farben müssen aus hohen Pixeln interpoliert werden. Sie werden definitiv besser ein Programm oder eine Bibliothek finden, die mit Ihrer Kamera funktioniert.

Verwandte Themen