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 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
|
void calculimage(Image &ima1,double &moy,int &eff)
{
int h[256];
int i,somme;
histo(ima1,h);
eff=0;
somme=0;
for (i=0;i<256;i++)
{
eff=eff+h[i];
somme=somme+(h[i]*i);
}
moy=somme/eff;
}
void calculclass(Image &ima1,int seuilS,double &moyclasse0,double &effclasse0,double &proba0,double &moyclasse1,double &effclasse1,double &proba1)
{
int h[256];
int i,somme0,somme1,imax;
double eff;
histo(ima1,h);
somme0=0;
somme1=0;
eff=0.0;
effclasse0=0;
effclasse1=0;
for (i=0;i<256;i++)
{
eff=eff+h[i];
}
imax=seuilS+1;
for (i=0;i<imax;i++)
{
effclasse0=effclasse0+h[i];
somme0=somme0+(h[i]*i);
}
if ((effclasse0==0)&&(somme0==0))
{
moyclasse0=0;
proba0=0;
}
else
{
moyclasse0=somme0/effclasse0;
proba0=effclasse0/eff;
}
for (i=imax;i<256;i++)
{
effclasse1=effclasse1+h[i];
somme1=somme1+(h[i]*i);
}
if ((effclasse1==0)&&(somme1==0))
{
moyclasse1=0;
proba1=0;
}
else
{
moyclasse1=somme1/effclasse1;
proba1=effclasse1/eff;
}
}
void seuilvar(Image &ima1,Image &ima2,int &s)
{
int seuilS,eff,i,j,imax,jmax;
double var,varaux,moy,moyclasse0,moyclasse1,proba0,proba1,effclasse0,effclasse1;
varaux=0;
for (seuilS=0;seuilS<15;seuilS++)
{
calculimage(ima1,moy,eff);
calculclass(ima1,seuilS,moyclasse0,effclasse0,proba0,moyclasse1,effclasse1,proba1);
var=(proba0*(moyclasse0-moy)*(moyclasse0-moy))+(proba1*(moyclasse1-moy)*(moyclasse1-moy));
if (var>=varaux)
{
varaux=var;
s=seuilS;
}
}
imax=3*(int)ima1.largeur;
jmax=(int)ima1.hauteur;
for (i=0;i<imax;i+=3)
{
for (j=0;j<jmax;j++)
{
if ((ima1.ptrLigne[j][i]<=s)&&(ima1.ptrLigne[j][i+1]<=s)&&(ima1.ptrLigne[j][i+2]<=s))
{
memset(&ima2.ptrLigne[j][i],0,3);
}
else
{
memset(&ima2.ptrLigne[j][i],255,3);
}
}
}
}
void histo(Image &ima1,int h[256])
{
int i,imax;
for (i=0;i<256;i++)
{
h[i]=0;
}
imax=(int)ima1.largeur*(int)ima1.hauteur;
for (i=0;i<imax;i++)
{
h[ima1.pixel[i]]=h[ima1.pixel[i]]+1;
}
} |
Partager