首先介绍一下基础知识:
Mean Shift分割是一种局部均化技术,对于衰减局部对象的阴影或色调差异非常有用。 举个例子:
将每个像素替换为范围r附近且其值在距离d之内的像素平均值。
平均移位通常需要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}}
或者:
这与我们之前的结果非常相似,但是正如我们所看到的,现在我们只有三个输出级别。