Temukan stomata dalam gambar mikroskop tanaman

26

Ini pertanyaan untuk para ahli pemrosesan gambar.

Saya sedang mengerjakan masalah penglihatan komputer yang sulit. Tugasnya adalah untuk menghitung stomata (ditandai di bawah) dalam gambar mikroskop DIC. Gambar-gambar ini tahan terhadap sebagian besar teknik pemrosesan gambar yang dangkal seperti operasi morfologis dan deteksi tepi. Ini juga berbeda dari tugas penghitungan sel lainnya.

Saya menggunakan OpenCV. Rencana saya adalah meninjau fitur yang berpotensi bermanfaat untuk diskriminasi stomata.

  • Klasifikasi tekstur
    • DCT (Discrete cosine transform / analisis domain frekuensi)
    • LBP (pola biner lokal)
  • HOG (Histogram gradien berorientasi)
  • Detektor fitur yang kuat (saya skeptis)
    • Sudut Harris
    • SIFT, SURF, STAR, dll.
  • Fitur Haar cascade classifier / Viola-Jones

Dan mungkin mendesain deskriptor fitur baru. Saya meninggalkan pemilihan classifier untuk saat ini.

Apa yang saya lewatkan? Bagaimana Anda menyelesaikan ini? Solusi untuk masalah deteksi objek serupa akan sangat membantu.

Contoh gambar di sini .

stomata

Setelah bandpass filter: bandpass difilter

Deteksi tepi cerdik tidak menjanjikan. Beberapa area gambar tidak fokus: deteksi tepi cerdik

Matt M.
sumber
1
Mungkin alih-alih mencoba menemukan stomata, Anda dapat mencoba menghapus garis simpang siur?
endolith
1
Berapa banyak gambar yang harus Anda proses? Seberapa cepat perlu? Seberapa otomatis seharusnya?
Endolith
1
Tidak harus sangat cepat. Kami sedang memproses pada urutan 1000 gambar. Seharusnya otomatis - membuang gambar ke direktori dan pergi.
Matt M.

Jawaban:

15

Maaf saya tidak tahu OpenCV, dan ini lebih merupakan langkah pra-pemrosesan daripada jawaban lengkap:

Pertama, Anda tidak ingin detektor tepi. Detektor tepi mengubah transisi (seperti gelap ke terang):

    _____ / ‾‾‾‾‾

ke punggungan (garis terang pada gelap) seperti ini:

    ____ / _____

Dengan kata lain, ia melakukan diferensiasi.

Namun dalam gambar Anda, ada cahaya yang menyinari dari satu arah, yang menunjukkan kepada kita relief permukaan 3D. Kami menganggap ini sebagai garis dan tepi, karena kami terbiasa melihat hal-hal dalam 3D, tetapi sebenarnya tidak, itulah sebabnya mengapa detektor tepi tidak berfungsi, dan pencocokan templat tidak akan bekerja dengan mudah dengan gambar yang diputar (sempurna kecocokan pada rotasi 0 derajat benar-benar akan dibatalkan sepenuhnya pada 180 derajat, karena terang dan gelap akan saling sejajar)

Jika ketinggian salah satu garis simpang siur ini terlihat seperti ini dari samping:

    ____ / _____

maka fungsi kecerahan saat menyala dari satu sisi akan terlihat seperti ini:

    ____ ∧v ____

Ini yang Anda lihat di gambar Anda. Permukaan menghadap menjadi lebih cerah dan permukaan trailing menjadi lebih gelap. Jadi, Anda tidak ingin membedakan. Anda perlu mengintegrasikan gambar di sepanjang arah iluminasi, dan itu akan memberi Anda peta ketinggian asli permukaan (kurang-lebih). Maka akan lebih mudah untuk mencocokkan hal-hal, baik melalui transformasi Hough atau pencocokan template atau apa pun.

Saya tidak yakin bagaimana mengotomatiskan menemukan arah iluminasi. Jika sama untuk semua gambar Anda, bagus. Kalau tidak, Anda harus menemukan garis kontras terbesar dan menganggap cahayanya tegak lurus terhadapnya atau sesuatu. Sebagai contoh saya, saya memutar gambar secara manual ke apa yang saya pikir adalah arah yang benar, dengan cahaya yang datang dari kiri:

asli, diputar

Anda juga perlu menghapus semua perubahan frekuensi rendah pada gambar, untuk menyoroti hanya fitur seperti garis yang berubah dengan cepat. Untuk menghindari artefak dering, saya menggunakan 2D Gaussian blur dan kemudian mengurangi itu dari aslinya:

high pass difilter

Integrasi (jumlah kumulatif) dapat berjalan dengan mudah, yang menghasilkan goresan horizontal. Saya menghapus ini dengan high-pass Gaussian lain, tetapi hanya dalam arah horizontal kali ini:

