有谁可以帮我理解Mean Shift分割实际上是如何工作的?
这是我刚刚编写的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
使用上面的矩阵可以解释Mean Shift分割如何将3个不同的数字水平分开?
答案 0 :(得分:194)
基础知识:
Mean Shift分割是一种局部均匀化技术,对于抑制局部对象中的阴影或色调差异非常有用。 一个例子比许多单词更好:
动作:用范围-r邻域中像素的平均值替换每个像素,其值在距离d内。
Mean Shift通常需要3个输入:
请注意,算法在边界处没有很好地定义,因此不同的实现会在那里给出不同的结果。
我不会在这里讨论血腥的数学细节,因为如果没有适当的数学符号,它们是不可能显示的,在StackOverflow中不可用,也因为它们可以找到from good sources elsewhere。
让我们看一下矩阵的中心:
153 153 153 153
147 96 98 153
153 97 96 147
153 153 147 156
通过合理选择半径和距离,四个中心像素的值将为97(它们的平均值),并且与相邻像素的值不同。
让我们在Mathematica中计算出来。我们将显示颜色编码,而不是显示实际数字,因此更容易理解正在发生的事情:
矩阵的颜色编码为:
然后我们采取合理的Mean Shift:
MeanShiftFilter[a, 3, 3]
我们得到:
所有中心元素相等(97,BTW)。
您可以使用Mean Shift迭代几次,尝试获得更均匀的颜色。经过几次迭代后,您将得到一个稳定的非各向同性配置:
此时,应该清楚的是,您无法选择应用Mean Shift后获得的“颜色”数量。所以,让我们展示一下如何做到这一点,因为这是你问题的第二部分。
您需要提前设置输出群集的数量类似于Kmeans clustering。
它以这种方式为你的矩阵运行:
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}}
或者:
这与我们之前的结果非常相似,但正如您所看到的,现在我们只有三个输出级别。
HTH!
答案 1 :(得分:156)
Mean-Shift分段的工作原理如下:
图像数据转换为要素空间
在您的情况下,您拥有的只是强度值,因此特征空间只是一维的。 (例如,您可能会计算一些纹理特征,然后您的特征空间将是二维的 - 您将根据强度和纹理进行分割)
搜索窗口分布在功能区域
此示例中的窗口数,窗口大小和初始位置是任意的 - 可以根据具体应用进行微调。
Mean-Shift迭代:
1.)计算每个窗口内的数据样本的MEAN
2。)窗口被移位到与之前计算的平均值相等的位置
重复步骤1.)和2.)直到收敛,即所有窗口都已确定在最终位置
结束在相同位置的窗口
根据窗口遍历对数据进行聚类
...例如最终位于“2”位置的窗口遍历的所有数据将形成与该位置关联的集群。
因此,这种分割将(巧合地)产生三组。以原始图像格式查看这些组可能看起来像the last picture in belisarius' answer。选择不同的窗口大小和初始位置可能会产生不同的结果。