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