基础知识优先:
Mean Shift分割是一种局部均化技术,对于衰减局部物体的阴影或色调差异非常有用。一个例子胜于许多词:
行动:将每个像素替换为范围r附近且其值在距离d之内的像素的平均值。
平均移位通常需要3个输入:
- 距离功能,用于测量像素之间的距离。通常可以使用欧几里得距离,但可以使用任何其他明确定义的距离函数。在曼哈顿距离有时是另一种有用的选择。
- 半径。该半径范围内的所有像素(根据上述距离测量)将用于计算。
- 价值差异。从半径r内的所有像素中,我们将仅采用值在此差值以内的像素来计算均值
请注意,该算法在边界处定义不充分,因此不同的实现方式会给您带来不同的结果。
我不会在这里讨论繁琐的数学细节,因为没有适当的数学符号就无法显示它们,在StackOverflow中也不可用,并且因为它们可以从其他地方的好的资源中找到。
让我们看一下矩阵的中心:
153 153 153 153
147 96 98 153
153 97 96 147
153 153 147 156
在合理选择半径和距离的情况下,四个中心像素的值将为97(其平均值),并且与相邻像素的值将有所不同。
让我们在Mathematica中进行计算。除了显示实际数字,我们还将显示颜色代码,因此更容易理解正在发生的事情:
矩阵的颜色编码为:
然后我们进行合理的均值平移:
MeanShiftFilter[a, 3, 3]
我们得到:
所有中心元素都相等的位置(等于97,BTW)。
您可以使用“均值移位”进行多次迭代,以尝试获得更均匀的着色。经过几次迭代后,您将获得稳定的非各向同性配置:
目前,应该清楚的是,在选择“均值平移”后,您无法选择获得多少“颜色”。因此,让我们展示如何执行此操作,因为这是您问题的第二部分。
您需要能够预先设置输出集群的数量的是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}}
要么:
这与我们之前的结果非常相似,但是正如您所看到的,现在我们只有三个输出级别。
HTH!