RAW einlesen mit Python

Benutzung und Hintergrundinformationen von CHDK-RAW/DNG-Dateien

RAW einlesen mit Python

Beitragvon ABS » 07.11.2008, 20:00

Ich bin gerade dabei ein Skript zum Einlesen der CHDK RAW-Dateien mit Python zu schreiben.
Was ich zur Ixus 700 inzwischen herausgefunden habe:
- es scheinen 10 Bit pro Pixel Daten zu sein
- es sind 3152 x 2340 Pixel

Dabei habe ich allerdings folgendes Problem:
Mir ist inzwischen bekannt, dass die Daten im Raw in einer bestimmten Abfolge / Grid gespeichert werden. Allerdings scheine ich für meine Kamera die richtige Reihenfolge noch nicht gefunden zu haben. Kann mir jemand das Grid für die Canon Ixus 700 zukommen lassen? (RGRGRG..., GBGBGB...., ?)

Ansonsten läuft das Einlesen incl. Konversion von 10Bit ganz gut. Die nächste Aufgabe wird dann die Berechnung der RGB-Farben aus dem Grid sein. Hat da jemand Erfahrung?
ABS
CHDK-Einsteiger
CHDK-Einsteiger
 
Beiträge: 23
Registriert: 01.11.2008, 12:01

Beitragvon Babul » 07.11.2008, 22:02

ich wuerde es versuchen mit folgender (bayer-) matrix:
RG
GB
bei 10 bit aufloesung (wie bei der a720) duerfte dein RAW 3152x2340/8*10 bit, also 9219600 bytes gross sein.
vergiss nicht, beide gruenen pixel durch 2 zu teilen, falls du es in RGB umwaldelst, und wenn du den kontrast optimal nutzen willst, nimm diese gruenen pixel dafuer!
mfg babul
Benutzeravatar
Babul
CHDK-Begeisterter
CHDK-Begeisterter
 
Beiträge: 79
Registriert: 07.08.2008, 19:39
Wohnort: Lindenfels

Code

Beitragvon ABS » 07.11.2008, 22:21

"Spricht" hier im Forum jemand Python?

Zu Einlesen der Daten nutze ich
EDIT: Code gelöscht, da fehlerhaft
Zuletzt geändert von ABS am 08.11.2008, 16:41, insgesamt 1-mal geändert.
ABS
CHDK-Einsteiger
CHDK-Einsteiger
 
Beiträge: 23
Registriert: 01.11.2008, 12:01

Beitragvon Babul » 07.11.2008, 22:35

unterstuetzt python lsl und lsr befehle? kann man damit auch ein GUI schreiben? wenns noch als kroenung nen compiler gibt, hast du in zukunft meine unterstuetzung :)
noch eins: wie gross darf die groesste zahl sein? stell dir mal vor: du liest 40 bit (4 pixel a 10 bit), also 5 bytes, als integer ein. um den blauwert zu ermitteln (aus einer 40bit-zahl) braeuchtest du "nur":
fuer blau (die letzten 10 bit) einfach den "teilungsrest" aus 1024
B=<wert> mod 1024
fuer das zweite guene pixel einen logical-shift-right, also /1024, DANN teilungsrest
G2=(<wert>/1024) mod 1024
das erste gruene, damits es komplett ist
G1=(<wert>/(1024*1024)) mod 1024
und zum schluss
R=(<wert>/(1024*1024*1024)
beim roten pixel brauchts keine modulation, ist ja nicht groesser als 1024 :)
hilft dir das weiter?
Benutzeravatar
Babul
CHDK-Begeisterter
CHDK-Begeisterter
 
Beiträge: 79
Registriert: 07.08.2008, 19:39
Wohnort: Lindenfels

Beitragvon ABS » 08.11.2008, 01:16

Ich glaube ich habe das Problem gefunden.
Die Codierung soll ja little-endian sein. was bedeutet das bei 10 bit Datensätzen?
Soll also heißen:
Die ersten 4 Pixel der Zeile 0 sind im Datensatz (R0,0)(G0,1)(R0,2)(G0,3) gespeichert. Dieser geht über 5 Byte. Wie sind die Bits der Pixel darin verteilt?
Zuletzt geändert von ABS am 08.11.2008, 11:16, insgesamt 1-mal geändert.
ABS
CHDK-Einsteiger
CHDK-Einsteiger
 
