2015-11-16 55 views
7

我对OpenCV相对较新,而且我没有强大的图像处理背景。目前我正在研究一个项目,编写一个程序来计算图像中显微镜下的所有生物细胞。我已经尝试了各种方法从互联网来源申请计数的形象,但没有一个按预期工作。C++生物细胞计数与OpenCV

一些我所使用的方法是:

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

这是我需要计数细胞总数的图像的一个例子。如果细胞不能并拢

enter image description here

我现在的计数算法效果更好。例如是这样的:

enter image description here

然而,该算法仍未能裂开了在图像的中心粘在一起的3个小区。

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

+2

看一看这个页面:http://stackoverflow.com/questions/5298884/finding-number-of-colored-shapes-from-picture-using -python和http://codegolf.stackexchange.com/questions/40831/counting-grains-of-rice可能类似于你正在寻找的东西! –

+0

是每个单元格的大小相似吗? – Micka

+0

@Micka @Micka每个图像中的像元大小是相似的,但是对于不同的缩放级别存在不同的图像,因此一个图像的像元大小不能应用于另一个图像 – Woody

回答

2

你的方法几乎没有问题。但是,它需要一些额外的步骤。 你需要一个叫做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); 
+0

如何对图像执行打开操作? – Woody

+0

@woody编辑代码 –

+0

我试过你的Opening操作符,并且我将MORPH_RECT更改为MORPH_ELLIPSE,检测比以前更好!但是在细胞未被检测到的地方仍然存在假阴性。计算机视觉中的 – Woody