基于边缘像素图的图像分割

时间:2013-09-24 04:24:08

标签: python opencv image-processing edge-detection image-segmentation

我已经在Python中训练了一个分类器,用于将单元格图像中的像素分类为边缘或非边缘。我已经成功地在一些图像数据集上使用它,但是遇到了这个特定数据集的问题,即使对人眼来说也是如此。我不知道任何可以准确分割它的现有自动化技术。

预测后,我得到以下图像:

Prediction image

我对图像处理相对较新,不确定如何继续实际获得细胞的最终分割。我简要地尝试了一些不同的技术 - 即霍夫圆形变换,水平集,骨架化,轮廓发现 - 但没有一个真正完成这个技巧。我只是没有正确调整参数,还是有更好的技术?

顺便提一下,这是正确的大纲,供参考。

Correct outlines

原始图片:

enter image description here

连续概率图:

Continuous probability map

3 个答案:

答案 0 :(得分:55)

非常好的边界检测工作。我曾经处理过类似的细分问题。

理论值:

获得边缘地图后,e(i,j)表示像素i,j的“边缘度”,您希望对图像进行尽可能尊重边缘地图的分割。
为了以更正式的方式制定这个“尊重边缘地图”,我建议你看一下Correlation clustering (CC)功能:
CC功能基于相邻像素之间的成对关系来评估分割的质量,无论它们是否应该在相同的簇(它们之间没有边缘)或不同的簇中(它们之间存在边缘)。 请查看aforementioned论文第7.1节中的示例 CC也用于医学(神经元)成像中的类似分割问题,参见例如here


实践

一旦你说服自己CC确实是适合你的问题的公式,仍然存在如何将二进制边缘映射转换为CC可以处理的亲和度矩阵的问题。请记住,CC需要作为输入(通常为稀疏)邻接矩阵,其中假设属于同一段的像素对为正条目,假定属于不同段的像素对为负条目。

这是我的建议:

  1. 边缘贴图中的边缘看起来很厚,并且没有很好的局部化。我建议将非最大抑制或形态学作为预处理阶段。

  2. 一旦有了更好的局部边缘,就会忽略“边缘”像素,只能使用“非边缘”像素,我们称之为“活动”。
    两个相邻的有效像素:它们之间没有“边缘”像素 - 它们应该在一起。因此,对于移民的居民来说,应该有积极的生活方式 考虑一条线上的三个像素,两个端点是“活动”像素:如果中间的一个是边缘,那么两个活动像素不应属于同一个集群 - 在这一点中,对象矩阵中的相应条目应为负数。如果中间像素也处于活动状态,则对象矩阵中的相应条目应为正数。

  3. 考虑所有可能的相邻对和三元组(诱导24连通网格图)允许您构建一个具有适合CC的正和负条目的亲和度矩阵。

  4. 给定矩阵,您应该搜索具有最佳CC分数的分段(优化阶段)。我有这个here的Matlab代码。您还可以使用优秀的openGM包。

  5. 优化只会产生有效像素的分区,您可以将其映射回输入图像域,将边缘像素保留为未分配给任何分段。

答案 1 :(得分:2)

在分类器中看到边缘/非边缘像素的图片,我们可以看到输入的渐变图像已基本上给出了您所学习的分类器的结果。但是信心图显示了一个很好的解决方案,除了: 1.它们是连接的级别集,具有不同的大小。 2.细胞中有嘈杂的亮点会导致分类器输出错误。 (也许可以考虑一些平滑) 3.我想可能更容易表征每个单元格的内部:灰度变化,平均大小。学习这些分布可能会让您获得更好的检测结果。在拓扑上,我们有一组嵌套在大灰度值中的低灰度值。 要执行此操作,可以将GraphcutsGMM模型用于单位成本和成对项的学习梯度分布

答案 2 :(得分:1)

我认为你的霍夫变换是一个好主意。你应该尝试的一件事(如果你还没有),是threshold你的图像之前你通过你的变换运行它,虽然我刚刚链接的文章似乎只是二进制阈值。这可能会夸大边缘和背景之间的差异,因此可能更容易检测。基本上,对每个像素应用一个函数(以对像素值运算的滤波器的形式)。

你可以尝试的另一件事是active contours。基本上,你放下一些圆圈,然后在图像中移动,直到找到你想要的东西。

我的最后一个想法是尝试wavelet transform。这些似乎在选择图像中的边界和边界方面非常有效。希望这些想法可以帮助你开始。