Beiträge: 23
Registriert: 01.11.2008, 12:01

Beitragvon Babul » 08.11.2008, 04:59

gib mir bitte mal nen dump vom ersten kilobyte eines crw, ich schaus mir mal an (koennte ich auch mit meiner kamera machen, klar), mir ist das problem noch nicht klar. jedenfalls beziehst du dich offenbar bei den zeilen auf die im raw enthaltenen bayermatrix, zeile 1 waere dann gbgb usw. ich braeuchte also eine zeile komplett...
das mit den 5 pixeln kapier ich nicht, ist vielleicht schon zu spaet :)
Benutzeravatar
Babul
CHDK-Begeisterter
CHDK-Begeisterter
 
Beiträge: 79
Registriert: 07.08.2008, 19:39
Wohnort: Lindenfels

Beitragvon ABS » 08.11.2008, 16:25

Inzwischen habe ich es geschafft die RAW-Daten meiner IXUS 700 einzulesen. Die Weiterbearbeitung muss ich allerdings noch programmieren. Ich möchte hier nicht wieder Quellcode abtippen, sondern das grundsätzliche Vorgehen beschreiben (bitte berichtigen, falls noch etwas falsch ist):

1) Die Daten sind im Format Little-Endian in 2 Byte großen Blöcken gespeichert.
Wenn wir also den Anfang einer Datei betrachten, z.B. die ersten 6 Byte, sieht das ganze im Editor so aus:
B0 B1 B2 B3 B4 B5 (= von mir gewählter Name des Byte-Blocks zur Wiedererkennung unten)
C2 07 7C 10 07 00 (= (hex) Wert der Byte, der im Editor steht)
Daraus kann man aber noch nicht direkt die Werte der Farben berechnen

2). Man muss Byte-Blocke noch so tauschen:
B1 B0 B3 B2 B5 B4
07 C2 10 7C 00 08

Diese Sortierung entspricht nun der Sortierung wie man sie aus dem Leben kennt:
Die großen Werte einer Zahl kommen zuerst (links), die kleineste Einheit einer Zahl ist die letzte.

3) Die Byte-Folge ist jetzt noch im 8Bit-Modus gespeichert( z.B. (hex) C2 = (binär) 1100 0010)
Die Kamera speichert allerdings 10Bit-Daten. D.h. die 10-Bit Daten müssen aus den Binärdaten unter 2) extrahiert werden. Dazu schreibe ich jetzt mal die Daten aus 2) in binärer Form:
0 7 C 2 1 0 7 C 0 0 0 8 => (binär) 0000 0111 1100 0010 0001 0000 0111 1100 0010 0000 0000 0111

Jetzt kann man die Binärfolge auch so schreiben, dass ein Leerzeichen erst nach 10 Einträgen und nicht nach 4 Einträgen kommt:
0000011111 0000100001 0000011111 0000100000 00000111..

Diese Binärdaten müssen nun in 10-Bit Blöcken gelesen werden. So ergibt sich:
1.Wert: 0000011111 => (dezimal) 31
2.Wert: 0000100001 => (dezimal) 33
3.Wert: 0000011111 => (dezimal) 31
4.Wert: 0000100000 => (dezimal) 32

4) Da es sich bei dem Datensatz um die allerersten Daten in der Datei handelt, wurden auf diese Weise die Werte für Rot1, Grün1, Rot2, Grün2 aus der bekannten Matrix
RGRG...RGRG
GBGB...RBGB
....................
RGRG...RGRG
GBGB...GBGB
eingelesen. Die GB-Anteile sind in der 2. Zeile der Matrix und sind viel weiter hinten in der Datei gespeichert.

Die Werte sind mit 30-32 sehr klein (der maximale Wert ist (2 hoch 10 - 1) = 1023). Dies liegt daran, dass es im RAW-Bild einen Bildbereich gibt, der im JPG nicht zu sehen ist weil er schwarz ist und daher einfach abgeschnitten wird. Aus diesem Bereich stammen die Daten, die eingelesen wurden.

