Mendeteksi sungai yang berkelok-kelok dalam gambar

14

Saya memiliki permukaan: dengan atribut terukur (variabel) pada setiap permukaan: . Sebagian besar permukaan akan memiliki distribusi acak atribut di seluruh permukaan, tetapi beberapa permukaan (yang menarik) akan menunjukkan pola sungai yang berkelok-kelok:nzsaya(x,y)Sebuahsaya(x,y)

masukkan deskripsi gambar di sini

Saya membutuhkan bantuan Anda dalam datang dengan ukuran yang akan memberitahu kita mana dari permukaan yang paling mungkin untuk memiliki pola seperti itu.n

Ada banyak kemungkinan peta dengan histogram yang sama seperti yang ditunjukkan di bawah ini; jadi ukuran itu perlu "menghargai" kontinuitas spasial. Untuk menggambarkan hal ini, saya telah membuat gambar acak dengan histogram yang hampir sama dengan gambar sungai: masukkan deskripsi gambar di sini

Jadi statistik gambar secara entropi mungkin hanya menjadi bagian dari solusi.

Berikut adalah contoh gambar tanpa pola sungai yang berkelok-kelok: masukkan deskripsi gambar di sini

Gambar saya sintetis (dibuat di Matlab). Dalam kehidupan nyata gambar tanpa pola mungkin memiliki kontinuitas spasial yang agak lebih dalam bentuk gumpalan kecil dengan nilai yang sama.

Berikut adalah gambar dalam skala abu-abu:

masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini

Andy
sumber
1
Bisakah Anda memposting gambar yang sebenarnya (tanpa sumbu, palet, histogram, sehingga kami dapat mencoba algoritma yang berbeda?). Juga: Apakah "sungai yang berkelok-kelok" sebenarnya adalah sebuah sinus, atau dapatkah itu memiliki bentuk apa pun?
Niki Estner
1
Hai nikie. Dalam contoh saya (data sintetis yang dibuat di Matlab) sungai adalah sinus. Dalam kehidupan nyata itu "seperti sinus"; kadang-kadang melebar dari garis tengah, kadang tidak.
Andy

Jawaban:

13

Ukuran yang sangat sederhana adalah membandingkan setiap baris dalam gambar dengan baris di atasnya, memungkinkan beberapa pergeseran horizontal.

Saya telah meretas bersama algoritma sederhana ini di Mathematica:

Mean[MapThread[
  Function[{line1, line2},
   Min[Table[Norm[line1 - RotateLeft[line2, shift]], {shift, -5, 5}]]
   ], {s[[2 ;;]], s[[;; -2]]}]]

Ini hanya mengambil setiap pasangan baris yang berdekatan, memutar salah satu baris dengan -5,5 piksel, dan mengambil jarak euclidean terkecil. Ini menghasilkan satu jarak euclidean untuk setiap pasangan baris. Saya hanya mengambil mean (tetapi tergantung pada data aktual Anda, rata-rata terpotong atau median mungkin lebih kuat).

Ini adalah hasil yang saya dapatkan untuk sampel yang dihasilkan secara artifisial (Formula: Normalisasi (noise acak * (1-faktor) + sinyal * faktor))

masukkan deskripsi gambar di sini

Jika saya memplot hasilnya terhadap kekuatan sinyal, algoritme tampaknya mengukur "kekuatan sinyal sungai yang berkelok-kelok" dengan cukup baik:

masukkan deskripsi gambar di sini

EDIT : Saya lupa menormalkan sampel input. Memperbaiki gambar hasil baru yang diunggah

Niki Estner
sumber
Jawaban yang bagus. Namun, saya berpikir bahwa ukuran Anda dapat tertipu oleh kurva berkelanjutan lainnya, seperti garis lurus. Saya akan meningkatkan sedikit dengan mengubah langkah terakhir untuk memasang sinus ke (x, y) poin yang Anda temukan, dengan beberapa amplitudo, fase dan frekuensi. Kemudian, amplitudo dapat berfungsi sebagai pengukuran untuk "kekuatan sungai".
Andrey Rubshtein
4

Anda sepertinya berada di jalur yang benar dengan histogram itu. Jika ini adalah gambar representatif dari sampel Anda, maka histogram tersebut menunjukkan bahwa gambar di mana pola berkelok-kelok dapat dideteksi hanya dengan memeriksa apakah mereka mengandung nilai di atas ambang tertentu.

Selain ini, Anda dapat mencoba mendapatkan entropi dari setiap gambar. Itu akan memberi Anda satu angka per gambar yang mencirikan keacakannya. Setelah itu Anda dapat memperoleh histogram dari entropi gambar Anda. Jika Anda yakin bahwa gambar secara jelas dibagi menjadi "benar-benar acak" dan "acak-dengan-berliku-liku" (yaitu kurang acak), maka histogram dari entropi akan menjadi bimodal. Mode kiri akan sesuai dengan gambar dengan entropi yang lebih rendah dan karena itu lebih sedikit keacakan (lebih cenderung mengandung pola berkelok-kelok) dan sebaliknya untuk mode yang tepat.

(BTW MATLAB mencakup fungsi yang relevan )

EDIT: Sebagai tanggapan terhadap komentar OP dan pengunggahan selanjutnya dari informasi lebih lanjut tentang masalah ini, berikut adalah poin tambahan untuk jawaban ini:

Entropi masih akan bekerja tetapi bukan kasus sederhana tanpa memori sederhana yang dijelaskan oleh rumus Shannon (di mana setiap sampel dari deret waktu diasumsikan independen dari yang sebelumnya).

Sebagai alternatif yang lebih sederhana maka Anda dapat mencoba memeriksa fitur autokorelasi gambar .

A A
sumber
Hai A_A. Saya pikir statistik gambar adalah bagian dari solusi tetapi orang perlu mempertimbangkan piksel tetangga untuk menghargai kontinuitas spasial (lihat Peta atribut acak di atas).
Andy
Halo, saya setuju dan telah menambah jawabannya.
A_A