Traitement d'image en langage C - PRIMA
Traitement d'image en langage C - PRIMA
Traitement d'image en langage C - PRIMA
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
<strong>Traitem<strong>en</strong>t</strong> d’image <strong>en</strong> <strong>langage</strong> C<br />
Amaury Nègre<br />
Jean-Pascal Mercier<br />
TP4<br />
1 Convolution<br />
La convotion discréte à deux dim<strong>en</strong>sions C(x, y) d’un signal S par un noyau N se<br />
calcul par la formule suivante :<br />
C(x, y) =<br />
∞∑<br />
∞∑<br />
u=−∞ v=−∞<br />
S(x − u, y − v) · N(u, v) (1)<br />
Jusqu’à prés<strong>en</strong>t, nous avons travailler avec des images de couleur <strong>en</strong>codé dans le format<br />
RGBX. Pour simplifier la procédure, nous allons maint<strong>en</strong>ant n’utiliser que la luminosit’e<br />
(niveau de gris) de l’image. Pour ce, vous pouver vous servir de la nouvelle version du<br />
fichier loadSaveTiff.h/c disponible a l’addresse :<br />
http://www-prima.inrialpes.fr/perso/Mercier/traitimage/download/code/<br />
Ce nouveau fichier conti<strong>en</strong>t les fonctions : LoadPixelsGray, SavePixelsGray, Swap-<br />
BufferGray. Ces fonctions ont les même propriétés que leur homologue RGBX, seul change<br />
le type des paramètres repres<strong>en</strong>tant l‘image : uint32 → uint8. L’image resultante est donc<br />
<strong>en</strong>codé avec un seul canal. Il est à noté que le fichier source ne dois pas necessairem<strong>en</strong>t<br />
cont<strong>en</strong>ir une image <strong>en</strong> niveau de gris, la fonction LoadPixelGray se charge de la conversion.<br />
→ Écrivez une fonction qui calcule la convolution discrète d’une image de luminosité<br />
(image <strong>en</strong> niveau de gris). La fonction aura le prototype suivant :<br />
typedef unsigned char uint8;<br />
int convolution( uint8* source,<br />
int swidth,<br />
int sheight,<br />
uint8** destination,<br />
int* dwidth,<br />
int* dheight,<br />
float* kernel,<br />
int kw,<br />
int kh );<br />
– source et destination sont les pointeurs vers les pixels de l’image source et de l’image<br />
destination, source est allouée par l’appelant, destination est allouée par la fonction<br />
convolution. Les pixels sont <strong>en</strong>codés <strong>en</strong> 256 niveaux de luminosité (0 = noir, 255 =<br />
blanc).<br />
1
– swidth et sheight définiss<strong>en</strong>t la taille des images source et destination. dwidth et<br />
dheight doiv<strong>en</strong>t retourner la taille de l’image calculée. Celle-ci est inférieure à la<br />
taille de l’image source du fait de la convolution.<br />
– kernel est le noyau de corrélation de taill kw x kh. kw et kh doiv<strong>en</strong>t être des nombres<br />
impairs. kernel pointe vers kw x kh nombres flottants : ce sont les valeurs du<br />
noyau disposé <strong>en</strong> lignes successives. Les valeurs du noyau sont indexés dans les intervalles<br />
[−kw/2, kw/2], [−kh/2, kh/2] oú / est la division <strong>en</strong>tiére. Par exemple pour<br />
un noyau de taille 3x3<br />
(-1, 1) (0, -1) (1, -1) (-1, 0) (0, 0) (1, 0) ( -1, 1) (0, 1) (1, 1)<br />
→ Testez votre fonction de convolution sur différ<strong>en</strong>ts noyaux vus lors de la premiére séance<br />
(séance Photoshop).<br />
2