Multi otsu(multi-seuillage) avec openCV
Je suis en train de réaliser multi-seuillage avec otsu. La méthode que j'utilise actuellement est en fait via la maximisation de l'écart entre la classe, j'ai réussi à obtenir la même valeur de seuil donnée que par la bibliothèque OpenCV. Cependant, c'est par le biais de l'exécution de otsu méthode une fois.
La Documentation sur la façon de faire de la multi-niveau de seuillage ou plutôt récursive seuillage est plutôt limitée. Où dois-je faire après l'obtention de l'original otsu de la valeur? Apprécierait de quelques conseils, j'ai été jouer avec le code, l'ajout d'une boucle for, mais la prochaine valeur calculée est toujours 254 pour une image:(
Mon code si besoin est:
//compute histogram first
cv::Mat imageh; //image edited to grayscale for histogram purpose
//imageh=image; //to delete and uncomment below;
cv::cvtColor(image, imageh, CV_BGR2GRAY);
int histSize[1] = {256}; //number of bins
float hranges[2] = {0.0, 256.0}; //min andax pixel value
const float* ranges[1] = {hranges};
int channels[1] = {0}; //only 1 channel used
cv::MatND hist;
//Compute histogram
calcHist(&imageh, 1, channels, cv::Mat(), hist, 1, histSize, ranges);
IplImage* im = new IplImage(imageh);//assign the image to an IplImage pointer
IplImage* finalIm = cvCreateImage(cvSize(im->width, im->height), IPL_DEPTH_8U, 1);
double otsuThreshold= cvThreshold(im, finalIm, 0, 255, cv::THRESH_BINARY | cv::THRESH_OTSU );
cout<<"opencv otsu gives "<<otsuThreshold<<endl;
int totalNumberOfPixels= imageh.total();
cout<<"total number of Pixels is " <<totalNumberOfPixels<< endl;
float sum = 0;
for (int t=0 ; t<256 ; t++)
{
sum += t * hist.at<float>(t);
}
cout<<"sum is "<<sum<<endl;
float sumB = 0; //sum of background
int wB = 0; //weight of background
int wF = 0; //weight of foreground
float varMax = 0;
int threshold = 0;
//run an iteration to find the maximum value of the between class variance(as between class variance shld be maximise)
for (int t=0 ; t<256 ; t++)
{
wB += hist.at<float>(t); //Weight Background
if (wB == 0) continue;
wF = totalNumberOfPixels - wB; //Weight Foreground
if (wF == 0) break;
sumB += (float) (t * hist.at<float>(t));
float mB = sumB /wB; //Mean Background
float mF = (sum - sumB) /wF; //Mean Foreground
//Calculate Between Class Variance
float varBetween = (float)wB * (float)wF * (mB - mF) * (mB - mF);
//Check if new maximum found
if (varBetween > varMax) {
varMax = varBetween;
threshold = t;
}
}
cout<<"threshold value is: "<<threshold;
Une approche de ré-appliquer Otsu sur un histogramme qui a déjà été thresholded, est de prendre le tour d'une réinitialisation de la partie de l'histogramme qui est au-dessus ou au-dessous, la première Otsu valeur de seuil. Cela se fait en faisant partie de l'histogramme des poubelles ou des chiffres de la population à zéro.
aussi, s'il vous plaît, fossé ceux IplImages, et l'utilisation de cv::seuil() à la place
peut-être que vous pouvez appliquer otsu une fois, puis diviser l'image en deux cluster, appliquez un peu de la balance des blancs de normalisation sur chacun d'eux (rappelez-vous la normalisation du calcul), puis appliquer otsu sur chacun d'eux. Pour obtenir l'original seuils, vous pouvez annuler la normalisation de calcul pour que les valeurs de seuil.
pouvez-vous partager quelques liens sur tat? Afin que je puisse avoir une meilleure compréhension. N'hésitez pas à mettre comme réponse que j'ai l'habitude de upvote toutes les réponses à ma question, à moins que la réponse est totalement superflus(comme vraiment, vraiment mauvais). Merci(:
OriginalL'auteur rockinfresh | 2014-03-28
Vous devez vous connecter pour publier un commentaire.
D'étendre Otsu du seuillage de la méthode multi-niveau de seuillage de l'écart entre la classe équation devient:
Voici mon C# de mise en œuvre de Otsu Multi pour 2 seuils:
Et c'est le résultat que j'ai obtenu par seuillage d'une image d'analyse de sol avec le code ci-dessus:
(T1 = 110, T2 = 147).
Espère que cette aide.
M0 = M0K / W0K; //(i * Pi)/Pi
ressemble à la somme de t1 à moi (= Somme(0, i)). Même pour les M1.OriginalL'auteur Antoni4
J'ai écrit un exemple sur la façon otsu seuillage de travail en python avant. Vous pouvez voir le code source ici: https://github.com/subokita/Sandbox/blob/master/otsu.py
Dans l'exemple il y a 2 variantes, otsu2() qui est la version optimisée, comme on le voit sur la page Wikipedia, et otsu() qui est plus naïf de la mise en œuvre basée sur la description d'algorithme lui-même.
Si vous êtes d'accord, dans la lecture de python codes (dans ce cas, ils sont assez simples, presque le pseudo-code), vous voudrez peut-être regarder à otsu() dans l'exemple et de le modifier. Le portage de code C++ n'est pas dur non plus.
ce n'est pas une réponse à la question, veuillez downvote au lieu de upvote. Upvoting n'est pas la même chose que "merci", et de le faire à une mauvaise réponse peut induire en erreur les futurs lecteurs.
OriginalL'auteur sub_o
@Antoni4 donne la meilleure réponse, à mon avis et c'est très droite vers l'avant pour augmenter le nombre de niveaux.
C'est pour trois niveau de seuillage:
OriginalL'auteur Guilherme Silva
@Guilherme Silva
Votre code a un BUG
Vous Devez Remplacer:
avec
et
avec
😉
Ce qui concerne
MODIFIER(1): [Toby Speight]
J'ai découvert ce bug par l'application de l'effet à la même image à différents resoultions(Tailles) et de voir que les résultats étaient très différents les uns des autres (Même en changeant la résolution un peu)
W3K et M3K doivent être les totaux moins les Précédentes Semaines et MKs.
(J'ai pensé à cela pour le Code-similitude avec l'une avec un niveau moins)
En ce moment à cause de mon manque de l'anglais je ne peux pas expliquer Mieux Comment et Pourquoi
Pour être honnête, je ne suis pas encore sûr à 100% que c'est correct, même la pensée de mes sorties, je pourrais dire qu'elle donne de meilleurs résultats. (Même avec 1 Niveau de plus (5 nuances de gris))
Vous pouvez essayer vous-même 😉
Désolé
Mes Sorties:
3 Seuils
4 les Seuils de
Je l'ai découvert en regardant les résultats de sortie. J'ai vu que les résultats de sortie où bien différents de l'application de l'effet sur la même photo avec des tailles différentes. Fondamentalement W3K et M3K doivent être les totaux, moins les niveaux précédents W et M. (désolé pour mon anglais)
Bien que ce code peut aider à résoudre le problème, ça n'explique pas pourquoi et/ou comment il répond à la question. La fourniture de ce contexte supplémentaire permettrait d'améliorer de façon significative à long terme sa valeur éducative. Veuillez modifier votre réponse pour ajouter des explications, y compris quelles sont les limites et les hypothèses s'appliquent.
OriginalL'auteur reexre
J'ai trouvé une pièce utile de code dans ce fil. Je cherchais un multi-niveau de Otsu mise en œuvre pour double/float images. Donc, j'ai essayé de généraliser exemple pour N-niveaux avec double/float matrice en entrée. Dans mon code ci-dessous je suis en utilisant tatou bibliothèque de dépendance. Mais ce code peut être facilement adapté pour la norme C++ tableaux, il suffit de remplacer vec, uvec des objets avec unidimensionnels double et entier des tableaux, des tapis et umat avec deux dimensions. Deux autres fonctions de tatou utilisés ici sont: vectoriser et hist.
OriginalL'auteur Gregor Bauman
Ici est une simple approche générale pour 'n' seuils python (>3.0) :
Pour l'étude complète et plus d'informations visitez ce lien.
OriginalL'auteur Sujoy Kumar Goswami