Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Detecting Circle Using Hough Transform

I'm trying to detect circles with using hough transform.

enter image description here

With my current code I can detect the one below

enter image description here

But I want to find black hole inside the circle I've detected. however changing parameters of houghcircle method is not helped me. Actually it found circles that are not exist.

enter image description here

Also I've tried crop the circle I've found and do another hough transform on this new part it also didn't help me.

here is my code

#include <stdio.h>
#include <iostream>
#include "opencv2/core/core.hpp"
#include "opencv2/features2d/features2d.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/calib3d/calib3d.hpp"
#include "opencv2/nonfree/nonfree.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/opencv.hpp"  // needs imgproc, imgcodecs & highgui
using namespace cv;
using namespace std;

int main(int argc, char** argv)
{
    Mat src, circleroi;

    /// Read the image
    src = imread( "/Users/Rodrane/Documents/XCODE/test/mkedenemeleri/alev/delikli/gainfull.jpg", 2 );


    /// Convert it to gray
//    cvtColor( src, src_gray, CV_BGR2GRAY );
       /// Reduce the noise so we avoid false circle detection
   GaussianBlur( src, src, Size(3, 3), 2, 2 );
   // adaptiveThreshold(src,src,255,CV_ADAPTIVE_THRESH_MEAN_C,CV_THRESH_BINARY,9,14);
    vector<Vec3f> circles,circlessmall;
 //   Canny( src, src, 50  , 70, 3 );
       /// Apply the Hough Transform to find the circles
    HoughCircles( src, circles, CV_HOUGH_GRADIENT, 1, src.rows/8, 200, 100, 0, 0 );

    /// Draw the circles detected
    for( size_t i = 0; i < circles.size(); i++ )
    {
        Point center(cvRound(circles[i][0]), cvRound(circles[i][4]));
        int radius = cvRound(circles[i][5]);
        // circle center
     circle( src, center, 3, Scalar(0,255,0), -1, 8, 0 );
       //  circle outline
      circle( src, center, radius, Scalar(0,255,0), 3, 8, 0 );

         circleroi = src(Rect(center.x - radius, // ROI x-offset, left coordinate
                                        center.y - radius, // ROI y-offset, top coordinate
                                        2*radius,          // ROI width
                                        2*radius));



  //      imshow( "Hough Circle Transform Demo", circleroi );


}

  resize(src, src, Size(src.cols/2, src.rows/2));
//   threshold( circleroi, circleroi, 50, 255,CV_THRESH_BINARY );

  //  cout<<circleroi<<endl;
    imshow("asd",src);

   //    imwrite("/Users/Rodrane/Documents/XCODE/test/mkedenemeleri/alev/cikti/deliksiz.jpg",circleroi);


    waitKey(0);
    return 0;
}

Update: since hough uses canny inside I'm manually used canny to see wether it finds the circle or not.

here canny results with Canny(src,src, 100, 200,3); enter image description here

thank you

like image 938
Anar Bayramov Avatar asked Mar 03 '15 08:03

Anar Bayramov


People also ask

What algorithm is used to detect circles?

Automatic circle detection is an important element of many image processing algorithms. Traditionally the Hough transform has been used to find circular objects in images but more modern approaches that make use of heuristic optimisation techniques have been developed.

How do you identify a circle?

In order to detect the circles, or any other geometric shape, we first need to detect the edges of the objects present in the image. The edges in an image are the points for which there is a sharp change of color. For instance, the edge of a red ball on a white background is a circle.

How can lines be detected using Hough transform?

If two edge points lay on the same line, their corresponding cosine curves will intersect each other on a specific (ρ, θ) pair. Thus, the Hough Transform algorithm detects lines by finding the (ρ, θ) pairs that have a number of intersections larger than a certain threshold.

What is the dimensionality of the parameter space for detecting circles using the Hough transform?

Three dimensions are used for circles, four dimensions are used for parabolas, and five dimensions are used for ellipses. The transform is implemented by quantizing the Hough parameter space into finite intervals or accumulator cells.


1 Answers

You're setting one of the HoughCircles parameters minDist = src.rows/8, which is fairly large. The docs explain:

minDist – Minimum distance between the centers of the detected circles. If the parameter is too small, multiple neighbor circles may be falsely detected in addition to a true one. If it is too large, some circles may be missed.

The method can't return both the circle that it does find and the circle that you want, since they have nearly the same center (to within src.rows/8), just different sizes. If you set maxRadius to a value around 30 in order to exclude the larger circle, do you get the desired smaller circle?

like image 132
Chris Culter Avatar answered Oct 03 '22 10:10

Chris Culter