1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
|
void CWebCam::filtreMedianImage ( Image &image, Image &nvelImage, int taille )
{
// classe dans l'ordre les pixels de la fenetre traitée et prend la valeur du milieu et l'affecte au pixel du centre de la fenetre
int k = taille %2;
int t=taille/2;
Image imageAgrandi, imageTemp;
int iMat, jMat, n;
int *tablNdg;
int ordre = ((taille*taille)+1)/2;
tablNdg=new int [taille*taille];
agrandirBordsImage(image,imageAgrandi,taille);
//allocation de l'image temporaire
allocationImage(imageTemp,imageAgrandi.hauteur,imageAgrandi.largeur,imageAgrandi.type);
for ( int i=t; i<(int)(imageAgrandi.hauteur-t); i++ )
{
for ( int j=t; j<(int)(imageAgrandi.largeur-t); j++ )
{
n=0;
for ( iMat=i-t; iMat<=i+t; iMat++ )
{
for ( jMat=j-t; jMat<=j+t; jMat++)
{
tablNdg[n]=imageAgrandi.ptrLigne[iMat][jMat];
n++;
}
}
triTableauOrdreCroissant(tablNdg,(taille*taille));
imageTemp.ptrLigne[i][j]=tablNdg[ordre];
}
}
//remise de l'image à la bonne taille
reduireBordsImage(imageTemp,nvelImage,taille);
liberationImage(imageAgrandi);
liberationImage(imageTemp);
delete tablNdg;
tablNdg=NULL;
}
typedef struct
{
unsigned long hauteur;
unsigned long largeur;
unsigned char type; // BINARY, GRAY ou RGB
unsigned char* pixel;
unsigned char** ptrLigne;
} Image; |
Partager