使用OpenCV进行C++生物细胞计数

Woo*_*ody 8 c++ opencv counting cell

我对OpenCV比较陌生,而且我没有强大的图像处理背景.目前我正在开展一个项目来编写一个程序来计算图像中显微镜下的所有生物细胞.我尝试过各种来自互联网资源的方法来对图像应用计数,但它们都没有像预期的那样运行良好.

我使用的一些方法是:

  1. 查找过滤图像的轮廓.(对于靠得很近的细胞不起作用)
  2. 高斯模糊并在图像上找到局部最大值.(与1相同的问题)
  3. Canny边缘检测(输出结果检测非细胞区段)

这是我需要计算单元格总数的图像示例.

在此输入图像描述

如果单元格不靠近,我当前的计数算法效果会更好.例如这样:

在此输入图像描述

然而,该算法仍然无法将在图像中心粘在一起的3个单元分开.

那么我该怎样做才能检测到图像中的细胞总数最少为假阴性/阳性?

Hum*_*awi 2

你的方法几乎没问题。但是,它需要一些额外的步骤。您需要一种称为形态运算的东西。

  1. 按照你认为好的方式过滤你的图像。
  2. 根据颜色应用阈值或将其转换为灰色然后对其进行阈值设置。PS从您提供的示例来看,您的单元格颜色似乎太饱和了。因此,您可以将其转换为 HSV 空间,然后使用 S 通道对其进行阈值处理(如果您需要帮助,请告诉我)。
  3. 在阈值图像上应用开放形态算子。PS您可以尝试几个内核大小并选择最好的。
  4. 画出轮廓并做你正在做的事情。

开幕:

cv::Mat element = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(5, 5), cv::Point(1, 1));
cv::morphologyEx(img, img, cv::MORPH_OPEN, element, cv::Point(-1, -1), 1);
Run Code Online (Sandbox Code Playgroud)