Médian
Le filtre médian à pour but de supprimer les bruits impulsionnels dans une image. Par bruit impulsionnel, on désigne des points qui seraient présents venant d’une image et qui sont très différents de leurs voisins.
Pour supprimer ce type de bruit. On calcule l’intensité de la lumière sur les points voisins au point que l’on considère. Ensuite, on trie tous les points en fonction de leur intensité lumineuse et on prend le point avec l’intensité médiane (du milieu) comme point résultant du filtrage.
Avant
Après
Voici le code C qui permet de réaliser ce filtre :
/*******************************************************************/ /* Applique un filtre médian sur l’image psrc et place le resultat */ /* dans pdest. pdest et psrc doivent avoir la même taille. */ void image_median(image *pdest, image *psrc) int32 vx,vy; int i,j; pix vpix; pix pix_tab[9]; float lum_tab[9]; float lum_swap; pix pix_swap; int pos;
/* si les préconditions ne sont pas remplies, on quitte */ if((pdest == NULL) || (psrc == NULL) || (psrc->width != pdest->width) || (psrc->height != pdest->height)) return; for(vy = 0;vy < psrc->height; vy++) for(vx = 0;vx < psrc->width; vx++) pos = 0; for(j=0;j<3;j++) for(i=0;i<3;i++) vpix = get_pix(psrc, vx-(3>>1)+i, vy-(3>>1)+j); pix_tab[pos] = vpix; /* on calcule la luminance */ lum_tab[pos] = 0.299*(float)COL_RED (vpix) + 0.587*(float)COL_GREEN(vpix) + 0.114*(float)COL_BLUE (vpix); pos++; /* on tri le tableau des pixels en fonction de la luminance */ for(j=0;j<8;j++) pos = j; for(i=j+1;i<9;i++) if(lum_tab[i] < lum_tab[pos]) pos = i; lum_swap = lum_tab[j]; pix_swap = pix_tab[j]; lum_tab[j] = lum_tab[pos]; pix_tab[j] = pix_tab[pos]; lum_tab[pos] = lum_swap; pix_tab[pos] = pix_swap;/* on place le point avec l’intensité moyenne dans l’image destination */ put_pix_alpha_replace(pdest, vx, vy, pix_tab[4]); /*******************************************************************/