bonjour stephl ! voici le code matlab correspondant .
en ce qui concerne le depassement de capa, puisque sigma est deja declaré en tant que double je pense pas que ca pose problème
Version imprimable
bonjour stephl ! voici le code matlab correspondant .
en ce qui concerne le depassement de capa, puisque sigma est deja declaré en tant que double je pense pas que ca pose problème
je viens de tester la binarisation avec visual studio , l'image obtenue ressemble à celle que j'ai sur matlab mais je comprend pas pourquoi ca marche pas sur cible:evilred:
Bonjour kayser33.
Merci pour le code, je vais jeter un oeil.
sigma est bien déclarée en double, mais avec les parenthèses autour de (n * n * ...), il n'y a que des entiers donc les calculs sont faits en int. J'en veux pour preuve que le résultat change si je force la conversion en double avant de multiplier.
merci stephl!
De rien! J'espère que nous allons réussir à résoudre le problème.
Pourrais-tu joindre les résultats que tu obtiens quand tu fais tourner ton programme c avec les données que tu m'as envoyées?
EDIT
Que fait la fonction power() dans ton code matlab?
oui bien sur voila l'image obtenue (normalement elle est au format bmp mais j'ai du la convertir en jpeg donc un peu de bruit s'y ajoute)
La fonction power est la fonction puissance
C = power(A,B) is called for the syntax 'A .^ B' when A or B is an object.
Je préfèrerais les données au format excel si possible, car je crains d'avoir du mal à reconstituer les 6000 et quelques valeurs des points de l'image ;)
Ce sont bien les données obtenues avec ton programme c?
Et que fait la fonction power dans ton code matlab? OK merci, je viens de voir ton post.
ok ok juste le temps de récuperer les données et de les enregistrer sous excel ...
Je ne suis pas sûr de bien comprendre. Dans ton code matlab, est-ce que le code suivant:
calcule myu(255)*omega(i)-myu(i) à la puissance (omega(i)*(1- omega(i))) ?Code:power(myu(255)*omega(i)-myu(i),(omega(i)*(1- omega(i))))
J'ai noté des différences entre ton code matlab et ton code c. Du coup, j'ai écrit une fonction de binarisation en c en suivant scrupuleusement ton code matlab (sans chercher à comprendre) et j'obtiens exactement le résultat que tu m'avais fourni.
bon ben c'est rassurant alors que tu retrouves le même résultat! en fait tu avais raison quant à la conversion en double de la multiplication.
autre erreur de ma part( je suis desolée) en fait dans le code matlab il faut lire
sigma(i)=power(myu(255)*omega(i)-myu(i),2)/(omega(i)*(1- omega(i))); à la place de
sigma(i)=power(myu(255)*omega(i)-myu(i),(omega(i)*(1- omega(i))));
as tu noté d'autres différences?
as tu une idée maintenant pourquoi sur cible ça ne marche pas?
Ah ok, je n'arrivais pas à comprendre comment tu avais traduit la fonction power dans ton code c ;)
Je suis en train d'écrire un petit résumé de mes commentaires. Je le poste dès que c'est prêt.
EDIT
Pour le calcul de l'histogramme, c'est ok: les codes c et matlab font la même chose.
Pour le calcul de omega, c'est correct également: le omega c vaut n fois le omega matlab --il y a d'ailleurs dans ton code matlab une partie inutile de calculs que tu écrases tout de suite après:
Il y a des différences dans le calcul de myu. myu(1) matlab est bien égal à myu[0] c, pas de problème. Mais après ce n'est plus le cas.Code:
1
2
3
4 for i=1:256 omega(i)=hist(i)/(Hauteur*Largeur); end
matlab:
myu(2) = myu(1) + 2 * prob(2)
myu(2) = 0 + 2 * hist(2) / n
c:
myu[1] = myu[0] + 1 * histogram[1]
myu[1] = 0 + histogram[1]
Or, histogram[1] c correspond à hist(2) matlab. Idem pour les termes suivants. Au final, les vecteurs myu matlab et c sont différents selon moi.
Dans le code matlab, la matrice résultat est remplie de 0 et de 1. En c, elle est remplie de 0 et 255.
Dans le code matlab, j'ai l'impression que la matrice résultat comporte 1 si la valeur correspondante de l'image originale est strictement supérieure au seuil, sinon 0.
Dans le code c, la matrice résultat comporte 255 si la valeur correspondante de l'image originale est supérieure ou égale au seuil, sinon 0.
Enfin, le seuil matlab peut aller de 1 à 256, tandis que le seuil c peut aller de 0 à 255.
Dans le code matlab, la matrice résultat est remplie de 0 et de 1. En c, elle est remplie de 0 et 255.
oui ce n'est pas un problème 255=0xFF= valeur max (ndg) = blanc et la valeur 1 dans une image binarisée c'est du blanc aussi.
Enfin, le seuil matlab peut aller de 1 à 256, tandis que le seuil c peut aller de 0 à 255
normalement le seuil varie de 0 à 255 c donc une erreur sur le code matlab car au max on a 255 ndg (autant pour moi;))
ps: quand tu ma di que tu retrouvais la meme image tu parlé de celle binarisée en c ou matlab?
Avec quelle formule ont été générées les valeurs matlab que tu avais jointes (donnees binarisees otsu.xls)? Si j'utilise celle qui est dans le fichier matlab (la mauvaise d'après ce que tu dis), alors j'obtiens 0 différence. En revanche, si j'utilise la formule corrigée, j'obtiens 180 différences :?
je relance mon programme et jte di ca dans quelques instants
donc apparemment elles ont été généré avec la première formule mais la seconde que j'ai corrigée (donc celle qui est traduite en C)me donne de meilleurs résultats.
En fait j'avais fait des recherches sur le net et j'ai trouvé les 2 formules mais je ne retrouve plus la source exacte qui indiquait d'utiliser la 2eme formule...
les differences que tu observes c'est entre l'image que tu obtiens avec ton code C et quoi?
Entre l'image obtenue avec le code c et l'image obtenue avec le code matlab. J'ai écrit un petit programme qui extrait les données du fichier excel de l'image binarisée par matlab (donnees binarisees otsu.xls) et les compare à ce que j'obtiens en sortie de la fonction de binarisation c (bien-sûr j'ai changé les 255 en 1 :) ).