Saya memiliki gambar biner yang diperoleh dari detektor tepi cerdik. Tepi tidak terdeteksi dengan baik di tengah dan saya harus bergabung dengan mereka. Sambungan tepi tergantung orientasi dan lingkungan. Saya perlu menghubungkan simpul jika mereka di bawah ambang batas (katakanlah kurang dari 5 piksel jarak). Jika fitur saya yang hampir linier berorientasi dengan baik, ambang ini harus santai. (Ini adalah kasus terbaik.)
Saya mencoba transformasi Hough, tetapi tidak berhasil karena saya tidak memiliki garis lurus. Pelebaran dan erosi juga tidak baik; mereka membuat gambar lebih berantakan.
Pendekatan yang saya coba adalah pertama-tama mendeteksi simpul dan simpul (dalam MATLAB dengan bwmorph
) dan kemudian membuat daun sebagai fitur terpisah. Ini dilakukan sebagai berikut:
- Memindai dalam jendela 3x3, cari tetangga.
- Lintasi objek yang terhubung sepenuhnya.
- Cobalah untuk menyesuaikan garis (atau mungkin polinomial kuadratik).
- Periksa fitur demi fitur apakah layak koneksi atau tidak.
Implementasinya tidak mudah karena bagian pengambilan keputusan di mana simpul perlu dihubungkan adalah rumit.
sumber
Jawaban:
Ini mungkin bukan solusi lengkap, tetapi akan memberi Anda arahan yang baik.
Pada dasarnya, apa kriteria utama untuk mengatakan bahwa edge cocok? Itu "secara lokal" gradien tepi cocok dan sampai batas tertentu jarak masuk akal terhadap berapa lama tepi kontinu.
Jika Anda memiliki tepi geometris, seperti garis lurus panjang, Hough akan melakukan pekerjaan yang sangat mulus segera. Tapi ini tidak berfungsi ketika ujungnya kurva sembarang. Dalam hal ini, Anda masih bisa menganggap kurva sebagai potongan kasar yang konstan (cukup baik dalam kasus Anda), karenanya, Anda harus mengambil Hough secara lokal. yaitu Anda dapat mengambil sebagian kecil gambar (katakanlah satu blok) menghitung Hough dan mengidentifikasi beberapa puncak. Berdasarkan ini, Anda dapat mengidentifikasi bahwa de-houghing menciptakan celah yang berarti, jika demikian, pertahankan atau lanjutkan.
Setelah celah yang lebih kecil terisi, Anda dapat memperluas yang sama untuk mengambil ukuran yang lebih besar. puncak akan lebih banyak, tetapi Anda dapat memilih lebih sedikit dari itu.
sumber
Itu tidak akan langsung jelas ... Anda bisa mencoba bekerja sepenuhnya dengan struktur Grafik. Pertama, ekstrak semua piksel yang terhubung dari gambar dan masukkan dalam Grafik di mana node tetangga terhubung dengan tepi. Anda bisa membuang Grafik yang lebih kecil dari sejumlah node M (untuk mengecualikan bintik-bintik kecil yang tidak relevan dengan gambar).
Pada akhir proses ini, Anda akan memiliki satu set Grafik terputus. (Menilai dari gambar Anda, ini bukan Pohon karena ada siklus di sana)
Anda dapat menemukan titik-titik ekstrem dari masing-masing Grafik (piksel ekstrem di pinggiran setiap Grafik) dengan mulai dari beberapa simpul acak dan melakukan DFS .
Pada akhir proses ini, Anda akan memiliki seperangkat koordinat piksel untuk setiap Grafik yang sesuai dengan titik-titik ekstrem di mana koneksi lebih mungkin terbentuk.
Anda sekarang dapat mencoba menghubungkan tetangga titik ekstrim terdekat (dengan jarak <= 5) hanya dengan garis lurus.
Tetapi, jika Anda ingin memperhitungkan kemiringan segmen garis yang mengarah ke piksel ekstrem itu, Anda bisa mencoba "menyesuaikan garis" dengan N piksel SEBELUM untuk mencapai piksel ekstrem itu. Jadi jika N = 5, maka 5 piksel terakhir cabang akan digunakan dalam mengestimasi garis.
Oleh karena itu, untuk setiap pasangan tetangga terdekat Anda sekarang juga memiliki hal lain untuk digunakan sebagai kriteria untuk menilai apakah dua segmen harus terhubung (yaitu Jarak Titik Extremal <= 5 piksel DAN sekitar kemiringan garis yang sama).
Untuk meminimalkan dampak kebisingan yang dapat membuat garis Anda tampak bergerigi di dekat ujung cabang (dan karenanya mendistorsi estimasi kemiringan Anda), Anda dapat mencoba menerapkan langkah penyederhanaan pada Grafik Anda (ini adalah titik lain (selain DFS di atas) di mana ia membayar untuk bekerja dengan struktur Grafik). Misalnya Anda dapat menghapus node berikutnya dari Grafik yang akan membuat garis "tikungan" pada sudut lebih besar dari beberapa cut-off (untuk sesuatu yang lebih kompleks, silakan lihat di sini ). Dengan cara ini Anda akan menyesuaikan garis "sederhana", kira-kira dengan arah bagian yang lebih besar dari segmen yang dibentuk oleh piksel gambar.
Itu mungkin akan menghasilkan koneksi yang layak untuk sebagian besar kasus (dilihat dari gambar yang telah Anda posting) tetapi masih akan meninggalkan Anda dengan beberapa yang menantang. Misalnya bagaimana pola terputus berbentuk "Y" di mana salah satu cabang terputus di dekat titik koneksi dihubungkan? (yaitu, Anda memiliki tikungan "terus menerus" yang harus dihubungkan dengan segmen garis yang "menyatu" dengannya). Mungkin Anda dapat meninjau seberapa umum kasus tersebut dan merevisi kriteria koneksi Anda nanti.
Juga, mungkin ada baiknya memeriksa bagaimana Anda dapat meningkatkan akuisisi gambar Anda (meningkatkan resolusi misalnya).
sumber