Segmentasi Gambar menggunakan Mean Shift menjelaskan

107

Adakah yang bisa membantu saya memahami bagaimana sebenarnya segmentasi Pergeseran Berarti bekerja?

Berikut adalah matriks 8x8 yang baru saja saya buat

  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

Dengan menggunakan matriks di atas, apakah mungkin untuk menjelaskan bagaimana segmentasi Pergeseran Rata-rata akan memisahkan 3 tingkat angka yang berbeda?

Sharpie
sumber
Tiga tingkat? Saya melihat angka sekitar 100 dan sekitar 150.
John
2
Nah sebagai segmenasinya saya kira angka di tengah akan jauh dari angka pinggir untuk dimasukkan ke dalam bagian batas tersebut. Itu sebabnya saya mengatakan 3. Saya bisa saja salah karena saya tidak begitu mengerti bagaimana jenis segmenasi ini bekerja.
Sharpie
Oh ... mungkin kita mengambil level dengan arti yang berbeda. Semuanya bagus. :)
Yohanes
1
Saya suka jawaban yang diterima, tapi menurut saya jawaban itu belum menunjukkan gambaran keseluruhan. IMO pdf ini menjelaskan segmentasi pergeseran rata-rata dengan lebih baik (menggunakan ruang dimensi yang lebih tinggi sebagai contoh lebih baik daripada 2d menurut saya). eecs.umich.edu/vision/teaching/EECS442_2012/lectures/…
Helin Wang

Jawaban:

204

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:

masukkan deskripsi gambar di sini

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:

  1. 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.
  2. Jari-jari. Semua piksel dalam radius ini (diukur sesuai jarak di atas) akan dihitung.
  3. 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:

masukkan deskripsi gambar di sini

Kemudian kami mengambil Mean Shift yang masuk akal:

MeanShiftFilter[a, 3, 3]

Dan kami mendapatkan:

masukkan deskripsi gambar di sini

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:

masukkan deskripsi gambar di sini

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:

masukkan deskripsi gambar di sini

Yang sangat mirip dengan hasil kami sebelumnya, tetapi seperti yang Anda lihat, sekarang kami hanya memiliki tiga tingkat keluaran.

HTH!

Dr. belisarius
sumber
Apakah ada implementasi Matlab dari Mean shift for image?
Kaushik Acharya
2
@KaushikAarya Lihat shawnlankton.com/2007/11/mean-shift-segmentation-in-matlab
Dr. belisarius
164

Segmentasi Mean-Shift bekerja seperti ini:

Data gambar diubah menjadi ruang fitur ruang fitur

Dalam kasus Anda, yang Anda miliki hanyalah nilai intensitas, jadi ruang fitur hanya akan menjadi satu dimensi. (Anda dapat menghitung beberapa fitur tekstur, misalnya, dan kemudian ruang fitur Anda menjadi dua dimensi - dan Anda akan melakukan segmentasi berdasarkan intensitas dan tekstur)

Jendela pencarian didistribusikan melalui ruang fitur masukkan deskripsi gambar di sini

Jumlah jendela, ukuran jendela, dan lokasi awal berubah-ubah untuk contoh ini - sesuatu yang dapat disesuaikan dengan baik tergantung pada aplikasi tertentu

Iterasi Mean-Shift:

1.) MEANs dari sampel data dalam setiap jendela dihitung masukkan deskripsi gambar di sini

2.) Jendela SHIFT ke lokasi yang sama dengan rata-rata yang dihitung sebelumnya masukkan deskripsi gambar di sini

Langkah 1.) dan 2.) diulangi sampai konvergensi, yaitu semua jendela telah diselesaikan di lokasi akhir masukkan deskripsi gambar di sini

Jendela yang berakhir di lokasi yang sama digabungkan masukkan deskripsi gambar di sini

Data tersebut dikelompokkan sesuai dengan traversal jendela masukkan deskripsi gambar di sini

... misal semua data yang dilalui oleh windows yang berakhir di, katakanlah, lokasi “2”, akan membentuk cluster yang terkait dengan lokasi tersebut.

Jadi, segmentasi ini (secara kebetulan) akan menghasilkan tiga kelompok. Melihat grup-grup tersebut dalam format gambar asli mungkin terlihat seperti gambar terakhir dalam jawaban Belisarius . Memilih ukuran jendela dan lokasi awal yang berbeda mungkin menghasilkan hasil yang berbeda.

mlai
sumber
tidak bisakah ruang fitur menjadi tiga dimensi, menghitung posisi setiap piksel?
Helin Wang
@HelinWang Ya, bisa.
mlai
Saya memahami bagaimana jendela diposisikan dalam ruang fitur 1D, tetapi saya tidak melihat bagaimana penjelasan Anda dapat diterapkan pada algoritma pergeseran yang berarti yang mencakup jarak pencarian spasial (misalnya dalam piksel) dan jarak spektral (perbedaan nilai), misalnya seperti dalam jawaban Dr. belisarius. Bisakah Anda menjelaskan ini?
Lennert
@ Lennert Jika saya memahami pertanyaan Anda dengan benar, maka pada dasarnya apa yang akan Anda lakukan adalah menambahkan lokasi piksel (x, y) sebagai fitur, atau menambahkan fitur berbasis lokasi lainnya, ke ruang pengelompokan. Sepertinya jawaban Belisarius merujuk pada implementasi spesifik di Mathematica yang mungkin melakukan sesuatu yang lebih canggih. Apakah itu membantu?
mlai
1
@ Lennert Ya, saya pikir Anda mengerti. Saya dapat memahami mengapa Anda menganggap jawaban saya membingungkan. Saya agak menggambar 'jendela' saya sebagai dua dimensi tetapi sebenarnya saya mencoba menggambarkan pengelompokan hanya pada nilai spektral satu dimensi. Akan sangat keren untuk memvisualisasikan cluster pergeseran rata-rata dalam ruang fitur tiga dimensi dengan gambar atau animasi (Mungkin suatu hari nanti jika saya mendapatkan waktu)
mlai