calcul de l'entropie d'une image
Bonjour,
je dois calculer l'entropie d'une image, j'ai lu un sujet à ce propos sur le forum mais il ne répond pas à mes questions... Voici la définition :
Soit une source S dans laquelle chaque symbole émis est indépendant des symboles précédemment émis. Cette source est une DMS (Discrete Memoryless source). S est caractérisée par un alphabet {s1, s2,...,sn} et les probabilités d'occurence associées {p(s1),p(s2),...,p(sn)}.
Appelons I(si) l'information qu'apporte l'apparition du symbole si. Alors l'intuition nous pousse à dire qu'un symbole de probabilité d'occurrence faible apporte plus d'information lors de son émission par la source qu'un symbole de probabilité élevée. Mathématiquement, cela se traduit par :
I(si) = -log p(si)
Alors l'entropie H de la source est définie par :
H(S) = sommei=1i=n p(si)I(si) en bits / symbole
L'entropie est donc la quantité moyenne d'information par symbole.
J'ai tout de même réalisé une fonction:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| float traitementGray::Entropie(const CGrayImage& imageGray, vector<unsigned long>& histo)
{
float entropie=0;
float proba_xi=0;
float nb_pixel_total = imageGray.getNbPixels();
for(int i=0; i < 256; i++)
{
if(histo[i]>0)
{
proba_xi = (float)histo[i] / nb_pixel_total;
entropie += (proba_xi * (log(proba_xi)/log((float)2)));
}
}
return (-(entropie));
} |
J'ai vérifier mes valeurs avec des images de références: broatz, d19, d9... et je trouve toujours des valeurs très éloignées...
Que faut-il faire dans le cas d'une valeur de l'histogramme égale à 0?
merci pour votre aide
fog4000