繁体   English   中英

斑点检测的替代算法

[英]An alternative algorithm for blob detection

这是我的实验的示例图像,将处理该图像以查找所有斑点的信息(中心,尺寸等)。 基本上,下面的图像包含一些噪点,一些粗线和一些斑点。

在此处输入图片说明

我的目标是使用图像处理程序包“ Sapera APF”对FPGA进行编程。 Sapera APF是用于对Teledyne DALSA图像采集卡进行编程以执行图像处理的应用程序。 不幸的是,它不允许我们以常规方式编写代码,也不允许使用基本的编码功能(如else语句,循环等),而仅以代码块的形式支持某些内置函数,并且我们只能排列这些块。 仅供参考,这是Sapera支持的功能列表的链接

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

  1. 应用均值滤波器(针对第3步)
  2. 使用自适应阈值化的阈值图像(返回二进制图像)
  3. 通过检查连通性删除线,所有线均连接100像素以上(为了获得更好的连通性,请首先应用滤镜)
  4. 现在,由于仅剩下斑点,因此可以识别其位置( grayvalue=255 ),并在原始图像中拍摄相应的像素。

这是一个简单的算法,在matlab中可以正常工作。 但是真正的问题是,对于第3步(即连通性),我当然必须编写循环到每个像素以检查连通性,而这在Sapera中是无法做到的。 因此,我正在寻找其他更简单的算法来分离图像中的斑点,而无需使用循环和条件语句,以便可以在Sapera中实现它,但是现在我只需要其matlab代码或算法即可。

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

作为解决方法,您可以

  • 将处理限制在感兴趣的区域(垂直条纹一定包含斑点-但您可以忽略侧面);

  • 使用horizo​​ntalSum函数获取图像轮廓,在其中可以找到与斑点相对应的峰(您必须自己对其进行编程,但是数据量大大减少了);

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

考虑到斑点的出色分离,这应该足以为每个斑点划定边界框。

正如您在图像的垂直轮廓图上所看到的那样,峰值检测很容易(前提是要避免横线)。

在此处输入图片说明

而且水平轮廓确实是无缝的。

在此处输入图片说明

为了方便地从点状峰中分离出线路而无需进行许多连接检查,我将:

  • 平滑图像数据(与高斯核卷积)
  • 如果搜索阈值以上的局部最大值(在所有方向上大于圆周偏移),则应对数据进行平滑处理,以使每个对象最多有一个局部最大值
  • 计算每个最大的局部椭圆率(见下文)
  • 仅接受椭圆度较低的局部最大值

如何计算局部椭圆率:

  • 计算数据的第二个中心矩(减去背景),即每个峰周围的数据用x^2y^2xy加权求和,其中x和y是在峰位置的原点坐标。
  • 对角化由[moment_xx,moment_xy; [moment_xy,moment_yy],以获取局部椭圆形状的长轴和短轴长度的度量。
  • 将椭圆率定义为长轴与短轴之比。

在仅具有水平或垂直线而没有对角线的特殊情况下,您也只需计算x^2y^2加权矩,并且仅接受合理相等的矩。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM