Finden Sie robust N Kreise mit dem gleichen Durchmesser: Alternative zur Bruteforcing-Hough-Transformationsschwelle

Ich entwickle eine Anwendung, um kleine Tiere in Petrischalen (oder anderen runden Behältern) zu verfolgen. Bevor eine Verfolgung stattfindet, werden die ersten Bilder zum Definieren von Bereichen verwendet. Jedes Gericht entspricht einem kreisförmigen unabhängigen statischen Bereich (d. H. Wird während der Verfolgung nicht aktualisiert). Der Benutzer kann das Programm auffordern, nach Gerichten aus dem Originalbild zu suchen und diese als Bereiche zu verwenden.

Hier sind Beispiele:

Um diese Aufgabe auszuführen, verwende ichHough Circle Transform. In der Praxis haben unterschiedliche Benutzer jedoch sehr unterschiedliche Einstellungen und Bilder, und ich möchte den Benutzer nicht auffordern, die Parameter manuell zu definieren. Ich kann auch nicht alle Parameter erraten.

Ich habe jedoch zusätzliche Informationen, die ich verwenden möchte:

Ich kenne die genaue Anzahl der zu erkennenden Kreise.

Alle Kreise haben fast die gleichen Abmessungen.Die Kreise dürfen sich nicht überlappen.Ich habe eine ungefähre Vorstellung von der minimalen und maximalen Größe der Kreise.Die Kreise müssen vollständig im Bild sein.

Ich kann daher die Anzahl der zu definierenden Parameter auf eins eingrenzen:der Grenzbereich. Wenn ich diese Informationen verwende und bedenke, dass ich N Kreise zu finden habe,Meine derzeitige Lösung besteht darin, viele Schwellenwerte zu testen und die Kreise beizubehalten, zwischen denen die Standardabweichung am kleinsten ist (da alle Kreise eine ähnliche Größe haben sollten):

//at this point, minRad and maxRad were calculated from the size of the image and the number of circles to find.
//assuming circles should altogether fill more than 1/3 of the images but cannot be altogether larger than the image.
//N is the integer number of circles to find.
//img is the picture of the scene (filtered).

//the vectors containing the detected circles and the --so far-- best circles found.
std::vector<cv::Vec3f> circles, bestCircles;

//the score of the --so far-- best set of circles
double bestSsem = 0;

 for(int t=5; t<400 ; t=t+2){
//Apply Hough Circles with the threshold t
    cv::HoughCircles(img, circles, CV_HOUGH_GRADIENT, 3, minRad*2, t,3, minRad, maxRad );

    if(circles.size() >= N){
//call a routine to give a score to this set of circles according to the similarity of their radii
        double ssem = scoreSetOfCircles(circles,N);
//if no circles are recorded yet, or if the score of this set of circles is higher than the former best
        if( bestCircles.size() < N ||  ssem > bestSsem){
//this set become the temporary best set of circles
                bestCircles=circles;
                bestSsem=ssem;
        }
    }
}

Mit:

 //the methods to assess how good is a set of circle (the more similar the circles are, the higher is ssem)
    double scoreSetOfCircles(std::vector<cv::Vec3f> circles, int N){
    double ssem=0, sum = 0;
        double mean;
        for(unsigned int j=0;j<N;j++){
            sum = sum + circles[j][2];
        }
        mean = sum/N;
        for(unsigned int j=0;j<N;j++){
            double em = mean - circles[j][2];
            ssem = 1/(ssem + em*em);
        }
    return ssem;

}

Ich habe eine höhere Genauigkeit erreicht, indem ich einen zweiten Durchgang durchgeführt habe, in dem ich diesen Algorithmus wiederholt habe, wobei das Intervall [minRad: maxRad] anhand des Ergebnisses des ersten Durchgangs eingeengt wurde.

Zum Beispiel minRad2 = 0,95 * durchschnittlicher Radius der besten Kreise und maxRad2 = 1,05 * durchschnittlicher Radius der besten Kreise.

Ich hatte bisher ziemlich gute Ergebnisse mit dieser Methode. Es ist jedoch langsam und ziemlich schmutzig. Meine Fragen sind:

Können Sie irgendeinen alternativen Algorithmus verwenden, um dieses Problem sauberer / schneller zu lösen?Oder was würden Sie vorschlagen, um diesen Algorithmus zu verbessern?Glaubst du, ich sollte die generalisierte Hough-Transformation untersuchen?

Vielen Dank für Ihre Antworten und Vorschläge.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage