Menemukan daerah / pola simetris dalam gambar

14

Saya memiliki serangkaian gambar yang mewakili kelengkungan rata-rata permukaan belakang manusia.

Yang ingin saya lakukan adalah "memindai" gambar untuk titik-titik yang memiliki "lawan" yang serupa, tercermin di beberapa bagian lain dari gambar (kemungkinan besar simetris dengan garis tengah, tetapi tidak harus karena mungkin ada deformitas). Beberapa teknik menjahit gambar menggunakan ini untuk "mendeteksi secara otomatis" titik-titik yang sama di antara gambar, tetapi saya ingin mendeteksi mereka untuk kedua sisi dari gambar yang sama.

Tujuan utamanya adalah menemukan garis longitudinal kontinu, paling melengkung, yang mungkin membelah punggung secara adaptif dalam "belahan" simetris.

Contoh gambar ditempatkan di bawah ini. Perhatikan bahwa tidak semua wilayah simetris (khususnya, tepat di atas tengah gambar, "strip" merah vertikal menyimpang ke kanan). Wilayah itu harus menerima skor buruk, atau apa pun, tetapi kemudian simetri lokal akan ditentukan dari titik-titik simetris yang ditempatkan lebih jauh. Bagaimanapun, saya harus menyesuaikan algorythm apa pun dengan domain aplikasi saya, tetapi yang saya kejar adalah strategi korelasional / konvolusi / pencocokan pola, pasti ada sesuatu di sekitar saya, saya kira.

(EDIT: ada lebih banyak gambar di bawah ini, dan beberapa penjelasan lainnya)

masukkan deskripsi gambar di sini

EDIT: seperti yang diminta, saya akan menyertakan gambar yang lebih khas, baik berperilaku baik dan bermasalah. Tetapi alih-alih gambar yang di-colormapped, itu adalah yang abu-abu, sehingga warna berhubungan langsung dengan besarnya data, yang tidak terjadi dengan gambar berwarna (disediakan hanya untuk komunikasi). Meskipun gambar abu-abu tampaknya kurang kontras dibandingkan dengan yang berwarna, gradien data ada dan dapat dibesarkan dengan beberapa kontras adaptif jika diinginkan.


1) Gambar subjek yang sangat simetris:

masukkan deskripsi gambar di sini


2) Gambar subjek yang sama pada saat yang berbeda. Meskipun ada lebih banyak "fitur" (lebih banyak gradien), itu tidak "terasa" begitu simetris seperti sebelumnya:

masukkan deskripsi gambar di sini


3) Subjek muda yang kurus, dengan cembung (tonjolan tulang, dilambangkan oleh daerah yang lebih ringan) di garis tengah, bukan garis tengah cekung yang lebih umum:

masukkan deskripsi gambar di sini


4) Seorang anak muda dengan deviasi spinal yang dikonfirmasi oleh X-Ray (perhatikan asimetri):

masukkan deskripsi gambar di sini


5) Subjek khas "miring" (meskipun sebagian besar simetris di sekitar garis tengah melengkung, dan karena itu tidak benar "cacat"):

masukkan deskripsi gambar di sini


Bantuan apa pun disambut baik!

heltonbiker
sumber
Mengapa tidak menggunakan tulang belakang saja sebagai pembagi?
Jim Clay
@ Jimclay: Saya menduga tulang belakang adalah bagian yang diukur, relatif terhadap sumbu simetri yang sebenarnya dari sisa gambar
endolith
"Beberapa teknik menjahit gambar menggunakan ini untuk" mendeteksi secara otomatis "titik-titik serupa di antara gambar" Buat salinan gambar yang dibalik lalu gunakan salah satunya. :)
endolith
Tidak bisakah Anda hanya mencerminkan gambar di sepanjang sumbu Y dan menggunakan algoritma registrasi? Karena sudah ada banyak penelitian tentang algoritma registrasi fleksibel / nonparametrik yang dapat Anda bangun.
Niki Estner
JimClay, tulang belakang adalah apa yang ingin saya temukan, saya tidak tahu di mana itu; Endolith, pertanyaan saya melibatkan orang yang memberi tahu saya nama-nama dari beberapa algoritma tersebut, saya belum menemukannya. Dan Nikie, itulah intinya, tapi saya tidak TAHU salah satu dari algoritma itu, itu sebabnya saya mengajukan pertanyaan pertama: o)
heltonbiker

Jawaban:

9

Seperti yang telah saya katakan di komentar, pendaftaran gambar medis adalah topik dengan banyak penelitian yang tersedia, dan saya bukan ahli. Dari apa yang saya baca, ide dasar yang umum digunakan adalah untuk mendefinisikan pemetaan antara dua gambar (dalam kasus Anda gambar dan gambar cerminnya), kemudian menentukan istilah energi untuk kelancaran dan untuk kesamaan gambar jika pemetaan diterapkan, dan akhirnya optimalkan pemetaan ini menggunakan teknik optimisasi standar (atau terkadang khusus aplikasi).

Saya telah meretas bersama algoritma cepat di Mathematica untuk menunjukkan ini. Ini bukan algoritma yang harus Anda gunakan dalam aplikasi medis, hanya demonstrasi dari ide-ide dasar.

Pertama, saya memuat gambar Anda, mirror dan membagi gambar-gambar ini menjadi blok-blok kecil:

src = ColorConvert[Import["http://i.stack.imgur.com/jf709.jpg"], 
   "Grayscale"];
mirror = ImageReflect[src, Left -> Right];
blockSize = 30;
partsS = ImagePartition[src, {blockSize, blockSize}];
partsM = ImagePartition[mirror, {blockSize, blockSize}];
GraphicsGrid[partsS]

Grafik Mathematica

Biasanya, kami akan melakukan perkiraan pendaftaran yang kaku (menggunakan mis. Titik kunci atau momen gambar), tetapi gambar Anda hampir terpusat, jadi saya akan melewati ini.

Jika kita melihat satu blok dan itu adalah mirror-image counterpart:

{partsS[[6, 10]], partsM[[6, 10]]}

Grafik Mathematica

Kita dapat melihat bahwa mereka serupa, tetapi bergeser. Jumlah dan arah perubahan adalah apa yang kami coba cari tahu.

Untuk menghitung kesamaan pertandingan, saya bisa menggunakan jarak euclide kuadrat:

ListPlot3D[
  ImageData[
   ImageCorrelate[partsM[[6, 10]], partsS[[6, 10]], 
    SquaredEuclideanDistance]]]

Grafik Mathematica

Sayangnya, menggunakan data ini adalah pengoptimalan secara langsung lebih sulit dari yang saya kira, jadi saya menggunakan perkiraan urutan kedua sebagai gantinya:

fitTerms = {1, x, x^2, y, y^2, x*y};

