Artisan Numérique

/bureau/documents/dcraw/photo/raw/ Traitement de photos au format RAW

Alors attention, je ne suis ni photographe, ni un de ces amateurs éclairés qui aiment manipuler un gros zoom de 4 kg et maîtrisent vitesse d'obstruction, profondeur de champs et compagnie. Je dirais même que je suis plutôt dans le registre du gars qui apprécie réellement son appareil lorsqu'il lui fait les plus belles photos en n'ayant qu'à appuyer sur un bouton. Un position confortée par le fait d'avoir pour ami un vrai de vrai.

Et c'est justement ce dernier, en tant que photographe officiel pour notre mariage, qui en plus de ça sélection développée m'a "fournit" (aidé par un gros fusil) 14GO de ses fichier "raws" à 14mo la pièce... Alors même si je conserve précieusement ces originaux dans un coin, j'avais besoin d'une méthode pour rapidement les convertir en quelque chose de plus accessible à un profane.

Le format RAW

Les fichiers "RAW" sont en quelque sorte l'équivalent numérique de la bonne vieille pellicule (on aussi parle de "négatif digital"). Il s'agit d'un format "en attente" d'un "développement" qui se fait généralement en jpeg avec des outils de tueurs comme lightroom. Des outils propriétaires qui se décline beaucoup plus modestement en outils libres comme le simplissime rawstudio et le moins accessible ufraw

Car c'est bien là l'intérêt, pouvoir travailler l'image dans les meilleurs conditions possibles, seulement limité par la capacité brute de l'appareil utilisé. Ainsi, techniquement, un fichier RAW est l'image telle qu'elle a été "vue" par la cellule CCD de l'appareil photo, sans traitement, ni compression, ni dégradation. Ainsi si le capteur perçoit des couleurs sur 12 bits par composante RGB, l'image générée pèsera 3x16bits=48bits par pixel, soit 6 octets. Pour une image de 4368 x 2912 pixel, cela nous faut 72mo la bestiole. Compressés sans perte, cela tombe à moins que cela mais cela fait tout de même des fichiers bien balaises, comme les 14mo pour un Canon EOS 5D. Enfin, le RAW contient, outre une miniature de l'image, une série de métadonnées permettant de comprendre ce que la capteur a vu au moment où il l'a vu, ceci permettant de mieux décoder ce qu'il a vu, vu ?

Et encore, il s'agit là d'un cas simple, capture par une cellule CCD de 3 composantes. Certains appareils capturent deux versions de la même image avec des paramètres différents, et certains autres travaillent sur 4 composantes de couleurs.

Mais outre la taille, le vrai "hic" avec le RAW est que contrairement à ce que l'on peut imaginer, il n'y a pas un seul RAW qui ressemble à un autre. Même si beaucoup sont basés sur une version modifiée du format TIFF, chaque format RAW est la propriété du constructeur de l'appareil, souvent lié à la structure technique du capteur utilisé. Il y a donc les RAW de chez CANON qui n'ont rien à voir avec ceux de Pentax, etc. C'est d'ailleurs pour cela qu'Adobe a mis au point un format standard de pellicule numérique (DNG) qui n'est pour l'heure pas des masses suivi.

Maintenant le RAW est fondamental pour un photographe pour la simple et bonne raison qu'il peut au moment du développement travailler l'image (luminosité, profondeur des noirs, balance des blancs, etc.) sur un espace de couleur beaucoup plus large (12 à 16 bits par composantes) qu'avec un JPEG (8 bits généralement). Et ceci sans compter que le JPEG perd de l'information à la compression alors que le RAW représente garde la trace exacte de ce que le capteur a récupéré.

Conversion

L'outil qui va bien pour décoder le RAW est dcraw. Cet outil combine en une seule commande la connaissance d'une multitude de format propriétaires et opère les transformations nécessaires (principalement celui de l'espace des couleurs). Dans la version basique, il s'utilise comme ceci :

gastondcraw -v -c source.cr2 > cible.ppm
Loading Canon EOS 5D image from source.cr2 ...
Scaling with darkness 128, saturation 3692, and
multipliers 2.395443 1.000000 1.253807 1.000000
AHD interpolation...
Building histograms...
Writing data to standard output ...
RAW vers PPM

Le format résultant est du PPM, c'est à dire un format bitmap pur et brut avec une profondeur de couleur de 8 bits. Il est cependant possible de monter à 16bits (option -4) ou de générer du TIIF (remplacer -c par -T).

dcraw peut aussi opérer sur le format RAW un certain nombre d'opérations de développement comme la saturation, le mode de conversion des couleurs, la profondeur du noir, etc. Par exemple pour approfondir un peu le noir qui est à 128 pour l'instant (voir trace précédente), nous allons jouer sur le paramètre -k

gastondcraw -v -k 145 -c source.cr2 > cible-1.ppm
Loading Canon EOS 5D image from source.cr2 ...
Scaling with darkness 145, saturation 3692, and
multipliers 2.395443 1.000000 1.253807 1.000000
AHD interpolation...
Building histograms...
Writing data to standard output ...
RAW vers PPM

Vous pouvez aussi jouer sur la balance des blancs (-w), la saturation (-S), etc. Pour ce qui est de l'espace de couleurs, dcraw n'utilise pas par défaut celui de l'appareil, il faut pour cela jouter l'option -o 0, ce qui donne la version finale :

gastondcraw -v -o 0 -k 145 -c source.cr2 > cible-2.ppm
RAW vers PPM

Une fois que la bonne balance est trouvé, il est temps de convertir en JPEG. Cela se fait très simplement avec cjpeg (paquet jpeg-progs) dont le but est de compresser le flux d'entré (PPM) et de produire un flux JPEG en sortie :

gastondcraw -v -o 0 -k 145 -c source.cr2 | cjpeg -quality 100 -optimize -progressive > cible.jpeg
RAW vers PPM

En qualité 100, nous avons une compression sans perte mais une image qui fait 7Mo soit deux fois moins que le CR2. A 80%, même en zoomant, je ne vous aucune différence avec cette fois un fichier de 800Ko. Après c'est à chacun de juger.

Maintenant nous pouvons optimiser tout cela dans un petit script qui va chercher tous les fichier CR2 et les convertir en JPEG dans un dossier passé en paramètre :

#! /bin/sh

dossier_cible="$1"

files=$(find . -name "*.cr2")
for i in $files; do 
  cible=$(basename "$i" ".cr2")
  cible="$dossier_cible/$cible.jpeg"
  echo "Conversion de $i vers $cible"
  if [ ! -f $cible ] ; then
    dcraw -o 0 -k 145 -c "$i" | cjpeg -quality 80 -optimize -progressive > $cible
  fi
done

echo "Conversion achevée"
raw-to-jpeg.sh