在边界检测方面做得很好。我曾经研究过类似的分割问题。
理论:
一旦您获得边缘图,其中e(i,j)
指示像素的“边缘”程度,i,j
您希望对图像进行分割,以尽可能尊重边缘图。
为了以更正式的方式制定这种“尊重边缘图”,我建议您查看相关聚类 (CC)功能:
CC 功能根据相邻像素之间的成对关系评估分割的质量是否应该在同一个簇中(它们之间没有边)或在不同的簇中(它们之间有边)。
看一下上述论文第 7.1 节中的示例。
CC 也用于医学(神经元)成像中的类似分割问题,参见例如,在这里。
实践
一旦您说服自己 CC 确实是解决您的问题的合适公式,仍然存在如何将二进制边缘图准确转换为 CC 可以处理的亲和矩阵的问题。请记住,CC 需要一个(通常是稀疏的)邻接矩阵作为输入,其中假设属于同一段的像素对为正项,假设属于不同段的像素对为负项。
这是我的建议:
边缘图中的边缘看起来很厚,定位不好。我建议将非最大抑制或形态细化作为预处理阶段。
一旦你有更好的本地化边缘,你就会忽略“边缘”像素,只使用“非边缘”像素,我们称它们为“活动”。
两个相邻的活动像素:它们之间没有“边缘”像素 - 它们应该在一起。因此,immidiate neighbors 的邻接矩阵应该有正整数。
考虑一条线上的三个像素,两个端点是“活动”像素:如果中间一个是边缘,那么这两个活动像素不应该属于同一个集群 - 邻接矩阵中的相应条目应该是负数。如果中间像素也处于活动状态,则邻接矩阵中的相应条目应该是正的。
考虑所有可能的相邻对和三元组(诱导 24 连接的网格图)允许您构建具有适合 CC 的正负条目的亲和矩阵。
给定一个矩阵,您应该搜索具有最佳 CC 分数的分割(优化阶段)。我在这里有 Matlab 代码。您还可以使用出色的openGM包。
优化将仅对活动像素进行分区,您可以将其映射回输入图像域,使边缘像素未分配给任何段。