我是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)
要在图像中以高精度查找圆或椭圆的中心,应使用圆边缘的所有像素。一个很好的方法是通过" Zhou运算符",它的工作原理如下:
为图像创建边缘贴图(Canny边缘检测器效果很好)
对于边缘图中像素的每一行(和一列),扫描最亮的像素(边缘响应最强的像素。您应该找到一个亮度峰进入您的圆圈,一个离开(进入峰值) ,退出高峰)。 要以亚像素精度估计圆的边缘,请将抛物线拟合到两个峰值周围的边缘图中的像素上。像素。在下图中,最高的红点是最亮的边缘像素。在拟合抛物线后,使用微积分找到零斜率的x值 - 这为您提供了当前像素行上的入口和出口点的子像素位置。
接下来,平均您的(子像素)进入和退出点;这将为您提供一组点,用于描述穿过圆心的线条(如下图所示,边缘为绿色像素,中心交叉线为红色点)。
根据圆的大小和传感器的质量等,您可能会获得大约1/50到1/100像素的错误。
答案 1 :(得分:0)
有多种方法可以解决这个问题。如果您分享了有关问题域的更多详细信息,将会有所帮助。
解决问题的一种简单方法是在(已经几乎是二进制)图像的二值化版本上运行“距离变换”,然后搜索最大像素值。
仅供参考:我必须删除链接末尾的?type = w3才能看到图片。
答案 2 :(得分:0)
现在我可以看到你的测试图像,我建议采用第二种方法 - 我的另一个答案是假设一个圆圈由"黑色"或"白色"具有明确定义的边缘,没有真正的渐变。这意味着远离白/黑边界的像素不包含有关圆心的信息,但这与您的图像不同。
根据您想要定位图像中心的准确程度,您可能会考虑使用更多像素的信息的方法,也许是拟合度数为2的多项式(或样条,如果抛物线不是& #39; t相当好的模型)直接到强度贴图中像素的行和列,并使曲线的最大值指向穿过圆心的线(我的答案中的红色像素) 。因为每个抛物线/样条曲线都是从许多点构建的,所以你应该得到非常好的中心点(单个像素中的噪声很大程度上会被邻居消除)。
所有这些都说,首先尝试最简单的方法,看看准确性和稳定性是否足以满足您的应用。