Cara terbaik untuk segmentasi vena dalam daun?

47

Saya telah melakukan banyak penelitian dan menemukan metode seperti ambang batas adaptif, daerah aliran sungai dll yang dapat digunakan untuk mendeteksi vena di daun. Namun pengirikan tidak baik karena menimbulkan banyak kebisingan

Semua gambar saya adalah gambar abu-abu. Tolong bisa ada yang menyarankan pendekatan apa untuk mengadopsi sambil mempertimbangkan masalah ini membutuhkan bantuan

EDIT: Gambar asli saya

masukkan deskripsi gambar di sini

Setelah ambang batas

masukkan deskripsi gambar di sini

Seperti yang disarankan oleh jawaban saya telah mencoba deteksi tepi berikut

  1. Cerdik

Terlalu banyak kebisingan dan gangguan yang tidak diinginkan

masukkan deskripsi gambar di sini

  1. Sobel

masukkan deskripsi gambar di sini

  1. Roberts

masukkan deskripsi gambar di sini

EDIT: Mencoba satu operasi lagi saya mendapatkan hasil berikut ini lebih baik daripada apa yang saya coba dengan cerdik dan adaptif Apa yang Anda rasakan?

masukkan deskripsi gambar di sini

vini
sumber
Bisakah Anda menunjukkan kepada kami beberapa gambar?
Jonas
Saya telah menambahkan gambar
vini
@vini Apakah Anda saat ini melakukan ini sebagai langkah pra-pemrosesan untuk mendapatkan kecocokan templat yang baik nanti? Juga, bagaimana Anda mendapatkan gambar kedua, melalui thresholding sederhana?
Spacey
Tujuan saya adalah untuk mendapatkan hasil terbaik dalam segmentasi vena sehingga output saya tidak mengandung artefak yang menyimpang, saya telah menggunakan Adaptive thresholding untuk mendapatkan gambar kedua
vini
Dari gambar yang Anda berikan, sepertinya Anda menggunakan (berbagai) filter pada gambar ambang. Ini akan memberikan hasil yang sangat buruk. Anda harus menggunakan filter pada gambar asli , lalu ambangkan hasilnya.
Benjohn

Jawaban:

56

Anda tidak mencari tepi (= perbatasan antara daerah diperpanjang nilai abu-abu tinggi dan rendah), Anda sedang mencari pegunungan (garis tipis gelap atau lebih terang dari lingkungan mereka), sehingga tepi filter mungkin tidak ideal: Filter tepi akan memberi Anda dua sisi (satu di setiap sisi garis) dan respons rendah di tengah garis:

saring sampel

TAMBAH : Jika diminta menjelaskan perbedaan antara detektor tepi dan detektor ridge lebih jelas. Saya minta maaf sebelumnya jika jawaban ini terlalu panjang.

Detektor tepi (biasanya) adalah operator turunan pertama: Jika Anda membayangkan gambar input sebagai lanskap 3D, detektor tepi mengukur kecuraman lereng di setiap titik lanskap itu:

masukkan deskripsi gambar di sini

Jika Anda ingin mendeteksi batas wilayah yang terang atau gelap, ini tidak apa-apa. Tetapi untuk urat pada gambar OP itu akan memberi Anda sama saja: garis besar kiri dan kanan masing-masing urat:

masukkan deskripsi gambar di sini

Itu juga menjelaskan "pola garis ganda" dalam hasil detektor tepi Canny:

masukkan deskripsi gambar di sini

Jadi, bagaimana Anda mendeteksi garis-garis tipis ini (yaitu bubungan)? Idenya adalah bahwa nilai-nilai piksel dapat (secara lokal) didekati oleh polinomial orde 2, yaitu jika fungsi gambar adalah , maka untuk nilai kecil dan :gxy

g(x,y)12x22gx2+xy2gxy+12y22gy2+xgx+ygy+g(0,0)

atau, dalam bentuk matriks:

g(x,y)12(xy).(2gx22gxy2gxy2gy2).(xy)+(xy).(gxgy)+g(0,0)

Matriks turunan urutan kedua disebut " Matriks goni ". Ini menjelaskan struktur urutan kedua yang menarik bagi kami.(2gx22gxy2gxy2gy2)

Bagian urutan kedua dari fungsi ini dapat diubah menjadi jumlah dari dua parabola diputar oleh beberapa sudut, dengan mendekomposisi matriks Hessian di atas hingga kali rotasi matriks diagonal dari nilai eigen-nya ( Penguraian matriks ). Kami tidak peduli dengan rotasi (kami ingin mendeteksi ridges dalam orientasi apa pun), jadi kami hanya tertarik pada danλ1x2+λ2y2λ1λ2

Bentuk seperti apa yang bisa dimiliki oleh perkiraan fungsi ini? Sebenarnya tidak banyak:

masukkan deskripsi gambar di sini

Untuk mendeteksi ridges, kami ingin menemukan area dalam gambar yang terlihat seperti plot terakhir di atas, jadi kami mencari area di mana nilai eigen utama Hessian besar (dibandingkan dengan nilai eigen minor). Cara termudah untuk mendeteksi itu hanya dengan menghitung nilai eigen utama pada setiap piksel - dan itulah yang dilakukan oleh filter ridge di bawah ini.


Sebuah Filter ridge mungkin akan memberikan hasil yang lebih baik. Saya telah mencoba built in Mathematica RidgeFilter(yang menghitung nilai eigen utama dari matriks Hessian pada setiap piksel) pada gambar Anda:

filter punggungan

Seperti yang Anda lihat, hanya ada satu puncak untuk setiap garis gelap tipis. Hasil binarizing dan skeletonizing:

masukkan deskripsi gambar di sini

Setelah memangkas kerangka dan mengeluarkan komponen kecil (noise) dari gambar, saya mendapatkan kerangka terakhir ini:

masukkan deskripsi gambar di sini

Kode Mathematica lengkap:

ridges = RidgeFilter[ColorNegate@src];
skeleton = SkeletonTransform[Binarize[ridges, 0.007]];
DeleteSmallComponents[Pruning[skeleton, 50], 50]

MENAMBAHKAN:

Saya bukan ahli Matlab, saya tidak tahu apakah ia memiliki filter ridge bawaan, tetapi saya dapat menunjukkan kepada Anda bagaimana menerapkannya "dengan tangan" (sekali lagi, menggunakan Matematica). Seperti yang saya katakan, filter ridge adalah nilai eigen utama dari matriks Hessian. Saya dapat menghitung nilai eigen secara simbolis dalam Mathematica:

eigenvalue=Last[Eigenvalues[(HxxHxyHxyHyy)]]

=>12(Hxx+Hyy+Hxx2+4Hxy22HxxHyy+Hyy2)

Jadi yang harus Anda lakukan adalah menghitung turunan kedua , , (menggunakan sobel atau turunan dari filter gaussian) dan masukkan ke dalam ekspresi di atas, dan Anda punya filter ridge Anda. H xy H yyHxxHxyHyy

Niki Estner
sumber
Ya itulah tepatnya yang saya inginkan namun saya melakukannya di matlab dan menemukan yang setara dengan filter ridge menjadi sulit
vini
1
@nikie Jawaban yang sangat bagus - pertanyaan - bisakah Anda menguraikan perbedaan antara detektor tepi dan detektor ridge untuk kami orang yang tidak memproses gambar? Terima kasih lagi
Spacey
@Mohammad: Saya sudah mencoba, saya harap saya membuatnya sedikit lebih jelas sekarang, terlepas dari matematika
Niki Estner
Saya mencoba filter ridge tidak memberikan hasil yang memuaskan
vini
2
@vini: "tidak memberikan hasil yang memuaskan" tidak banyak memberi tahu saya. Apakah Anda mendapatkan gambar hasil yang sama dengan yang saya posting? Apa itu "tidak memuaskan"?
Niki Estner
6

Saat menggunakan deteksi tepi Canny (dalam Halcon), dengan alpha menjadi 1, dan ambang rendah 8 dan ambang tinggi 13 (pada skala 1-255), saya mendapatkan hasil berikut:

Daun deteksi tepi cerdik

Dengan mengutak-atik parameter, hasil yang Anda dapatkan dari Canny dapat jauh lebih ditingkatkan. Dengan menggunakan gambar ini, Anda dapat melewati tepi pendek untuk menghilangkan noise, dan menghubungkan tepi panjang untuk hasil akhir.

BTW: warna yang berbeda menunjukkan tepi yang berbeda.

Saya bisa mendapatkan hasil yang hampir serupa menggunakan online Canny edge detector ini :

  • Pilih gambar I9Pxl.png
  • Sigma 1.2
  • T-rendah 0,04
  • T-tinggi 0,07
  • Pengaturan lainnya default
  • Klik perbarui tampilan untuk hasil
