Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

python opencv-finding circle (Sun) , coordinates of center the circle from picture

I am new here and a little bit newbie in programming.

I have one question. I have picture of Sun in bmp file and 16 bit. The picture look as white circle with black backround.

enter image description here

I want to find a circle and identify its center in x,y coordinates.

I have this script

import cv
import numpy as np




orig = cv.LoadImage('sun0016.bmp')

grey_scale = cv.CreateImage(cv.GetSize(orig), 8, 1)
processed = cv.CreateImage(cv.GetSize(orig), 8, 1)

cv.Smooth(orig, orig, cv.CV_GAUSSIAN, 5, 5)
cv.CvtColor(orig, grey_scale, cv.CV_RGB2GRAY)
cv.Erode(grey_scale, processed, None, 10)
cv.Dilate(processed, processed, None, 10)
cv.Canny(processed, processed, 5, 70, 3)
cv.Smooth(processed, processed, cv.CV_GAUSSIAN, 15, 15)

storage = cv.CreateMat(orig.width, 1, cv.CV_32FC3)


cv.HoughCircles(processed, storage, cv.CV_HOUGH_GRADIENT, 1, 16.0, 10, 140)

for i in range(0, len(np.asarray(storage))):
    print "circle #%d" %i
    Radius = int(np.asarray(storage)[i][0][2])
    x = int(np.asarray(storage)[i][0][0])
    y = int(np.asarray(storage)[i][0][1])
    center = (x, y)
    print x,y

    cv.Circle(orig, center, 1, cv.CV_RGB(0, 255, 0), 1, 8, 0)
    cv.Circle(orig, center, Radius, cv.CV_RGB(255, 0, 0), 1, 8, 0)

    cv.Circle(processed, center, 1, cv.CV_RGB(0, 0, 0), -1, 8, 0)
    cv.Circle(processed, center, Radius, cv.CV_RGB(255, 0, 0), 3, 8, 0)

cv.ShowImage("sun0016", orig)
cv.ShowImage("processed", processed)
cv_key = cv.WaitKey(0)

And when I run this I find edge of Sun which is circle with center but very inaccurately. Pls know you setting of parameters HoughCircles module for precise search circles. Thanks

like image 604
Franta Konopnik Avatar asked Dec 19 '25 20:12

Franta Konopnik


1 Answers

The main problem here is finding a good range for your radius. You may have a look at your picture and guess the Radius.

From the Picture you have given I would guess 180 - 220 would be a good range.

Your code would look like:

cv.HoughCircles(processed, storage, cv.CV_HOUGH_GRADIENT, 1, 16.0, 180, 220)

Just try to find good Values for minRadius and maxRadius and this should work fine.

like image 124
Mailerdaimon Avatar answered Dec 22 '25 09:12

Mailerdaimon



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!