基础知识第一:
均值漂移分割是局部均匀化技术,其是用于局部对象阻尼阴影或色调的差异是非常有用的。 一个例子是比许多话更好:
操作:替换每个像素具有一介于-R附近的像素的平均值和其值是一个距离d内。
均值漂移通常需要3个输入:
- 用于测量像素之间的距离的距离函数。通常可以使用欧几里得距离,但可以使用任何其他明确定义的距离函数。有时候Manhattan Distance是另一个有用的选择。
- 半径。该半径内的所有像素(根据上述距离测量)将计入该计算。
- 值差异。从半径r内的所有像素中,我们将只取那些在这个差值内的值来计算平均值
请注意算法在边界处没有很好的定义,所以不同的实现会给你不同的结果。
我不会在这里讨论血淋淋的数学细节,因为如果没有适当的数学符号,它们是不可能显示的,在StackOverflow中不可用,还因为它们可以在from good sources elsewhere找到。
让我们看看你的矩阵中心:
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 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!
三个层次?我看到的数字大约在100和150左右。 – John 2011-01-28 19:05:23
作为一个分段,我认为中间的数字将远离要包含在边界的边界数字。这就是为什么我说3. 我可能是错的,因为我真的不明白这种类型的segmenation如何工作。 – Sharpie 2011-01-28 19:12:10
哦...也许我们正在采取不同的意思。都好。 :) – John 2011-01-28 19:15:39