35

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

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

预测图像

我对图像处理相对较新,不确定如何实际获得细胞的最终分割。我曾简单地尝试过几种不同的技术——即霍夫圆形变换、水平集、骨架化、轮廓查找——但没有一个能真正做到这一点。我只是没有正确调整参数还是有更好的技术?

顺便说一下,这里是正确的轮廓,以供参考。

正确的轮廓

和原始图像:

在此处输入图像描述

和连续概率图:

连续概率图

4

3 回答 3

59

在边界检测方面做得很好。我曾经研究过类似的分割问题。

理论:

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


实践

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

这是我的建议:

  1. 边缘图中的边缘看起来很厚,定位不好。我建议将非最大抑制或形态细化作为预处理阶段。

  2. 一旦你有更好的本地化边缘,你就会忽略“边缘”像素,只使用“非边缘”像素,我们称它们为“活动”。
    两个相邻的活动像素:它们之间没有“边缘”像素 - 它们应该在一起。因此,immidiate neighbors 的邻接矩阵应该有正整数。
    考虑一条线上的三个像素,两个端点是“活动”像素:如果中间一个是边缘,那么这两个活动像素不应该属于同一个集群 - 邻接矩阵中的相应条目应该是负数。如果中间像素也处于活动状态,则邻接矩阵中的相应条目应该是正的。

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

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

  5. 优化将仅对活动像素进行分区,您可以将其映射回输入图像域,使边缘像素未分配给任何段。

于 2013-10-22T06:18:53.420 回答
2

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

于 2013-11-02T13:12:13.427 回答
1

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

您可以尝试的另一件事是活动轮廓。基本上,您放置一些圆圈,然后它们在图像中移动,直到找到您要查找的内容。

我的最后一个想法是尝试小波变换。这些似乎在挑选图像中的边界和边界方面效果很好。希望这些想法可以帮助您入门。

于 2013-09-29T00:56:27.653 回答