最初の基本:
平均シフトセグメンテーションは、ローカライズされたオブジェクトのシェーディングまたは色調の違いを減衰させるのに非常に役立つローカルな均質化手法です。例は多くの単語よりも優れています:
アクション:各ピクセルをrange-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、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}}
または:
これは前の結果とよく似ていますが、ご覧のとおり、出力レベルは3つしかありません。
HTH!