まず基本:
Mean Shift セグメンテーションは、ローカライズされたオブジェクトのシェーディングや色調の違いを減衰させるのに非常に役立つローカル均質化手法です。例は多くの言葉よりも優れています:
アクション:各ピクセルを、範囲 r の近傍にあり、値が距離 d 内にあるピクセルの平均に置き換えます。
平均シフトは通常 3 つの入力を受け取ります。
- ピクセル間の距離を測定する距離関数。通常はユークリッド距離ですが、他の適切に定義された距離関数を使用することもできます。マンハッタン ディスタンスは、場合によっては別の便利な選択肢です。
- 半径。この半径内のすべてのピクセル (上記の距離に従って測定) が計算に使用されます。
- 価値観の違い。半径 r 内のすべてのピクセルから、値がこの差の範囲内にあるピクセルのみを取得して、平均を計算します。
境界ではアルゴリズムが適切に定義されていないことに注意してください。そのため、実装が異なれば、そこでは異なる結果が得られます。
適切な数学的表記法なしに表示することは不可能であり、StackOverflow では利用できないため、また他の場所の適切なソースから見つけることができるため、ここでは残忍な数学的詳細については説明しません。
マトリックスの中心を見てみましょう。
153 153 153 153
147 96 98 153
153 97 96 147
153 153 147 156
半径と距離を適切に選択すると、中央の 4 つのピクセルの値は 97 (それらの平均) になり、隣接するピクセルとは異なります。
Mathematicaで計算してみましょう。実際の数値を表示する代わりに、何が起こっているのかを理解しやすいように色分けして表示します。
マトリックスの色分けは次のとおりです。

次に、妥当な平均シフトを取得します。
MeanShiftFilter[a, 3, 3]
そして、次のようになります。

すべての中心要素が等しい場合(ところで、97まで)。
より均一なカラーリングを得るために、Mean Shift を数回繰り返すことができます。数回の反復の後、安定した非等方性構成に到達します。

現時点では、平均シフトを適用した後に得られる「色」の数を選択できないことは明らかです。それでは、質問の 2 番目の部分であるため、その方法を示しましょう。
出力クラスターの数を事前に設定できるようにするために必要なのは、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}}
または:

これは前の結果と非常によく似ていますが、ご覧のとおり、出力レベルは 3 つしかありません。
チッ!