You can try the following:
- image threshold
- get the greatest contour
- find the minimum circle circle that covers this contour
Once you find the center and radius, it will be easier to register. If the radius is different between snapshots, you will have to resize all the circles to a predetermined size and adjust the center accordingly at the registration stage.
I tried this in OpenCV and C ++.
Mat im = imread(INPUT_FOLDER_PATH + string("SoFi_400_20141023_163450.jpg")); Mat gray; cvtColor(im, gray, CV_BGR2GRAY); Mat bw; threshold(gray, bw, 0, 255, CV_THRESH_BINARY|CV_THRESH_OTSU); vector<vector<Point>> contours; vector<Vec4i> hierarchy; findContours(bw, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE, Point(0, 0)); for(int idx = 0; idx >= 0; idx = hierarchy[idx][0]) { Point2f center; float radius; minEnclosingCircle(contours[idx], center, radius); cout << idx << " (" << center.x << ", " << center.y << ") : " << radius << endl; circle(im, Point(center.x, center.y), radius, Scalar(0, 255, 255), 2); } imshow("", im); waitKey();
Some results:


source share