Geerten
sumber
Terima kasih :) Saya kira Canny adalah yang terbaik;) Btw, menerapkan Canny pada hasil Anda mungkin menghasilkan hasil yang lebih baik ..
Geerten
BTW: Jika Anda belum menyadarinya: Apa keterbatasan detektor tepi Canny? Anda bisa memberikan pandangan Anda di sini!
Dipan Mehta
Jika Anda memberi tahu saya: Saya sudah memberikan pandangan saya atas pertanyaan Anda .. Jika Anda memberikan komentar secara umum: Saya akan menghapus komentar ini.
Geerten
Oh ya, - saya tidak menyadarinya!
Dipan Mehta
Terima kasih atas jawaban Anda namun cerdik tidak menyimpan detail halus dari vena dalam daun yang tidak terdeteksi seperti yang Anda tunjukkan ...
vini
6

Menyusul dari jawaban yang sangat baik di atas, berikut adalah bagaimana melakukannya dengan python menggunakan functons scikit.

from skimage.feature import hessian_matrix, hessian_matrix_eigvals

#assume you have an image img

hxx, hxy, hyy = hessian_matrix(img, sigma=3)
i1, i2 = hessian_matrix_eigvals(hxx, hxy, hyy)

#i2 is the variable you want.

#Visualise the result
import matplotlib.pyplot as plt
plt.imshow(i2)
Matthew Shun-Shin
sumber
Apa yang imgseharusnya? Saya punya pngfile dan tidak berfungsi.
Sigur
img harus berupa array 2d numpy.
Matthew Shun-Shin
Sebenarnya, i1ini adalah nilai eigen yang lebih besar, jadi Anda harus menggunakannya.
Rob
Ini adalah penjelasan paling jelas yang pernah saya lihat!
Eureka
3

Alih-alih thresholding, saya telah menerapkan deteksi tepi sederhana.

GIMP Bekas dengan Perbedaan Gaussian - Radious Outer: 3.0 dan Inner: 1.0.

Ini dia tampilannya.

masukkan deskripsi gambar di sini

Anda selanjutnya dapat menerapkan filter median atau erosi / pelebaran sehingga Anda dapat menghilangkan beberapa suara kasar.

Berikut adalah halaman yang menjelaskan implementasi gimp.

Anda harus merujuk ke berbagai teknik seperti Laplacian of Gaussian atau Difference of Gaussin dll. Lihat ini: http://homepages.inf.ed.ac.uk/rbf/HIPR2/log.htm#7

Dan jawaban ini Bagaimana Laplacian digunakan untuk Masker Unsharp?

Dipan Mehta
sumber
GIMP? adalah detektor tepi mana?
vini
1
Tidak - ini adalah paket pengeditan gambar. Itu adalah pemeriksaan cepat - hanya untuk menempatkan titik ke depan. - Gunakan deteksi tepi sebagai lawan dari thresholding.
Dipan Mehta
Detektor tepi apa yang digunakan GIMP? saya minta maaf memiliki sedikit pengetahuan tentang hal itu
vini
@vini menambahkan referensi.
Dipan Mehta
3

Topik ini selalu menarik banyak minat, namun belum ada konsensus nyata tentang topik tersebut. Karena itu saya memutuskan untuk mengucapkan beberapa patah kata.

Jawaban saya untuk pertanyaan serupa yang diajukan sebelumnya pada stackexchange ( Q1 dan Q2 ) melibatkan algoritma ekstraksi struktur curvilinear subpixel oleh Steger. Metode ini dilakukan dengan cukup baik dalam banyak kasus dan untungnya, termasuk yang ini. Oleh karena itu saya memposting gambar output di sini: masukkan deskripsi gambar di sini dan di sini dengan pengaturan parameter yang berbeda, dan tanpa pewarnaan yang terhubung: masukkan deskripsi gambar di sini Untuk detail dan referensi yang tepat, silakan lihat posting stackexchange yang telah saya rujuk.

Tolga Birdal
sumber
0

Sebagai bagian dari tahun terakhir tugas studi teknik saya, saya harus mempelajari metode segmentasi untuk pembuluh darah dalam gambar fundus mata. Saya menemukan metode rekonstruksi pohon ini (oleh Cohen, Laurent D. dan Mille, Julien sangat menarik untuk digunakan bersama dengan Metode Fast-Marching.

Makalah lain yang Anda mungkin ingin melihat:

  • Kontur Aktif Geodesik
  • Tentang penerapan metode marching cepat untuk kisi 3D
  • Multistencils FMM: solusi yang sangat akurat untuk Persamaan Eikonal pada Domain Cartesian

Tautan yang berguna: - Perambatan depan dalam 2D ​​dan 3D

Saya harap ini sedikit membantu, meskipun itu tidak benar-benar canggih.

Nomaru
sumber