keluaran

Sekarang stomata berbentuk elips putih, bukan putih di beberapa tempat dan hitam di tempat lain.

Asli:

masukkan deskripsi gambar di sini

Terintegrasi:

masukkan deskripsi gambar di sini

from pylab import *
import Image
from scipy.ndimage import gaussian_filter, gaussian_filter1d

filename = 'rotated_sample.jpg'
I = Image.open(filename).convert('L')
I = asarray(I)

# Remove DC offset
I = I - average(I)

close('all')
figure()
imshow(I)
gray()
show()
title('Original')

# Remove slowly-varying features
sigma_2d = 2
I = I - gaussian_filter(I, sigma_2d)

figure()
imshow(I)
title('2D filtered with %s' % sigma_2d)

# Integrate
summed = cumsum(I, 1)

# Remove slowly-changing streaks in horizontal direction
sigma_1d = 5
output = summed - gaussian_filter1d(summed, sigma_1d, axis=1)

figure()
imshow(output)
title('1D filtered with %s' % sigma_1d)

The transformasi Hough dapat digunakan untuk mendeteksi elips punggungan seperti ini, terbuat dari "ujung pixel", meskipun itu benar-benar mahal dalam perhitungan dan memori, dan mereka tidak elips sempurna sehingga akan menjadi sedikit "ceroboh" detektor. Saya belum pernah melakukannya, tetapi ada banyak hasil Google untuk " deteksi elips hough ". Saya akan mengatakan jika Anda mendeteksi satu elips di dalam yang lain, dalam ruang pencarian ukuran tertentu, itu harus dihitung sebagai stoma.

Lihat juga:

endolit
sumber
PS Apakah yang saya lakukan di sini punya nama? Apakah ini jenis filter umum?
endolith
1
+1 - Jawaban yang bagus! Tentang otomatisasi sudut sumber cahaya - Anda dapat menggunakan detektor tepi yang menghitung besaran dan gradien lalu menghitung rata-rata bobot (menurut mag) gradien. Respons terkuat seharusnya ada pada arah iluminasi.
Andrey Rubshtein
11

Hal pertama yang saya coba adalah pencocokan templat, dengan templat yang diputar untuk semua sudut dengan beberapa langkah. Rotasi templat penting di sini. Juga pilihan template bisa non-sepele - bisa beberapa dengan pencahayaan berbeda, dan itu bisa kabur untuk memungkinkan perbedaan bentuk.

http://en.wikipedia.org/wiki/Template_matching#Template-based_matching_and_convolution

Berikutnya - HOG terlihat menjanjikan di sini. Solusi lain dapat menggunakan detektor sudut yang kuat seperti Moravec atau Shi-Tomasi (dengan penindasan non-maksimum) dan mencari kelompok 2-sudut atau 3-4 sudut pada baris yang sama dengan kandidat. Setelah menemukan kandidat, Anda dapat menerapkan kontur aktif untuk verifikasi (tidak yakin apakah itu benar-benar membantu, tapi itu mungkin)

http://en.wikipedia.org/wiki/Corner_detector

http://en.wikipedia.org/wiki/Active_contour

Namun kemungkinan lain adalah menggunakan transformasi Hough untuk elips, mungkin dengan tidak 2 tetapi 3-4 parameter gratis.

mirror2image
sumber
7

Sebagian jawaban. Menemukan kandidat dengan Mathematica:

p = ColorConvert[Import@"http://i.stack.imgur.com/38Ysw.jpg", 
    "GrayScale"] // ImageAdjust;
m = DeleteSmallComponents[Erosion[Dilation[DeleteSmallComponents[
      Binarize[EntropyFilter[p, 1] // ImageAdjust, .97], 10], 3], 5], 100];
ImageMultiply[Dilation[m, 3], p]

masukkan deskripsi gambar di sini

Belisarius
sumber
Hasil yang menarik ... mungkin digabungkan dengan skema lain ...
Matt M.
@ Ytt Saya kira itu membuang setidaknya 80% dari permukaan yang tidak ditargetkan. Setelah melebarkan topeng sedikit, Anda harus mencari elips. Terlepas dari metode yang Anda gunakan (saya masih memikirkan apa yang bisa saya lakukan) itu jauh lebih mudah sekarang Anda tahu binatang buas dikelilingi.
Dr. belisarius
1

Saya akan mulai dengan menggunakan detektor tepi sensitif (misalnya gradient magnitude dengan ambang batas rendah), dan kemudian menggunakan transformasi Hough untuk mencoba menemukan elips. Canny mungkin masih bekerja juga. Saya yakin ada beberapa parameter yang dapat Anda atur untuk membuatnya lebih sensitif dan mengambil tepi buram.

Dima
sumber