Curious_lad
Curious_lad

Reputation: 1

Blurred Circle detection

I am new to opencv and want to detect the center point of these circles. I tried with Hough Circles with thresholding but it doesn't seem to generate good results all the time.

This image is easy to get using contours and threshloding:

This image is easy to get using contours and threshloding

It is harder to do this one:

It is harder to do this one

The thresholding and Hough circle doesn't work with this image:

The thresholding and Hough circle doesn't work with this image

Adding more images for help

Can you suggest any method that will be reliable for all the images?

Upvotes: 0

Views: 495

Answers (1)

Ian Chu
Ian Chu

Reputation: 3143

Since the circle is the only bright thing in the image, we can get the center by looking for the centroid of the white blob. We'll auto-threshold with otsu's and use findContours to get the centroid of the mask.

enter image description here

import cv2
import numpy as np

# load image
img = cv2.imread("circ1.png");
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY);

# threshold
gray = cv2.GaussianBlur(gray, (5,5), 0);
_, mask = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU);

# contour
_, contours, _ = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE);

# center
M = cv2.moments(contours[0]);
cx = int(M['m10']/M['m00']);
cy = int(M['m01']/M['m00']);
center = (int(cx), int(cy));

# draw
img = cv2.circle(img, center, 4, (0,0,200), -1);

# show
cv2.imshow("marked", img);
cv2.imshow("mask", mask);
cv2.waitKey(0);

Upvotes: 6

Related Questions