我是新来的,在编程方面有点新手。
我有一个问题。我有一张太阳的照片在bmp文件和16位。图片看起来像白色的圆圈与黑色的背景。
我想找一个圆,并确定它的圆心在x,y坐标系中。
我有这个剧本
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)
当我运行这个程序时,我发现太阳的边缘是一个有中心的圆,但很不准确。请知道你的参数设置HoughCircles模块的精确搜索圆。谢谢
3条答案
按热度按时间qvsjd97n1#
这里的主要问题是为你的半径找到一个好的范围。你可以看看你的图片,猜猜半径。
从你给我的照片,我猜180 - 220将是一个很好的范围。
你的代码看起来像这样:
只要尝试为
minRadius
和maxRadius
找到好的值,这应该可以正常工作。yhuiod9q2#
这是我问题解决办法
w1jd8yoj3#
我想我会附和一个替代的解决方案,以防将来有人偶然发现这个问题。
下面的函数使用
cv2.inRange
代替cv2.Canny
,使用cv2.minEnclosingCircle
代替cv2.moments
。它通过测量候选人的最小包围圆的半径来选择cv2.findContours
找到的最大轮廓。这种过滤有助于拒绝来自例如水印或灰尘的误报,但根据您的需求,您可能希望以不同的方式执行此步骤或完全省略它。该函数返回x,y坐标以及检测到的磁盘的半径,这是我正在进行的项目的要求。
我留下了一些注解的调试语句,如果您发现需要进一步修改,这些语句可能会派上用场。
如果图像包含大量眩光,则可能需要使用更高的阈值。