2014-06-11 101 views
-2

我是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);

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

+0

我们没有对图像的访问权限。请将其上传到其他地方。 –

+1

查看opencv支持的时刻计算结果 –

+1

您还没有写过如何尝试找到该坐标中心。你为此编写了自己的函数还是从OpenCV尝试了一个函数?如果是后者,那么你使用了哪个函数?如果你写了你自己的函数,你使用了哪种数学方法? – KjMag

回答

0

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

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

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

+0

感谢您的信息DrPepperJo。我会尽力去做。 – MichaelH

1

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

  1. 创建图像(Canny边缘检测效果很好)边缘图

  2. 对于每一行(和在边缘映射中的像素点,扫描最亮的像素(具有最强边缘响应的像素),您应该找到一个亮度峰值进入您的圆圈,一个亮度峰值离开(入口峰值,出口峰值) 要估计你的圆圈具有亚像素精度,在两个“峰值”像素周围的边缘映射中对像素进行抛物线拟合,在下图中,最高的红点是最亮的边缘像素,符合抛物线,使用微积分找到具有零斜率的x值 - 这会为您提供当前像素行上的入口点和出口点的子像素位置。 Fitting a parabola to edge-map pixels to estimate the location with maximal response with sub-pixel accuracy

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

Using edge pixels (green) to find lines passing through the center (red)

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

    +0

    到。爱德华。非常有用的描述为我的理解计算它的原则。非常感谢你^^ – MichaelH

    +0

    不客气,祝你好运! –

    0

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

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

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