基于边缘像素图的图像分割
Posted
技术标签:
【中文标题】基于边缘像素图的图像分割【英文标题】:Image segmentation based on edge pixel map [closed] 【发布时间】:2013-09-29 03:46:01 【问题描述】:我已经在 Python 中训练了一个分类器,用于将细胞图像中的像素分类为边缘或非边缘。我已经在一些图像数据集上成功使用了它,但是在这个特定的数据集上遇到了问题,即使在人眼看来也很模糊。我不知道任何现有的可以准确分割它的自动化技术。
预测后得到如下图:
我对图像处理比较陌生,不确定如何继续实际获得细胞的最终分割。我曾简单地尝试过几种不同的技术——即霍夫循环变换、水平集、骨架化、轮廓查找——但没有一个能真正做到这一点。我只是没有正确调整参数还是有更好的技术?
顺便说一下,这里是正确的轮廓,供参考。
还有原图:
以及连续概率图:
【问题讨论】:
如果你能发布你正在处理的原始图像会更好。 我已经添加了原件。 在此使用关卡集似乎是个好主意。你是如何初始化初始零水平集的,你进化了多少水平集?请注意,关卡集需要大量调整才能正常工作。 您是如何获得具有正确轮廓的图像的? 你的预测怎么样?你能得到连续概率图像而不是二值图像吗? 【参考方案1】:在边界检测方面做得很好。我曾经研究过类似的分割问题。
理论:
一旦您获得边缘图,其中e(i,j)
表示像素i,j
的“边缘”程度,您希望对图像进行分割,以尽可能尊重边缘图。
为了以更正式的方式制定此“尊重边缘图”,我建议您查看 Correlation clustering (CC) 函数式:
CC 功能根据相邻像素之间的成对关系来评估分割的质量,无论它们应该在同一个簇中(它们之间没有边缘)还是在不同的簇中(它们之间有边缘)。
查看aforementioned 论文第 7.1 节中的示例。
CC 也用于医学(神经元)成像中的类似分割问题,例如,参见 here。
练习
一旦您说服自己 CC 确实是解决您的问题的合适公式,仍然存在如何将二进制边缘图准确转换为 CC 可以处理的亲和矩阵的问题。请记住,CC 需要一个(通常是稀疏的)邻接矩阵作为输入,其中假设属于同一段的像素对为正项,假设属于不同段的像素对为负项。
这是我的建议:
边缘图中的边缘看起来很粗,并且定位不好。我建议将非最大抑制或形态细化作为预处理阶段。
一旦您有了更好的本地化边缘,您就可以忽略“边缘”像素,只使用“非边缘”像素,我们称它们为“活动”。 两个相邻的活动像素:它们之间没有“边缘”像素——它们应该在一起。因此,immidiate neighbors 的邻接矩阵应该有正整数。 考虑一条线上的三个像素,两个端点是“活动”像素:如果中间一个是边缘,那么这两个活动像素不应该属于同一个集群 - 邻接矩阵中的相应条目应该是负数。如果中间像素也处于活动状态,则邻接矩阵中的相应条目应该是正数。
考虑所有可能的相邻对和三元组(诱导 24 连接的网格图)允许您构建具有适合 CC 的正负条目的亲和矩阵。
给定一个矩阵,您应该搜索具有最佳 CC 分数的分割(优化阶段)。我有这个here 的 Matlab 代码。您还可以使用出色的openGM 包。
优化将仅对活动像素进行分区,您可以将其映射回输入图像域,使边缘像素未分配给任何片段。
【讨论】:
这个很有趣,我一定会试试的。我添加了一个连续概率图 - 对于如何将这些概率合并到亲和矩阵中,您有什么建议吗? @AnnaThomas 不久前我也遇到过类似的问题。很遗憾地告诉你,我没有成功地让它工作。不过,你可能会更幸运。我认为细化概率图是重要的一步。然后,您可以使用概率来为预期边界不同侧的像素分配可能性。我在回答中引用的论文讲述了如何将概率转换为负亲和力。 @a_tom 有什么消息或进展吗?您是在研究这个问题还是转向更具挑战性的领域?【参考方案2】:在分类器中看到边缘/非边缘像素的图片,我们可以看到你输入的梯度图像已经基本给出了你学习过的分类器的结果。但是置信度图显示了一个很好的解决方案,除了: 1.它们是连接的levelset,大小不一。 2. 单元格中有嘈杂的亮点,导致分类器输出错误。 (也许可以考虑一些平滑) 3. 我想描述每个单元的内部可能会更容易:灰度变化,平均大小。学习这些分布可能会给你带来更好的检测结果。在拓扑上,我们有一组嵌套在大灰度值中的低灰度值。 要执行此操作,可以使用 Graphcuts 和 GMM 模型作为单一成本,并使用学习梯度分布作为成对项
【讨论】:
【参考方案3】:我认为你的霍夫变换是个好主意。您应该尝试的一件事(如果您还没有尝试),是在您通过转换运行它之前threshold 您的图像,尽管我刚刚链接的文章似乎只是二进制阈值。这可能会夸大边缘和背景之间的差异,因此可能更容易检测到。基本上,将一个函数(以对像素值进行操作的过滤器的形式)应用于每个像素。
您可以尝试的另一件事是active contours。基本上,您可以放置一些圆圈,然后它们会在图像中移动,直到找到您要查找的内容。
我最后的想法是尝试wavelet transform。这些似乎在挑选图像中的边界和边界方面效果很好。希望这些想法可以帮助您入门。
【讨论】:
小波变换听起来不错...提供一些细节:我最终得到了 cython 和旧代数 @cox 嗯,我不确定我是否理解您的评论。您是否要求更多详细信息? 是的,你使用 scipy builtin 还是其他一些 lib/module?我使用 scipy 的结果很差,而更高级的代码在 python 中需要几天时间。以上是关于基于边缘像素图的图像分割的主要内容,如果未能解决你的问题,请参考以下文章