Saya bekerja di proyek di mana pinggiran diproyeksikan terhadap subjek, dan foto diambil. Tugasnya adalah untuk menemukan garis tengah pinggiran, yang mewakili, secara matematis, kurva 3D persimpangan antara bidang pinggiran dan permukaan subjek.
Foto tersebut adalah PNG (RGB), dan upaya sebelumnya menggunakan skala abu-abu kemudian menentukan perbedaan untuk mendapatkan fotografi hitam-putih, "seperti zebra", dari mana mudah untuk menemukan titik tengah dari setiap kolom piksel di setiap pinggiran. Masalahnya adalah, dengan melakukan thresholding dan juga dengan mengambil tinggi rata-rata kolom piksel diskrit, kami mengalami beberapa kehilangan presisi dan kuantisasi, yang tidak diinginkan sama sekali.
Kesan saya, dengan melihat gambar, adalah bahwa garis tengahnya bisa lebih kontinu (lebih banyak titik) dan lebih halus (tidak dikuantisasi) jika terdeteksi langsung dari gambar yang tidak dibatasi (baik RGB atau skala abu-abu), dengan beberapa metode sapuan statistik (beberapa konvolusi banjir / iteratif, apa pun).
Di bawah ini adalah contoh gambar aktual:
Setiap saran akan sangat dihargai!
sumber
Jawaban:
Saya menyarankan langkah-langkah berikut:
x
, cari pusat yang ditimbang (dengan intensitas piksel) key
arah.y
nilainya, untuk menghilangkan noise.(x,y)
titik - titik dengan memasang semacam kurva. Artikel ini mungkin membantu Anda. Anda juga dapat memuat polinomial tingkat tinggi, meskipun menurut saya lebih buruk.Berikut adalah kode Matlab yang menunjukkan langkah 1,2 dan 4. Saya melewatkan pemilihan ambang otomatis. Sebagai gantinya saya memilih manual
th=40
:Ini adalah kurva yang ditemukan dengan menemukan rata-rata tertimbang per kolom:
Ini adalah kurva setelah pemasangan polinomial:
Ini kodenya:
sumber
double
. Tentang hasil di bagian bawah, saya perlu memeriksa, mungkin ada bug perangkat lunakSaya tidak akan menggunakan gambar RGB. Gambar berwarna biasanya dibuat dengan meletakkan "Bayer Filter" pada sensor kamera, yang biasanya mengurangi resolusi yang dapat Anda capai.
Jika Anda menggunakan gambar grayscale, saya pikir langkah-langkah yang Anda jelaskan (binarize "zebra" image, cari garis tengah) adalah awal yang baik. Sebagai langkah terakhir, saya akan melakukannya
sumber
Inilah solusi alternatif untuk masalah Anda dengan memodelkan pertanyaan Anda sebagai 'masalah optimisasi jalur'. Meskipun lebih rumit daripada solusi binarization-dan-kemudian-kurva sederhana, itu lebih kuat dalam praktiknya.
Dari level yang sangat tinggi, kita harus mempertimbangkan gambar ini sebagai grafik, di mana
setiap piksel gambar adalah simpul pada grafik ini
setiap node terhubung ke beberapa node lain, yang dikenal sebagai tetangga, dan definisi koneksi ini sering disebut sebagai topologi dari grafik ini.
setiap node memiliki bobot (fitur, biaya, energi, atau apa pun yang Anda ingin menyebutnya), mencerminkan kemungkinan bahwa node ini berada di garis tengah optimal yang kami cari.
Selama kita dapat memodelkan kemungkinan ini, maka masalah Anda menemukan 'garis tengah pinggiran' menjadi masalah untuk menemukan jalur optimal lokal pada grafik , yang dapat secara efektif diselesaikan dengan pemrograman dinamis, misalnya algoritma Viterbi.
Berikut adalah beberapa pro mengadopsi pendekatan ini:
semua hasil Anda akan berkelanjutan (tidak seperti metode ambang batas yang mungkin memecah satu garis tengah menjadi beberapa bagian)
banyak kebebasan untuk membangun grafik seperti itu, Anda dapat memilih fitur yang berbeda, dan topologi grafik.
hasil Anda optimal dalam arti optimalisasi jalur
solusi Anda akan lebih kuat terhadap noise, karena selama noise terdistribusi secara merata di antara semua piksel, jalur optimal tersebut tetap stabil.
Berikut ini demonstrasi singkat dari ide di atas. Karena saya tidak menggunakan pengetahuan sebelumnya untuk menentukan apa yang mungkin dimulai dan diakhiri node, saya cukup mendekodekan setiap node awal yang mungkin.
Untuk akhiran fuzzy, ini disebabkan oleh fakta bahwa kami mencari jalur optimal untuk setiap simpul akhir yang mungkin. Akibatnya, meskipun untuk beberapa node yang terletak di daerah gelap, jalur yang disorot masih merupakan jalur lokal optimal.
Untuk jalur fuzzy, Anda bisa menghaluskannya setelah menemukannya atau menggunakan beberapa fitur yang dihaluskan alih-alih intensitas mentah.
Dimungkinkan untuk memulihkan jalur parsial dengan mengubah node awal dan akhir.
Tidak akan sulit untuk memangkas jalur optimal lokal yang tidak diinginkan ini. Karena kami memiliki kemungkinan semua jalur setelah decoding viterbi, dan Anda dapat menggunakan berbagai pengetahuan sebelumnya (misalnya kami melihat memang benar bahwa kami hanya memerlukan satu jalur optimal untuk mereka yang berbagi sumber yang sama.)
Untuk detail lebih lanjut, Anda bisa merujuk ke kertas.
Berikut ini adalah potongan pendek kode python yang digunakan untuk membuat grafik di atas.
sumber
Pikir saya harus memposting jawaban saya karena agak berbeda dari pendekatan lain. Saya mencoba ini di Matlab.
Satu kelemahan yang saya lihat di sini adalah bahwa pendekatan ini tidak akan bekerja dengan baik untuk beberapa orientasi garis. Dalam hal ini kita harus memperbaiki orientasinya dan menerapkan prosedur ini.
Berikut kode Matlab:
Misalnya, jika Anda mengambil kolom tengah gambar, profilnya akan terlihat seperti ini: (warna biru adalah profil. Warna hijau adalah maksimum lokal)
Dan gambar yang mengandung maksimum lokal untuk semua kolom terlihat seperti ini:
Berikut adalah komponen-komponen yang terhubung (meskipun beberapa garis putus-putus, sebagian besar dari mereka mendapatkan daerah kontinu):
sumber