Bagaimana cara mendeteksi objek yang berbeda ketika ujung-ujungnya saling bersentuhan?

21

Saya perlu menemukan semua kontur dalam gambar yang diambil dari kamera. Jadi saya pertama kali menggunakan detektor tepi cerdik untuk menemukan tepi dan kemudian menemukan kontur. Cukup mudah.

Namun, kontur saya "digabungkan". Sebagai contoh, pada gambar di bawah ini, saya jelas memiliki 4 objek yang berbeda. Tepinya sedikit menyentuh pada beberapa titik, jadi saya mendapatkan satu kontur besar daripada empat yang terpisah. Saya mencoba mengubah sekitar ambang batas, mengikis, operasi morfologi dan hal-hal serupa tetapi ujungnya tetap sedikit menyentuh. Adakah yang punya saran tentang cara mendapatkan kontur terpisah dalam gambar yang mirip dengan yang di bawah ini? (Gambar di bawah ini jelas hanya sebuah contoh, gambar saya yang sebenarnya jauh lebih kompleks, tetapi memiliki masalah dasar yang sama).

masukkan deskripsi gambar di sini

Lorem Ipsum
sumber
Segmentasi DAS dapat bekerja.
sm176357
Jadi, Anda juga harus mempertimbangkan kasus-kasus di mana kontak adalah garis dan bukan hanya titik juga (menyentuh tetapi tidak tumpang tindih)
Shravya Boggarapu

Jawaban:

11

Mendeteksi komponen yang berbeda:

Jika Anda mencoba mendeteksi komponen yang berbeda, mungkin ada pendekatan lain untuk melakukannya daripada mendeteksi kontur. Berikut ini contoh dalam Mathematica. Erosi yang diikuti dengan pelebaran digunakan untuk menutup celah pada komponen kedua sebelum deteksi (jika Anda tidak melakukan ini, ia tidak akan mendeteksinya).

img = Binarize@Import["http://i.stack.imgur.com/yqDyu.png"];
Colorize[MorphologicalComponents[Dilation[Erosion[img,1],1]]]

Gambar di sebelah kiri di bawah, menunjukkan deteksi objek yang tidak sempurna (tanpa menutup celah) dan di sebelah kanan, menunjukkan deteksi yang benar (menjalankan kode di atas).

masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini

Mendeteksi kontur yang berbeda:

Namun, jika Anda hanya ingin memisahkan kontur, inilah contohnya. Erosi dan pelebaran dilakukan seperti sebelumnya untuk menutup celah dan gambar yang dihasilkan dijalankan melalui detektor tepi Canny. Saya telah membuat opsi default secara eksplisit, sehingga Anda dapat melihat apa yang sedang digunakan.

img2 = EdgeDetect[Dilation[Erosion[img, 1], 1], Method -> "Canny"]

Ini akan memberi Anda bagian dalam dan tepi luar (lihat gambar di sebelah kiri di bawah), karena lebar piksel lebih besar dari 1 di sekeliling. Saya belum beruntung mencoba membuatnya lebih tipis, karena kinerjanya menurun (mungkin berbeda untuk gambar Anda yang lain). Kontur dalam adalah yang Anda inginkan, dan kontur luar hanyalah kontur gabungan dari keempat komponen. Sekarang yang perlu kita lakukan adalah menjatuhkan yang terluar dengan:

SelectComponents[img2, "EnclosingComponentCount", # > 0 &]

yang memberi Anda hanya kontur dalam (lihat kanan bawah). Dengan kata lain, itu hanya mengambil kontur yang tertutup oleh setidaknya satu kontur lain, yang secara otomatis mendiskualifikasi yang paling luar. Saya tidak tahu sama dengan perintah / operasi ini di openCV.

masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini

Perhatikan bahwa jeda yang jelas pada gambar adalah karena menyimpan ke jpeg dalam ukuran yang lebih kecil. Tidak terlihat seperti itu di layar saya.

Lorem Ipsum
sumber
2

Coba pra-pemrosesan gambar Anda dengan filter morfologis seperti erosi . Ini akan memungkinkan kontur menyentuh untuk dipisahkan. Setelah mendeteksi kontur, Anda dapat menerapkan operasi pelebaran untuk melengkapi kisi.


sumber
Saya mencobanya, tetapi hasilnya tidak menunjukkan perbaikan.
1
Bisakah Anda menunjukkan contoh gambar nyata?
2

Ini bukan jawaban untuk pertanyaan Anda, tetapi analisis kontur rawan kesalahan. Anda tidak dapat berbuat banyak tentang hal itu dan hanya bekerja pada skenario yang sangat sederhana.

Jika Anda kesulitan menggunakannya, Anda harus mencari algoritma yang sama sekali berbeda. Ada cara yang lebih kompleks dan lebih kuat untuk menyelesaikan masalah, tetapi tergantung pada apa yang ingin Anda capai (deteksi objek, pelacakan, dll ...)


sumber
Terima kasih. Program saya digunakan untuk deteksi tangan, jadi saya pikir itu akan sangat mirip dengan deteksi objek. Apakah Anda memberikan saran untuk algoritma yang lebih kompleks dan kuat? Fitur Haar, SURF, dan algoritma pembelajaran mesin serupa bukanlah sesuatu yang bisa saya lakukan.
Apakah Anda melihat sumber daya ini? paginas.fe.up.pt/~hgc2011 Mereka kebanyakan adalah basis data / hasil, tetapi saya harap Anda dapat menemukan beberapa makalah yang bagus di sini.
0

Kontur belum tentu terbuka mempertimbangkan bahwa Anda telah menggunakan cerdik untuk mendeteksi mereka. Masalah dengan Canny sudah ditemukan di sini . The diskusi di cerdik memberi Anda ide dasar bahwa masih ada operasi seperti menutup dan pelebaran yang membutuhkan di atas cerdik untuk kontur tertutup dievaluasi.

Ini juga tergantung pada apakah kita mencari kontur atau segmentasi (Canny versus metode seperti Graphcuts ). Jadi saya kira mencari solusi yang kuat tergantung pada aplikasi akhir Anda.

beedot
sumber