15.01.2015 Views

Traitement d'image en langage C - PRIMA

Traitement d'image en langage C - PRIMA

Traitement d'image en langage C - PRIMA

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!