fit = Fit[
   Flatten[MapIndexed[{#2[[1]] - blockSize/2, #2[[2]] - 
        blockSize/2, #1} &, 
     ImageData[
      ImageCorrelate[partsM[[6, 10]], partsS[[6, 10]], 
       SquaredEuclideanDistance]], {2}], 1], fitTerms, {x, y}];

Plot3D[fit, {x, -25, 25}, {y, -25, 25}]

Grafik Mathematica

Fungsi ini tidak sama dengan fungsi korelasi aktual, tetapi cukup dekat untuk langkah pertama. Mari kita hitung ini untuk setiap pasangan blok:

distancesFit = MapThread[
   Function[{part, template},
    Fit[Flatten[
      MapIndexed[{#2[[2]] - blockSize/2, #2[[1]] - blockSize/2, #1} &,
        ImageData[
        ImageCorrelate[part, template, 
         SquaredEuclideanDistance]], {2}], 1], 
     fitTerms, {x, y}]], {partsM, partsS}, 2];

Ini memberi kami istilah energi pertama kami untuk optimasi:

variablesX = Array[dx, Dimensions[partsS]];
variablesY = Array[dy, Dimensions[partsS]];

matchEnergyFit = 
  Total[MapThread[#1 /. {x -> #2, y -> #3} &, {distancesFit, 
     variablesX, variablesY}, 2], 3];

variablesX/Yberisi offset untuk setiap blok, dan matchEnergyFitmendekati perbedaan euclide kuadrat antara gambar asli dan gambar cermin dengan offset yang diterapkan.

Mengoptimalkan energi ini saja akan memberikan hasil yang buruk (jika konvergen sama sekali). Kami juga ingin offset menjadi halus, di mana kesamaan blok tidak menunjukkan apa-apa tentang offset (misalnya di sepanjang garis lurus atau di latar belakang putih).

Jadi kami menyiapkan istilah energi kedua untuk kelancaran:

smoothnessEnergy = Total[Flatten[
    {
     Table[
      variablesX[[i, j - 1]] - 2 variablesX[[i, j]] + 
       variablesX[[i, j + 1]], {i, 1, Length[partsS]}, {j, 2, 
       Length[partsS[[1]]] - 1}],
     Table[
      variablesX[[i - 1, j]] - 2 variablesX[[i, j]] + 
       variablesX[[i + 1, j]], {i, 2, Length[partsS] - 1}, {j, 1, 
       Length[partsS[[1]]]}],
     Table[
      variablesY[[i, j - 1]] - 2 variablesY[[i, j]] + 
       variablesY[[i, j + 1]], {i, 1, Length[partsS]}, {j, 2, 
       Length[partsS[[1]]] - 1}],
     Table[
      variablesY[[i - 1, j]] - 2 variablesY[[i, j]] + 
       variablesY[[i + 1, j]], {i, 2, Length[partsS] - 1}, {j, 1, 
       Length[partsS[[1]]]}]
     }^2]];

Untungnya, optimasi terbatas ada di dalam Mathematica:

allVariables = Flatten[{variablesX, variablesY}];
constraints = -blockSize/3. < # < blockSize/3. & /@ allVariables;
initialValues = {#, 0} & /@ allVariables;
solution = 
  FindMinimum[{matchEnergyFit + 0.1 smoothnessEnergy, constraints}, 
   initialValues];

Mari kita lihat hasilnya:

grid = Table[{(j - 0.5)*blockSize - dx[i, j], (i - 0.5)*blockSize - 
      dy[i, j]}, {i, Length[partsS]}, {j, Length[partsS[[1]]]}] /. 
   solution[[2]];
Show[src, Graphics[
  {Red,
   Line /@ grid,
   Line /@ Transpose[grid]
   }]]

Grafik Mathematica

The 0.1Faktor sebelum smoothnessEnergyadalah bobot relatif energi kelancaran mendapat dalam kaitannya dengan istilah gambar energi pertandingan. Ini adalah hasil untuk bobot yang berbeda:

Grafik Mathematica

Kemungkinan peningkatan:

  • Seperti yang saya katakan, lakukan registrasi yang kaku dulu. Dengan latar belakang putih, registrasi berbasis momen gambar sederhana akan berfungsi dengan baik.
  • Ini hanya satu langkah. Anda dapat menggunakan offset yang Anda temukan dalam satu langkah dan meningkatkannya di langkah kedua, mungkin dengan jendela pencarian yang lebih kecil atau ukuran blok yang lebih kecil
  • Saya telah membaca artikel di mana mereka melakukan ini tanpa blok sama sekali, tetapi mengoptimalkan offset per piksel.
  • Coba berbagai fungsi kelancaran
Niki Estner
sumber
menjawab terlalu lama untuk dibaca hanya untuk bersenang-senang, tetapi gambar terakhirnya cukup indikatif: kelihatannya menakjubkan: D
penelope
Jawaban ini sangat mencerahkan. Saya perlu beberapa waktu untuk menelannya, tetapi kemungkinan besar teknik registrasi yang tidak kaku adalah apa yang harus saya gunakan. Untungnya Anda memberikan beberapa detail konseptual, jadi dalam kasus terburuk saya bisa mengetahui beberapa pendekatan serupa. Sementara itu, saya akan memperbarui pertanyaan dengan lebih banyak gambar. Terima kasih untuk sekarang!
heltonbiker
4

Pertanyaan menarik. Pertama, mungkin Anda mencari pendekatan berdasarkan detektor dan pencocokan keypoint bunga. Ini akan termasuk SIFT (Scale-Invariant Feature Transform), SURF, ORB, dll ... atau bahkan pendekatan yang lebih sederhana yang semata-mata didasarkan pada operator Harris (csce.uark.edu/~jgauch/library/Features/Harris.1988.pdf ). Tidak jelas dari pos Anda tentang apa yang telah Anda coba, jadi saya minta maaf jika saya naif di sini.

Mengatakan itu, izinkan saya mengambil pendekatan yang lebih sederhana dengan Matematika Morfologi (MM) hanya untuk bersenang-senang :) Gambar untuk visualisasi semua langkah ada di akhir.

Saya mengambil sampel gambar Anda dan mengubahnya menjadi L a b * colorspace menggunakan ImageMagick dan hanya menggunakan band L *:

convert x.jpg -colorspace Lab -separate %d.png

0.png sesuai dengan band L *. Sekarang, saya yakin Anda memiliki data gambar yang sebenarnya, tetapi saya sedang berurusan dengan artefak kompresi jpg dan apa yang tidak. Untuk menangani sebagian masalah ini, saya melakukan pembukaan morfologis diikuti dengan penutupan morfologis dengan cakram datar jari-jari 5. Ini adalah cara dasar untuk mengurangi noise dengan MM, dan mengingat jari-jari disk tidak banyak gambar berubah. Selanjutnya ide saya didasarkan pada gambar tunggal ini, yang memiliki peluang besar gagal untuk kasus lain. Wilayah minat Anda secara visual dibedakan dengan menjadi lebih gelap ("lebih panas" pada gambar warna Anda), jadi saya kira binarizer berbasis statistik dapat bekerja dengan baik. Saya menggunakan pendekatan Otsu, yang merupakan pendekatan otomatis.

Pada titik ini, dimungkinkan untuk memvisualisasikan wilayah pusat perhatian dengan jelas. Masalahnya adalah, dalam pendekatan saya, saya ingin komponennya tertutup tetapi tidak. Saya mulai dengan membuang setiap komponen yang terhubung yang lebih kecil dari yang terbesar (tidak termasuk latar belakang sebagai salah satu dari mereka). Ini memiliki peluang lebih besar untuk bekerja dalam kasus lain jika hasil binarisasi itu bagus. Pada contoh gambar Anda, ada satu komponen yang terhubung ke latar belakang, sehingga tidak dibuang tetapi tidak menyebabkan masalah.

Jika Anda masih mengikuti saya, kami belum menemukan wilayah pusat yang sebenarnya diinginkan. Ini saya ambil. Tidak peduli seberapa lengkung orang itu (sebenarnya saya bisa melihat kasus-kasus bermasalah tertentu), wilayahnya menyerupai garis vertikal. Untuk itu, saya menyederhanakan gambar saat ini dengan melakukan pembukaan morfologis dengan garis vertikal panjang 100. Panjang ini murni arbitrer, jika Anda tidak memiliki masalah penskalaan maka ini bukan nilai sulit untuk ditentukan. Sekarang kita kembali membuang komponen, tetapi saya sedikit lebih berhati-hati pada langkah ini. Saya menggunakan pembukaan dengan area dengan komplemen gambar untuk membuang apa yang saya anggap daerah kecil, ini bisa dilakukan dengan cara yang lebih terkontrol dengan melakukan sesuatu dalam bentuk analisis granulometrik (dari MM juga).

Kami kira-kira memiliki tiga bagian sekarang: bagian kiri gambar, bagian tengah, dan bagian kanan gambar. Bagian tengah diharapkan menjadi komponen yang lebih kecil dari ketiganya, sehingga diperoleh secara sepele.

Ini adalah hasil akhir, gambar kanan bawah hanyalah gambar superposis ke kiri dengan yang asli. Angka-angka individu tidak semua selaras, maaf untuk terburu-buru.

http://i.imgur.com/XRhYv.png

mmgp
sumber
Terima kasih banyak atas minat jenis Anda, tetapi pendekatan Anda harus mempertimbangkan sifat-sifat tertentu dari data saya (bukan keluhan, hanya perincian): 1) Data aktual adalah deretan 2D float, dikelompokkan dengan warna merah-kuning yang berbeda- colormap hijau di matplotlib Python. Saya tidak berpikir bekerja dengan data warna secara konseptual benar, gambar ditampilkan hanya untuk keperluan komunikasi; 2) Data aktual berkaitan dengan kelengkungan permukaan (cembung vs cekung), dengan bagian merah yang cekung dan yang hijau cembung. Sumbu simetris tidak selalu jatuh di wilayah cekung.
heltonbiker
Saya akan segera menambahkan beberapa gambar (dan ganti yang ini) dengan yang abu-abu, sehingga gambar itu sendiri dapat digunakan untuk pengujian, menghilangkan bahaya distorsi rentang dinamis karena warna.
heltonbiker
Sayangnya, data belum tersedia. Gambar skala abu-abu paling tidak merupakan perkiraan.
mmgp
Saya percaya perkiraan yang paling mungkin sudah cukup, tetapi saya tidak keberatan memberikan data aktual. Saya dapat memposting beberapa tautan unduhan publik DropBox, hanya saja tidak tahu dalam format file apa.
heltonbiker