计算圆的中心坐标

我是openCV和图像处理的基本运行者。 现在使用openCV像链接文件一样计算白色像素区域的中心点坐标。 但是,我很难找到这个白色圆圈的确切中心。 我认为在找到中心点之前,有一些步骤可以提高它的中心坐标的准确性。 你会与我分享你的想法或任何提示吗? 感谢,并有一个愉快的一天

图片路径:http://blog.naver.com/colorring/220027355998(修改后的路径)

// ------------------------------------------------ -------------------------------------------------- -------------------------
// @@@ 源代码
// ------------------------------------------------ -------------------------------------------------- -------------------------

IplImage * cimgGray = cvCreateImage(cvSize(m_OneimageXresolution,m_OneimageYresolution),IPL_DEPTH_8U,1);

cvCvtColor(m_Leftimg,cimgGray,CV_RGB2GRAY);

cvEqualizeHist(cimgGray,cimgGray); cvShowImage( “cvEqualizeHist”,cimgGray);

double threshold1 = cvThreshold(cimgGray,pImgOutput,150,255,CV_THRESH_BINARY); cvShowImage( “cvThreshold”,pImgOutput);

// ------------------------------------------------ -------------------------------------------------- --------------------------


要以高精度在图像中找到圆或椭圆的中心,应该使用圆的边缘的所有像素。 一个很好的方法是通过“周运营商”,这是这样工作的:

  • 为您的图像创建边缘图(Canny边缘检测器效果很好)

  • 对于边缘图中每个像素行(和列),扫描最亮的像素(边缘响应最强的像素),您应该找到一个亮度峰值进入您的圆圈,另一个亮度峰值(入口峰值,出口峰值)。以子像素精度估计圆的边缘,在两个“峰值”像素周围的边缘图中对像素进行抛物线拟合,在下图中,最高的红点是最亮的边缘像素,符合抛物线,使用微积分来找到零斜率的x值 - 这会为您当前的像素行上的入口点和出口点提供一个子像素位置。 拟合抛物线以边缘映射像素来估计具有亚像素精度的最大响应的位置

  • 接下来,平均你的(子像素)进入和退出点; 这将为您提供一组描述穿过圆心的线条(如下图所示,绿色像素为边缘,红色为中心交叉线上的点)。

  • 使用边缘像素(绿色)查找穿过中心的线条(红色)

  • 此时可以使用回归为步骤3中描述的中线点找到最佳拟合线。 然而,使用RANSAC找到一个良好的共识线,那么只有在最小均方拟合中包括获胜候选人的选民才能将您的准确度提高大约一个数量级(因为扫过这个圆的扫描线有很多由于假设误差的正态分布,所以导致出现中点的异常点会“毒化”直高斯LMS拟合)。
  • 根据圆圈的大小和传感器的质量等因素,您可能会获得1/50像素至1/100像素的误差。


    有多种方法可以解决这个问题。 如果您分享了有关问题域的更多详细信息,这将有所帮助。

    解决该问题的一种简单方法是对(已经几乎是二值的)图像的二值化版本执行“距离变换”,然后搜索最大像素值。

    仅供参考:我必须在链接末尾删除?type = w3以查看图像。


    现在我可以看到你的测试图像了,我建议采取第二种可能的方法 - 我的另一个答案是假设一个由“黑色”或“白色”区域组成的圆圈,其边界清晰且没有真正的渐变。 这意味着远离白色/黑色边界的像素不包含有关圆心的信息,但您的图像并非如此。

    根据您想要定位图像中心的准确程度,您可以考虑使用更多像素的信息的方法,例如可能拟合度数为2的多项式(或样条线,如果抛物线不相当一个足够好的模型)直接映射到强度图中像素的行和列,并将曲线的最大值指向穿过圆心(我的答案中的红色像素)的直线。 因为每个抛物线/样条线都是从很多点构建而成的,所以您应该获得非常好的中心点(各个像素中的噪点将被其邻居大部分取消)。

    所有这一切说,首先尝试最简单的方法,并查看准确性和稳定性是否足够满足您的应用。

    链接地址: http://www.djcxy.com/p/63813.html

    上一篇: Calculate the center coordinate of circle

    下一篇: JavaCV/OpenCV: cvLoadImage not working