Detectando pequeños círculos con OpenCV (mala calidad de imagen)

Estoy tratando de detectar los cuatro puntos que puedes ver en el centro de esta imagen: Este se convierte a png, en realidad uso un formato de ppm (después de la conversión de la salida en bruto de la cámara). La imagen procesada real está disponibleaquí

Soy nuevo en OPENV y, por lo tanto, tengo un gran problema al detectar esos puntos. Aquí está mi mejor resultado hasta ahora:

Como puede ver, he detectado 3 de los puntos, pero además de eso, muchas otras cosas en la imagen se reconocen como círculos.

Y aquí está el código:

    IplImage* img;
    if((img = cvLoadImage( "photos/img-000012.ppm", 1)) == 0 )
    {
        perror("cvLoadImage");
        return 1;
    }
    cvNamedWindow( "Image view", 1 );
    cvShowImage( "Image view", img );
//  cvWaitKey(0);

    IplImage* gray = cvCreateImage( cvGetSize(img), 8, 1 ); // allocate a 1 channel byte image
    CvMemStorage* storage = cvCreateMemStorage(0);
    cvCvtColor( img, gray, CV_BGR2GRAY );
    cvShowImage( "Image view", gray );
//  cvWaitKey(0);

    cvSmooth( gray, gray, CV_GAUSSIAN, 3, 3, 0, 0 );
    cvShowImage( "Image view", gray );
    cvWaitKey(0);

    CvSeq* circles = cvHoughCircles(gray, storage, CV_HOUGH_GRADIENT,
            4,      // inverse ratio of the accumulator resolution
            1,      // minimum distance between circle centres
            100,    // higher threshold value for Canny
            20,     // accumulator threshold for the circle centers; smaller->more false circles
            1,  // minimum radius
            10 );   // maximum radius

    printf("circles == %d\n", circles->total);
    int i;
    for (i = 0; i < circles->total; i++) {
        float *p = (float*)cvGetSeqElem(circles, i);
        CvPoint center = cvPoint(cvRound(p[0]),cvRound(p[1]));
        CvScalar val = cvGet2D(gray, center.y, center.x);
        if (val.val[0] < 1) continue;
        printf("%d %d %d\n", cvRound(p[0]),cvRound(p[1]), cvRound(p[2]));
        cvCircle(img,  center, cvRound(p[2]),             CV_RGB(0,255,0), 1, CV_AA, 0);
    }
    cvShowImage( "Image view", img );
    cvWaitKey(0);

¿Tienes alguna idea de cómo ayudar a eso? Estaría muy agradecido. Creo que es bastante fácil para un ojo humano detectar los puntos, así que espero poder detectarlos usando una computadora.

Respuestas a la pregunta(2)

Su respuesta a la pregunta