我正在开展一个项目,该项目采用粉末衍射图像并试图找到图像中的所有椭圆环。
我使用的RANSAC算法将椭圆拟合到数据中,然后减去这些点(内点)并继续拟合另一个椭圆,直到内部比率变得足够小。
我的问题是,根据我如何设置阈值距离,它要么应该比应有的椭圆更多,要么不够。
我想知道无论如何要改进RANSAC更准确还是我应该使用更好的算法?
RAW IMAGE
阈值距离设置为5
阈值距离设置为10
答案 0 :(得分:2)
我没有关于你正在处理的过程的背景知识,但看起来像所有椭圆(很难说是否真的是椭圆)是同心的,所以为了提高我会尝试的准确性:
找到中心
或其近似值。我们称之为x0,y0
并让图像分辨率为xs,ys
。您已经知道它的位置(由于您的图像属性的知识)或估计它(扫描一个椭圆并找到穿过整个椭圆的2条线,它们的交点是您的中心)。如果中心不精确,那么结果将更像椭圆形,然后是椭圆形,但无关紧要,您可以重建原始的去噪图像,或者从后面的数据重新计算中心...
从(x0,y0)
投射光线到(xs-1,0)
并将图像内容沿着它复制到一些大小为xs+ys
的清除行缓冲区,以确保覆盖任何具有保留的中心位置......
将整个图像与光线整合
所以投射光线始终从(x0,y0)
到(xs-1,1),(xs-1,2)...(xs-1,ys-1)
然后(xs-2,ys-1),...(0,ys-1)
等以覆盖整个图像周长。
找出与原始存储线的比例比(大多数峰必须匹配),并将沿着光线重新调整的图像内容添加到存储的行缓冲区。
记住每个角度的比例。
用所用光线的数量覆盖整个图像分割线缓冲区后,你可以通过椭圆环平均切割出更多的情人噪音。现在只需找到其中的峰值。每个峰代表单独的椭圆,其位置在初始光线位置角度给出半径。
刻度为您提供椭圆/椭圆属性。因此,找到最小和最大刻度,为您提供主轴和短轴的角度...具有峰值位置的刻度本身为您提供轴的大小...所以不需要RANSAC(但您仍然可以将它用于刻度计算)。
<强> [注释] 强>
为了避免在平均线中出现,您可以为其中的每个像素添加一个计数,其中包含为每个像素添加了多少光线并将其用于最终分割。
这些质量保证也可能有所帮助:
[Edit1]更多信息
我很好奇所以我试了一下(概念证明)。我将您的图像调整为512x512
,使其适合窗口以便于目视检查,并手动将中心设置为(133,285)
然后创建所有光线的集成(现在不进行缩放),然后我部分重建图像:
水色图是相对于积分平均线的距离形式中心的强度(y轴)。每个峰代表一个圆。因此,您可以在1D数据中找到圆圈,而不是在2D中。这里完全重建的图像没有任何调试绘图:
看起来缩放对于这种情况来说并不是一种好方法,而应该使用偏移(最多比前一次光线偏移的+/-几个像素)。如果有更多时间的心情,请试一试......
[edit2]更精确的中心和更多信息
您越接近中心,平均线中就会出现更尖锐,更大的尖峰。它可以用来更精确地适应中心(我使用它并发现我在x轴上偏离了1个像素,这对于手动中心选择非常有用......)。之后,由于椭圆是圆圈,因此不需要缩放或移位。然后只需减去平均线的滑动平均值(Aqua图)并仅检测正峰值(蓝图):
每个尖峰代表一个圆(半径是距离中心的距离,也是线阵列中的地址,以像素为单位),所以只有阈值强度尖峰和输出圆......
应用峰值检测和全精度积分后: