用于斑点检测的替代算法

时间:2014-06-24 08:06:51

标签: image algorithm matlab image-processing detection

这是我的实验的样本图像,用于查找所有斑点的信息(中心,尺寸等)。基本上下面的图像包含一些噪音,几条粗线,当然还有一些斑点。

enter image description here

我的目标是使用图像处理软件包" Sapera APF"对FPGA进行编程。 Sapera APF是一个用于编程Teledyne DALSA图像处理器以执行图像处理的应用程序。不幸的是,它不允许我们以传统的方式编写代码,也不允许使用基本的编码功能(如果是else语句,循环等)但只支持代码块形式的一些内置函数,我们只能安排这些块。 仅供参考,这是Sapera支持的功能列表link

现在,我的第一个目标是在matlab上测试我的算法,然后在Sapera上实现它。这是我在matlab中的方法:

  1. 应用均值滤波器(步骤3)
  2. 使用自适应阈值处理(返回二进制图像)的阈值图像
  3. 通过检查连接来删除线路,所有线路都连接了100个像素以上(为了更好的连接性,首先应用了滤波器)
  4. 现在因为只剩下斑点,所以确定了它们的位置(使用grayvalue=255)并在原始图像中拍摄了相应的像素。
  5. 这是一个在matlab中工作正常的简单算法。但真正的问题是,对于步骤3(即连接),当然我必须写入循环到每个像素检查连接,这不能在Sapera中完成。所以我正在寻找一些其他更简单的算法来分离我的图像中的blob,而不使用循环和条件语句,这样它就可以在Sapera中实现,但现在我只需要它的matlab代码或算法。

2 个答案:

答案 0 :(得分:1)

看起来,所有Sapera操作都属于点对点或邻域操作系列(=图像处理),并且几乎没有什么可以帮助您分割出blob。 (实际上,没有任何函数可以返回“少量的东西”;它们都返回完整的图像或标量值。)

作为一种解决方法,您可以

  • 限制对感兴趣区域的处理(垂直条纹肯定包含斑点 - 但您可以忽略边缘);

  • 使用horizo​​ntalSum函数获取一个图像配置文件,您可以在其中找到与blob对应的峰值(您必须自己编程,但数据量会大大减少);

  • 同样,使用verticalSum查找水平限制。

鉴于blob的优异分离,这应该足以划定每个blob的边界框。

正如您在图像垂直剖面图中看到的那样,峰值检测很容易(假设您避开了侧线)。

enter image description here

水平轮廓非常无缝。

enter image description here

答案 1 :(得分:0)

为了方便地将线条与点状峰值分开而没有多次连接检查,我会:

  • 平滑图像数据(与高斯内核卷积)
  • 在阈值以上搜索局部最大值(大于所有方向的环绕速度),数据应该平滑得多,然后每个对象最多有一个局部最大值
  • 计算每个最大值的局部椭圆度(见下文)
  • 仅接受椭圆度低的局部最大值

如何计算局部椭圆度:

  • 计算数据上的第二个中心矩(减去背景),即使用x^2y^2xy对每个峰值周围的数据进行加权求和,其中x和y是与起源于最高位置。
  • 对角矩阵进行对角化[moment_xx,moment_xy; moment_xy,moment_yy]获取局部椭圆形的大轴和短轴长度的度量。
  • 将椭圆度定义为较大轴与较小轴的比率。

在只有水平或垂直但从不对角线的特殊情况下,您还可以计算x^2y^2加权时刻,并且只接受相当平等的那些。