使用Mean Shift解释图像分割

时间:2011-01-28 18:36:34

标签: algorithm image image-processing image-segmentation

有谁可以帮我理解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个不同的数字水平分开?

2 个答案:

答案 0 :(得分:194)

基础知识:

Mean Shift分割是一种局部均匀化技术,对于抑制局部对象中的阴影或色调差异非常有用。 一个例子比许多单词更好:

enter image description here

动作:用范围-r邻域中像素的平均值替换每个像素,其值在距离d内。

Mean Shift通常需要3个输入:

  1. 用于测量像素之间距离的距离函数。通常可以使用欧几里德距离,但可以使用任何其他明确定义的距离函数。 Manhattan Distance有时是另一个有用的选择。
  2. 半径。此半径内的所有像素(根据上述距离测量)将计算在内。
  3. 价值差异。从半径r内的所有像素,我们将仅采用其值在此差异内的那些像素来计算平均值
  4. 请注意,算法在边界处没有很好地定义,因此不同的实现会在那里给出不同的结果。

    我不会在这里讨论血腥的数学细节,因为如果没有适当的数学符号,它们是不可能显示的,在StackOverflow中不可用,也因为它们可以找到from good sources elsewhere

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

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

    通过合理选择半径和距离,四个中心像素的值将为97(它们的平均值),并且与相邻像素的值不同。

    让我们在Mathematica中计算出来。我们将显示颜色编码,而不是显示实际数字,因此更容易理解正在发生的事情:

    矩阵的颜色编码为:

    enter image description here

    然后我们采取合理的Mean Shift:

    MeanShiftFilter[a, 3, 3]
    

    我们得到:

    enter image description here

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

    您可以使用Mean Shift迭代几次,尝试获得更均匀的颜色。经过几次迭代后,您将得到一个稳定的非各向同性配置:

    enter image description here

    此时,应该清楚的是,您无法选择应用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}}  
    

    或者:

    enter image description here

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

    HTH!

答案 1 :(得分:156)

Mean-Shift分段的工作原理如下:

图像数据转换为要素空间 feature space

在您的情况下,您拥有的只是强度值,因此特征空间只是一维的。 (例如,您可能会计算一些纹理特征,然后您的特征空间将是二维的 - 您将根据强度纹理进行分割)

搜索窗口分布在功能区域 enter image description here

此示例中的窗口数,窗口大小和初始位置是任意的 - 可以根据具体应用进行微调。

Mean-Shift迭代:

1.)计算每个窗口内的数据样本的MEAN enter image description here

2。)窗口被移位到与之前计算的平均值相等的位置 enter image description here

重复步骤1.)和2.)直到收敛,即所有窗口都已确定在最终位置 enter image description here

结束在相同位置的窗口 enter image description here

根据窗口遍历对数据进行聚类 enter image description here

...例如最终位于“2”位置的窗口遍历的所有数据将形成与该位置关联的集群。

因此,这种分割将(巧合地)产生三组。以原始图像格式查看这些组可能看起来像the last picture in belisarius' answer。选择不同的窗口大小和初始位置可能会产生不同的结果。