Menghubungkan tepi yang terdeteksi oleh detektor tepi

14

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.) gambar

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:

  1. Memindai dalam jendela 3x3, cari tetangga.
  2. Lintasi objek yang terhubung sepenuhnya.
  3. Cobalah untuk menyesuaikan garis (atau mungkin polinomial kuadratik).
  4. Periksa fitur demi fitur apakah layak koneksi atau tidak.

Implementasinya tidak mudah karena bagian pengambilan keputusan di mana simpul perlu dihubungkan adalah rumit.

Naresh
sumber
Saya menemukan solusi yang menarik untuk menemukan cabang. MATLAB dapat dengan mudah memberikan lokasi node. MATLAB juga dapat memberi label fitur yang terhubung. Jadi, Anda dapat memilih satu fitur yang terhubung. Temukan simpul. Atur simpul-simpul ini ke 0. Pada dasarnya lepaskan feaure dan beri label lagi. Anda akan memiliki cabang di pohon. Ini membutuhkan kurang pemrograman manual dan hasilnya tampak baik-baik saja. Beberapa masukan?
Naresh
Untuk bagian koneksi, sekarang saya berpikir untuk menemukan fitur besar dan menganggapnya lebih dapat diandalkan. Kemudian jika garis lurus, (periksa kualitas kebugaran), ubah menjadi koordinat kutub dan cari lingkungan seperti transformasi hough. Untuk fitur besar, jari-jari pencarian besar (sebanding dengan ukuran). Saya menerapkan kode ini. Hasil di jalan. Komentar, mohon
Naresh

Jawaban:

4

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.

Dipan Mehta
sumber
terima kasih Dipan, saya juga memikirkan hal itu. Ini akan menjadi operasi yang mahal tetapi saya dapat mengekstrak beberapa informasi. Tapi kadang-kadang transfomasi Hoguh tidak memberiku jalur yang terhubung. Hough hanya menjaga garis lurus yang sempurna. Dan tidak peduli dengan konektivitas piksel. Itu hanya cocok garis ke 3 atau lebih piksel acak pada garis lurus. Saya sedang mengkode hipotesis saya. Saya akan memposting hasil di sini untuk diskusi lebih lanjut. Naresh
Naresh
θ
4

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).

A A
sumber
Terima kasih atas tanggapan yang baik. Ya, pengamatan Anda benar. Ini bukan pohon, jadi lebih baik membuat grafik. Ini akan membantu saya dalam menemukan siklus juga. Masalahnya, MATLAB mengimplementasikan grafik dalam kotak alat bioinfo, yang saya anggap kebanyakan orang tidak akan memilikinya. Yang paling bisa saya lakukan adalah kotak alat pengolah gambar. Douglas-peucker juga sesuatu yang saya pertimbangkan. Tetapi setelah berkonsultasi dengan seorang ahli GIS, saya menyadari itu mungkin membuat hal-hal lebih kompleks dan saya mungkin mendapatkan garis yang berpotongan. Juga, saya perlu melihat segmen garis yang berbeda dalam grafik juga, karena saya perlu 10 piksel untuk membuat garis, dan saya mungkin sudah memiliki bifurkasi.
Naresh