Bis hier bin ich momentan gekommen. Das Weitere muss ich noch programmieren:

5) Die 10Bit-Zahlen müssen nun noch etwas skaliert werden, da die Daten nicht linear gespeichert sind (doppelt so hoher Zahlenwert heißt nicht unbedingt doppelt so hell)

6) Aus der Matrix müssen nun Bildpunkte berechnet werden, die alle 3 Farben (R,G,B) besitzen.

Es bleibt also viel zu tun....
ABS
CHDK-Einsteiger
CHDK-Einsteiger
 
Beiträge: 23
Registriert: 01.11.2008, 12:01

Beitragvon PhyrePhoX » 08.11.2008, 17:07

ich würde an deiner stelle noch warten, es gibt da gerade die entwicklung wonach es möglich werden wird dng dateien direkt in der kamera zu schreiben :)
Benutzeravatar
PhyrePhoX
CHDK-Begeisterter
CHDK-Begeisterter
 
Beiträge: 490
Registriert: 04.07.2008, 22:31

Beitragvon ABS » 08.11.2008, 17:13

PhyrePhoX hat geschrieben:ich würde an deiner stelle noch warten, es gibt da gerade die entwicklung wonach es möglich werden wird dng dateien direkt in der kamera zu schreiben :)


Wie lange wird es noch dauern und für welche Kameras wird es möglich sein?
ABS
CHDK-Einsteiger
CHDK-Einsteiger
 
Beiträge: 23
Registriert: 01.11.2008, 12:01

Beitragvon PhyrePhoX » 08.11.2008, 17:17

wie lange es noch dauert weiss ich nicht, hier kannst du dir einen ersten überblick verschaffen: http://trac.assembla.com/a710/timeline
das ist der "private" svn space von ewavr. sieht so aus als wäre er schon recht weit. und wenn wird es sicherlich für alle kameras funktionieren.
Benutzeravatar
PhyrePhoX
CHDK-Begeisterter
CHDK-Begeisterter
 
Beiträge: 490
Registriert: 04.07.2008, 22:31

Beitragvon ABS » 08.11.2008, 17:31

ich bin gespannt ...
werde aber vorerst mit RAW weiterarbeiten :)
ABS
CHDK-Einsteiger
CHDK-Einsteiger
 
Beiträge: 23
Registriert: 01.11.2008, 12:01

Beitragvon PhyrePhoX » 08.11.2008, 17:38

okay, noch ein heisser tip: schau dir die sourcen von dng-4ps und dcraw an. wobei man da sehr schnell den überblick verlieren kann ^^
Benutzeravatar
PhyrePhoX
CHDK-Begeisterter
CHDK-Begeisterter
 
Beiträge: 490
Registriert: 04.07.2008, 22:31

Beitragvon ABS » 08.11.2008, 18:09

Danke für die Tipps!
ABS
CHDK-Einsteiger
CHDK-Einsteiger
 
Beiträge: 23
Registriert: 01.11.2008, 12:01

Beitragvon Babul » 08.11.2008, 21:20

danke auch von mir, jetzt hab ich noch mehr zu tun :)
Benutzeravatar
Babul
CHDK-Begeisterter
CHDK-Begeisterter
 
Beiträge: 79
Registriert: 07.08.2008, 19:39
Wohnort: Lindenfels

Beitragvon PhyrePhoX » 08.11.2008, 22:15

ihr habt sorgen, hauptsache ihr erfindet nicht das rad neu. ich wär ja lieber mal für ein paar tüftler die direkt den chdk code optimieren und bereichern :)

so zb hier: http://chdk.kernreaktor.org/mantis/view.php?id=21
da hat jemand nen patch mit dem auf der kamera direkt crws geschrieben werden, mit header und allem pipapo.
Benutzeravatar
PhyrePhoX
CHDK-Begeisterter
CHDK-Begeisterter
 
Beiträge: 490
Registriert: 04.07.2008, 22:31

Nächste

Zurück zu RAW und DNG

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast