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).
sumber
Jawaban:
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).
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).
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.
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:
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.
Perhatikan bahwa jeda yang jelas pada gambar adalah karena menyimpan ke jpeg dalam ukuran yang lebih kecil. Tidak terlihat seperti itu di layar saya.
sumber
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
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
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.
sumber