La création d'un offset est réalisée par moyenne des valeurs d'un pixel. Pour des raisons de performance, les images sont toutes chargées en mémoire. Le traitement se fait puis le résultat est stocké dans un fichier offset.tiff
.
for(count = 0; count < images[0]->bufferSize/2 ; count++) { m=0; for (j=0;j<i;j++) { v = images[j]->buffer[count*2]+256*images[j]->buffer[count*2+1]; m+=v; } m = m/i; offset.buffer[count*2+1]=m/256; offset.buffer[count*2]=m-offset.buffer[count*2+1]*256; }
Le tableau images est un tableau de pointeur de structure_d_image. On suppose que chaque image a le même format donc la même taille de buffer. Les images sont supposées en 16 bits, monochrome (format RAW).
Il suffit donc de deux boucles imbriquées. Une sur la moitié du buffer (on parcourt les pixels deux par deux) et une sur les images pour faire la moyenne par pixel.
On divise la somme des pixels par le nombre d'image.
Le résultat est stocké dans une structure image pour être enregistré sur disk.
La création d'un offset par médiane, ne consiste pas à faire la moyenne des offsets bruts mais de prendre la valeur médiane de l'ensemble des valeurs d'un point de l'image.
Imaginons que nous avons 5 images d'offset. Pour un pixel (x,y) nous pouvons avoir les valeurs [12,5,11,8,13] correspondant aux 5 images. Si on trie ces valeurs en ordre croissant on a [5,8,11,12,13]. La valeur médiane de ces 5 images est 11.
L'avantage de cette méthode est l'élimination des valeurs extrêmes.
int med = (int)i/2; // Rang de la mediane par rapport au nombre d'image // Boucle sur les pixels de l'image for(count = 0; count < images[0]->bufferSize/2 ; count++) { int t[16]; // Mise en tableau des valeurs de pixel for (j=0;j<i;j++) { // Valeur v = images[j]->buffer[count*2]+256*images[j]->buffer[count*2+1]; t[j]=v; } // tri des valeurs qsort( &t, i, /* le nombre d'elements */ sizeof(int), /* la taille d'un element */ cmp_int); /* la fonction qui compare les elements */ // Choix de la valeur mediane m = t[med]; // Stockage de la mediane offset.buffer[count*2+1]=m/256; offset.buffer[count*2]=m-offset.buffer[count*2+1]*256; } }
Vous pouvez noter dans cette algorithme l'utilisation de la fonction C qsort pour le tri des valeurs
Voici des idées d'améliorations de ces algorithmes :