相关疑难解决方法(0)

通过迭代自适应阈值处理和形状分析来检测圆形对象的簇

我一直在开发一个应用程序来计算圆形物体,如图片中的细菌菌落.

容易的是这些物体通常与背景明显不同.

但是,很少有困难使分析变得棘手:

  1. 背景将呈现渐变和快速的强度变化.
  2. 在容器的边缘,对象将是椭圆形而不是圆形.
  3. 物体的边缘有时相当模糊.
  4. 对象将聚集.
  5. 物体可以很小(直径6px)
  6. 最终,算法将由不熟悉图像分析的人使用(通过GUI),因此参数必须直观且极少.

这个问题已在科学文献中多次解决并"解决",例如,使用圆形Hough变换或分水岭方法,但我从未对结果感到满意.

这是描述的一个简单的方法是通过获得自适应阈值和分裂前景(如我在描述这个交使用距离变换)的群集对象.

我已经成功地实现了这种方法,但它并不总能处理强度的突然变化.此外,同行们也要求我提出更"新颖"的方法.

因此,我正在寻找一种新方法来提取前景.

因此,我研究了其他阈值/斑点检测方法.我尝试了MSER但发现它们不是很强大而且在我的情况下非常慢.

我最终提出了一种算法,到目前为止,它给了我很好的结果:

  1. 我将图像的三个通道分开并降低噪点(模糊/中值模糊).对于每个频道:
  2. 我通过计算原始通道和卷积(通过大内核模糊)之间的绝对差异来应用自适应阈值处理的第一步的手动实现.然后,对于阈值的所有相关值:
  3. 我对结果应用了一个阈值2)
  4. 找到轮廓
  5. 在授予其形状(尺寸,面积,凸度......)时验证或使轮廓无效
  6. 然后,仅在累加器(每个通道1个累加器)中重新绘制有效的连续区域(由轮廓分隔).
  7. 在累积超过阈值的连续区域之后,我最终得到"地区分数"的映射.强度最高的区域是最常满足形态学过滤标准的区域.
  8. 然后将三个映射(每个通道一个)转换为灰度和阈值(阈值由用户控制)

只是为了向您展示我必须使用的图像类型: 在此输入图像描述 该图片代表顶部3个样本图像的一部分,以及底部各个部分的算法结果(蓝色=前景).

这是我的C++实现:3-7

/*
 * cv::Mat dst[3] is the result of the absolute difference between original and convolved channel.
 * MCF(std::vector<cv::Point>, int, int) is a filter function that returns an positive int only if the input contour is valid.
 */

/* Allocate 3 matrices (1 per channel)*/
cv::Mat accu[3];

/* We define the …
Run Code Online (Sandbox Code Playgroud)

c++ algorithm opencv image-processing openmp

16
推荐指数
1
解决办法
5091
查看次数

标签 统计

algorithm ×1

c++ ×1

image-processing ×1

opencv ×1

openmp ×1