ピクセル値に基づいてグレーレベル画像を分離しようとしています。1つのビンで0〜60、別のビンで60〜120、120〜180などのピクセルを255まで想定します。この場合、範囲はほぼ等間隔になります。場合。ただし、K-meansクラスタリングを使用することで、ピクセル値の範囲をより現実的に測定することができますか?ピクセルの集中度が低い場所でビンを無駄にせずに、同様のピクセルを一緒に取得しようとしています。
編集(得られた結果を含めるため):
k-クラスターがない場合の平均法=5
ピクセル値に基づいてグレーレベル画像を分離しようとしています。1つのビンで0〜60、別のビンで60〜120、120〜180などのピクセルを255まで想定します。この場合、範囲はほぼ等間隔になります。場合。ただし、K-meansクラスタリングを使用することで、ピクセル値の範囲をより現実的に測定することができますか?ピクセルの集中度が低い場所でビンを無駄にせずに、同様のピクセルを一緒に取得しようとしています。
編集(得られた結果を含めるため):
k-クラスターがない場合の平均法=5
もちろん、K-Meansは色の量子化に使用できます。そのために非常に便利です。
Mathematicaの例を見てみましょう:
グレースケール(150x150)画像から始めます。
画像を8ビットで表すときにグレーレベルがいくつあるか見てみましょう。
ac = ImageData[ImageTake[i, All, All], "Byte"];
First@Dimensions@Tally@Flatten@ac
-> 234
Ok。それらの234レベルを減らしましょう。最初の試みは、アルゴリズムだけを使用して、デフォルト構成でクラスターがいくつあるかを判別することです。
ic = ClusteringComponents[Image@ac];
First@Dimensions@Tally@Flatten@ic
-> 3
3つのクラスターを選択し、対応する画像は次のとおりです。
さて、それで問題ない場合、またはより多くのクラスターが必要な場合は、あなた次第です。
よりきめの細かい色分解が必要であると判断したとします。3つではなく6つのクラスターを求めましょう。
ic2 = ClusteringComponents[Image@ac, 6];
Image@ic2 // ImageAdjust
結果:
各ビンで使用されるピクセル範囲は次のとおりです。
Table[{Min@#, Max@#} &@(Take[orig, {#[[1]]}, {#[[2]]}] & /@
Position[clus, n]), {n, 1, 6}]
-> {{0, 11}, {12, 30}, {31, 52}, {53, 85}, {86, 134}, {135, 241}}
および各ビンのピクセル数:
Table[Count[Flatten@clus, i], {i, 6}]
-> {8906, 4400, 4261, 2850, 1363, 720}
したがって、答えは「はい」であり、それは簡単です。
編集
おそらくこれは、新しい例で何が間違っているのかを理解するのに役立ちます。
カラー画像をクラスター化し、クラスター番号を使用して明るさを表すと、次のようになります。
これは、クラスターが明るさの昇順で番号付けされていないためです。
しかし、各クラスターの平均輝度値を計算し、それを使用してクラスター値を表すと、次のようになります。
私の前の例では、それは必要ありませんでしたが、それは運が良かったです:D(つまり、クラスターは明るさの昇順で見つかりました)
k-meansは問題に適用できます。私の場合、最初に決定木から借用した基本的なアプローチを試してみます(ただし、「より単純」は正確なクラスタリングアルゴリズムに依存します!)
1つのビンが存在すると仮定し、ピクセル強度をビンに詰め込み始めます。ビンが「十分にいっぱい」になったら、ビン(またはノード)の平均と標準偏差を計算します。標準偏差があるしきい値よりも大きい場合は、ノードを半分に分割します。すべての強度が完了するまでこのプロセスを続けると、より効率的なヒストグラムが得られます。
もちろん、この方法は追加の詳細で改善できます。
もちろん、上記の「改善」をすべて適用した場合は、基本的にk-meansクラスタリングアルゴリズムの1つのバリエーションを実装したことになります;-)
注:上記のコメントには同意しません。説明する問題は、ヒストグラム均等化と密接に関連しているようには見えません。