基于边缘像素图的图像分割[关闭]
- 2025-04-10 09:46:00
- admin 原创
- 15
问题描述:
我用 Python 训练了一个分类器,用于将细胞图像中的像素分类为边缘或非边缘。我已成功将其用于一些图像数据集,但在这个特定数据集上遇到了问题,它甚至在人眼看来都相当模糊。我不知道有任何现有的自动化技术可以准确地对其进行分割。
经过预测我得到以下图像:
我对图像处理还比较陌生,不确定如何真正获得细胞的最终分割。我曾短暂尝试过几种不同的技术 - 即霍夫循环变换、水平集、骨架化、轮廓查找 - 但都没有真正奏效。我只是没有正确调整参数,还是有更好的技术?
顺便说一下,这是正确的大纲,供参考。
原始图片如下:
以及连续概率图:
解决方案 1:
在边界检测方面做得非常好。我以前也研究过类似的分割问题。
理论:
一旦获得了边缘图,其中e(i,j)
表示像素的“边缘性”程度,i,j
您希望图像的分割尽可能尊重边缘图。
为了以更正式的方式制定这种“尊重边缘图”,我建议您查看相关聚类 (CC)函数:
CC 函数根据相邻像素之间的成对关系评估分割的质量,无论它们应该在同一个簇中(它们之间没有边缘)还是在不同的簇中(它们之间有边缘)。
请查看上述论文第 7.1 节中的示例。CC
也用于医学(神经元)成像中的类似分割问题,例如,请参见此处。
实践
一旦你确信 CC 确实是适合你的问题的公式,那么还有一个问题,即如何将二进制边缘图准确地转换为 CC 可以处理的亲和力矩阵。请记住,CC 需要一个(通常是稀疏的)邻接矩阵作为输入,其中假设属于同一片段的像素对具有正项,假设属于不同片段的像素对具有负项。
这是我的建议:
边缘图中的边缘看起来相当厚,定位不太好。我建议使用非最大抑制或形态细化作为预处理阶段。
一旦你有了更好的局部边缘,你就可以忽略“边缘”像素,只处理“非边缘”像素,我们称它们为“活动”。
两个相邻的活动像素:它们之间没有“边缘”像素 - 它们应该在一起。因此,相邻像素的邻接矩阵应该具有正整数。
考虑一条线上的三个像素,两个端点是“活动”像素:如果中间的像素是边缘,那么两个活动像素不应该属于同一个簇 - 邻接矩阵中的相应条目应该是负数。如果中间像素也是活动的,那么邻接矩阵中的相应条目应该是正数。
考虑所有可能的相邻对和三元组(诱导 24 连通网格图)允许您构建适合 CC 的具有正项和负项的亲和力矩阵。
给定一个矩阵,您应该搜索具有最佳 CC 分数的分割(优化阶段)。我这里有用于此目的的 Matlab 代码。您也可以使用出色的openGM包。
优化将仅产生活动像素的分区,您可以将其映射回输入图像域,而将边缘像素保留为未分配给任何段。
解决方案 2:
查看分类器中的边缘/非边缘像素的图片,我们可以看到输入的梯度图像基本上已经给出了您所学分类器的结果。但是置信度图显示了一个很好的解决方案,除了:1.它们是连接的水平集,大小各异。2.单元格中有嘈杂的亮点,导致分类器输出错误。(也许可以考虑一些平滑处理)3.我想描述每个单元格的内部特征可能更容易:灰度变化、平均大小。学习这些分布可能会让您获得更好的检测结果。拓扑上,我们有一组嵌套在大灰度值中的低灰度值。要执行此操作,可以使用带有GMM模型的Graphcuts作为单位成本,并使用学习到的梯度分布作为成对项
解决方案 3:
我认为你的霍夫变换是个好主意。你应该尝试的一件事(如果你还没有尝试过)是在对图像进行变换之前对其进行阈值处理,尽管我刚刚链接的文章似乎只是二元阈值处理。这可能会夸大边缘和背景之间的差异,因此可能更容易检测到。基本上,对每个像素应用一个函数(以对像素值进行操作的过滤器的形式)。
您还可以尝试使用活动轮廓。基本上,您放置一些圆圈,它们会在图像中移动,直到找到您要查找的内容。
我的最后一个想法是尝试小波变换。这些变换似乎在识别图像中的边界和边框方面非常有效。希望这些想法能帮助你入门。
扫码咨询,免费领取项目管理大礼包!