【问题标题】:C++ Biological Cell Counting with OpenCV使用 OpenCV 进行 C++ 生物细胞计数
【发布时间】:2016-02-17 04:48:31
【问题描述】:

我对 OpenCV 比较陌生,而且我没有很强的图像处理背景。目前我正在做一个项目来编写一个程序来计算图像中显微镜下的所有生物细胞。我已经尝试了来自 Internet 资源的各种方法来对图像应用计数,但它们都没有达到预期的效果。

我使用的一些方法是:

  1. 查找过滤图像的轮廓。 (不适用于靠得很近的单元格)
  2. 高斯模糊并在图像上找到局部最大值。 (和1一样的问题)
  3. Canny Edge 检测(输出结果检测非单元格段)

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

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

但是,该算法仍然无法拆分图像中心粘在一起的 3 个单元格。

那么我可以做些什么来检测图像中的细胞总数,使假阴性/阳性最少?

【问题讨论】:

  • 查看此页面:stackoverflow.com/questions/5298884/…codegolf.stackexchange.com/questions/40831/… 可能与您正在寻找的内容相似!
  • 每个单元格的大小是否相似?
  • @Micka 每个图像中的单元格大小相似,但不同的缩放级别有不同的图像,因此一个图像的单元格大小不能应用于另一张图像
  • @Woody:我的意思是在一个图像中是否所有单元格都具有相似的大小。您可以使用该信息来确定您检测到的一个单元格是否可能是两个相互接触的单元格。
  • @Micka 抱歉回复晚了。一张图像中的所有单元格都应该具有相似的大小,您的意思是我可以使用单元格大小区域来确定大轮廓中的单元格数量吗??

标签: c++ opencv cell counting


【解决方案1】:

您的方法几乎没问题。但是,它需要一些额外的步骤。 你需要一个叫Morphological Operations的东西。

  1. 以您认为好的方式过滤您的图像。
  2. 根据颜色应用阈值或将其转换为灰色,然后设置阈值。附言从您提供的示例来看,您的单元格颜色似乎太饱和了。因此,您可以将其转换为 HSV 空间,然后使用 S 通道对其进行阈值处理(在此处告诉我您是否需要帮助)。
  3. 在阈值图像上应用Opening 形态运算符。附言您可以尝试一些内核大小并选择最好的。
  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);

【讨论】:

  • 如何对图像进行开运算??
  • 我试过你的Opening算子,我把MORPH_RECT改成MORPH_ELLIPSE,检测比以前好多了!但是在没有检测到细胞的地方仍然存在假阴性。
  • 在计算机视觉中没有 100% 正确的结果。会有误报和错过真正的圈子。但是,您可以发布您得到的结果,以便我可以帮助减少误报,但不要取消所有误报
  • 请参考下图:1)处理后的图像:link 2)标记的图像:link 原始图像是标记图像中没有那些点标签的图像
  • 正如我所见,问题出在彼此非常接近的单元格中。当您试图获得 100% 的结果时,您可能无法仅使用形态学运算来解决它。但是,尝试使用阈值。设置为 1 的迭代次数和设置为 5 的内核大小。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-30
  • 1970-01-01
  • 1970-01-01
  • 2016-08-01
  • 1970-01-01
  • 2018-02-17
相关资源
最近更新 更多