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;
Otsu n'2-classe de clustering. Peut-être que vous devriez essayer de k-means pour un 3-classe de cluster et de voir ce qui se passe?
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