Dasar-dasar pertama:
Segmentasi Mean Shift adalah teknik homogenisasi lokal yang sangat berguna untuk meredam perbedaan bayangan atau nada warna pada objek yang dilokalkan. Contoh lebih baik daripada banyak kata:
Tindakan: mengganti setiap piksel dengan rata-rata piksel dalam lingkungan range-r dan yang nilainya berada dalam jarak d.
Mean Shift biasanya membutuhkan 3 input:
- Fungsi jarak untuk mengukur jarak antar piksel. Biasanya jarak Euclidean, tetapi fungsi jarak yang didefinisikan dengan baik dapat digunakan. The Manhattan Distance terkadang merupakan pilihan berguna lainnya.
- Jari-jari. Semua piksel dalam radius ini (diukur sesuai jarak di atas) akan dihitung.
- Perbedaan nilai. Dari semua piksel di dalam radius r, kita hanya akan mengambil piksel yang nilainya berada dalam perbedaan ini untuk menghitung mean
Harap perhatikan bahwa algoritme tidak didefinisikan dengan baik di perbatasan, jadi penerapan yang berbeda akan memberi Anda hasil yang berbeda di sana.
Saya TIDAK akan membahas detail matematika berdarah di sini, karena tidak mungkin ditampilkan tanpa notasi matematika yang tepat, tidak tersedia di StackOverflow, dan juga karena dapat ditemukan dari sumber yang baik di tempat lain .
Mari kita lihat bagian tengah matriks Anda:
153 153 153 153
147 96 98 153
153 97 96 147
153 153 147 156
Dengan pilihan yang wajar untuk radius dan jarak, empat piksel pusat akan mendapatkan nilai 97 (mean) dan akan berbeda dari piksel yang berdekatan.
Mari kita hitung di Mathematica . Alih-alih menunjukkan angka sebenarnya, kami akan menampilkan kode warna, jadi lebih mudah untuk memahami apa yang terjadi:
Kode warna untuk matriks Anda adalah:
Kemudian kami mengambil Mean Shift yang masuk akal:
MeanShiftFilter[a, 3, 3]
Dan kami mendapatkan:
Di mana semua elemen pusat sama (dengan 97, BTW).
Anda dapat mengulang beberapa kali dengan Mean Shift, mencoba mendapatkan pewarnaan yang lebih homogen. Setelah beberapa iterasi, Anda sampai pada konfigurasi non-isotropik yang stabil:
Saat ini, seharusnya sudah jelas bahwa Anda tidak dapat memilih berapa banyak "warna" yang Anda dapatkan setelah menerapkan Mean Shift. Jadi, mari kita tunjukkan bagaimana melakukannya, karena itu adalah bagian kedua dari pertanyaan Anda.
Apa yang Anda butuhkan untuk dapat mengatur jumlah cluster keluaran sebelumnya adalah sesuatu seperti pengelompokan Kmeans .
Ini berjalan seperti ini untuk matriks Anda:
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}}
Atau:
Yang sangat mirip dengan hasil kami sebelumnya, tetapi seperti yang Anda lihat, sekarang kami hanya memiliki tiga tingkat keluaran.
HTH!