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

Eri*_*c Q 5 algorithm image-processing

我正在研究一个采用粉末衍射图像并试图找到图像中所有椭圆环的项目.

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

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

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

原始图像 原始图像

阈值距离设置为5 阈值设置为5

阈值距离设定为10 阈值设置为10

Spe*_*tre 2

我对您正在处理的过程没有背景知识,但看起来所有椭圆形(很难说是否真的是椭圆形)都是同心的,因此为了提高准确性,我会尝试:

  1. 找到中心

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

  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(但您仍然可以使用它来进行比例计算)。

    射线

[笔记]

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

另外,这些 QA 可能会有所帮助:

[编辑1]一些进一步的信息

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

部分的

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

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

满的

不管怎样,缩放并不是一个好方法,应该使用偏移(与上一个光线偏移最多+/-几个像素)。如果有更多时间心情的话会尝试一下......

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

越接近中心,平均线中的尖峰就越尖锐、越大。它可以用来更精确地拟合中心(我使用它并发现我在 x 轴上偏离了 1 个像素,这对于手动中心选择来说非常好......)。之后,不需要缩放或移动,因为椭圆形就是圆形。然后只需减去平均线的滑动平均值(浅绿色图)并仅检测正尖峰(蓝色图):

检测

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

界

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

细圆圈