比MultiRANSAC更好的算法在粉末衍射图像中找到椭圆?

时间:2017-01-04 04:12:34

标签: algorithm image-processing

我正在开展一个项目,该项目采用粉末衍射图像并试图找到图像中的所有椭圆环。

我使用的RANSAC算法将椭圆拟合到数据中,然后减去这些点(内点)并继续拟合另一个椭圆,直到内部比率变得足够小。

我的问题是,根据我如何设置阈值距离,它要么应该比应有的椭圆更多,要么不够。

我想知道无论如何要改进RANSAC更准确还是我应该使用更好的算法?

RAW IMAGE Raw Image

阈值距离设置为5 Threshold set to 5

阈值距离设置为10 Threshold set to 10

1 个答案:

答案 0 :(得分:2)

我没有关于你正在处理的过程的背景知识,但看起来像所有椭圆(很难说是否真的是椭圆)是同心的,所以为了提高我会尝试的准确性:

  1. 找到中心

    或其近似值。我们称之为x0,y0并让图像分辨率为xs,ys。您已经知道它的位置(由于您的图像属性的知识)或估计它(扫描一个椭圆并找到穿过整个椭圆的2条线,它们的交点是您的中心)。如果中心不精确,那么结果将更像椭圆形,然后是椭圆形,但无关紧要,您可以重建原始的去噪图像,或者从后面的数据重新计算中心...

  2. (x0,y0)投射光线到(xs-1,0)

    并将图像内容沿着它复制到一些大小为xs+ys的清除行缓冲区,以确保覆盖任何具有保留的中心位置......

  3. 将整个图像与光线整合

    所以投射光线始终从(x0,y0)(xs-1,1),(xs-1,2)...(xs-1,ys-1)然后(xs-2,ys-1),...(0,ys-1)等以覆盖整个图像周长。 找出与原始存储线的比例比(大多数峰必须匹配),并将沿着光线重新调整的图像内容添加到存储的行缓冲区。

    记住每个角度的比例。

    用所用光线的数量覆盖整个图像分割线缓冲区后,你可以通过椭圆环平均切割出更多的情人噪音。现在只需找到其中的峰值。每个峰代表单独的椭圆,其位置在初始光线位置角度给出半径。

    刻度为您提供椭圆/椭圆属性。因此,找到最小和最大刻度,为您提供主轴和短轴的角度...具有峰值位置的刻度本身为您提供轴的大小...所以不需要RANSAC(但您仍然可以将它用于刻度计算)。

    rays

  4. <强> [注释]

    为了避免在平均线中出现,您可以为其中的每个像素添加一个计数,其中包含为每个像素添加了多少光线并将其用于最终分割。

    这些质量保证也可能有所帮助:

    [Edit1]更多信息

    我很好奇所以我试了一下(概念证明)。我将您的图像调整为512x512,使其适合窗口以便于目视检查,并手动将中心设置为(133,285)然后创建所有光线的集成(现在不进行缩放),然后我部分重建图像:

    partial

    太阳像形状是从积分平均线重建的图像,其余是原始图像。你可以看到这两个几乎完全吻合,所以你的椭圆几乎是圆形的(或者是圆形的,我的中心有点偏离)。

    水色图是相对于积分平均线的距离形式中心的强度(y轴)。每个峰代表一个圆。因此,您可以在1D数据中找到圆圈,而不是在2D中。这里完全重建的图像没有任何调试绘图:

    full

    看起来缩放对于这种情况来说并不是一种好方法,而应该使用偏移(最多比前一次光线偏移的+/-几个像素)。如果有更多时间的心情,请试一试......

    [edit2]更精确的中心和更多信息

    您越接近中心,平均线中就会出现更尖锐,更大的尖峰。它可以用来更精确地适应中心(我使用它并发现我在x轴上偏离了1个像素,这对于手动中心选择非常有用......)。之后,由于椭圆是圆圈,因此不需要缩放或移位。然后只需减去平均线的滑动平均值(Aqua图)并仅检测正峰值(蓝图):

    detection

    每个尖峰代表一个圆(半径是距离中心的距离,也是线阵列中的地址,以像素为单位),所以只有阈值强度尖峰和输出圆......

    circles

    应用峰值检测和全精度积分后:

    thin circles