Création d'un OFFSET

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;
	}

Algorithme

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.

Création par médiane

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

Améliorations à réaliser

Voici des idées d'améliorations de ces algorithmes :

  • Vérifier les tailles des images et la durée d'exposition.
  • Prévoir une moyenne pondérée par les temps d'exposition
  • Vérifier la taille de la variable m pour éviter des débordements de capacité de variable.
  • Le tableau des images est statique et limité à 16. Prévoir une version dynamique de ce tableau.
  • Garder l'offset en mémoire en cas de réutilisation au sein du programme.
 
apa/theorie/offset.txt · Dernière modification: 2008/01/08 16:50 par davidl
 
Recent changes RSS feed Creative Commons License Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki