使用均值平移的图像分割如何实现?
0 964
0

谁能帮助我了解“均值漂移”细分实际上是如何工作的?

这是我制作的8x8矩阵

  103  103  103  103  103  103  106  104   
  103  147  147  153  147  156  153  104   
  107  153  153  153  153  153  153  107   
  103  153  147  96   98   153  153  104   
  107  156  153  97   96   147  153  107   
  103  153  153  147  156  153  153  101   
  103  156  153  147  147  153  153  104   
  103  103  107  104  103  106  103  107

可以使用上面的矩阵解释均值移位分割如何将3个不同级别的数字分开吗?

收藏
2021-03-17 14:37 更新 正直的烤面包 •  4004
共 1 个回答
高赞 时间
0
首先介绍一下基础知识:

Mean Shift分割是一种局部均化技术,对于衰减局部对象的阴影或色调差异非常有用。 举个例子:

将每个像素替换为范围r附近且其值在距离d之内的像素平均值。

平均移位通常需要3个输入:

  1. 距离函数,用于测量像素之间的距离。 通常可以使用欧几里得距离,但可以使用任何其他定义明确的距离函数。 有时也可以选用曼哈顿距离。

  2. 半径。 将计算此半径范围内的所有像素(根据上述距离测量)。

  3. 值的差。 从半径r内的所有像素中,我们将仅取那些值在此差之内的像素来计算均值

注意,该算法在边界处定义不充分,因此不同的实现方式会带来不同的结果。我们不再讨论繁琐的数学细节。

让我们看一下矩阵的中心:

153  153  153  153 
147  96   98   153 
153  97   96   147   
153  153  147  156  

在合理选择半径和距离的情况下,四个中心像素的值将为97(其平均值),并且与相邻像素的值将有所不同。

让我们在Mathematica中进行计算。 除了显示实际数字,我们还将显示颜色编码,因此更容易理解正在发生的事情:

矩阵的颜色编码为:

然后我们进行合理的均值平移:

MeanShiftFilter[a, 3, 3]

我们得到:

所有中心元素都相等(等于97,BTW)。

你可以使用Mean Shift进行多次迭代,从而获得更均匀的着色。 经过几次迭代后,可以获得一个稳定的非各向同性配置:

目前,应该清楚的是,在应用均值平移后,无法选择获得“颜色”的数量。 因此,让我们展示如何执行此操作,这就是你的问题的第二部分。

你需要能够预先设置输出集群的数量的是Kmeans集群

对于你的这个矩阵,它以这种方式运行:

b = ClusteringComponents[a, 3]

{{1, 1, 1, 1, 1, 1, 1, 1}, 
 {1, 2, 2, 3, 2, 3, 3, 1}, 
 {1, 3, 3, 3, 3, 3, 3, 1}, 
 {1, 3, 2, 1, 1, 3, 3, 1}, 
 {1, 3, 3, 1, 1, 2, 3, 1}, 
 {1, 3, 3, 2, 3, 3, 3, 1}, 
 {1, 3, 3, 2, 2, 3, 3, 1}, 
 {1, 1, 1, 1, 1, 1, 1, 1}}  

或者:

这与我们之前的结果非常相似,但是正如我们所看到的,现在我们只有三个输出级别。

参考https://stackoverflow.com/a/4835340/15018571

收藏
2021-03-17 14:54 更新 阿托 •  17069