Bitki mikroskopi görüntüsündeki stomaları bulun


26

Görüntü işleme uzmanları için bir soru.

Zor bir bilgisayar görme sorunu üzerinde çalışıyorum. Görev, DIC mikroskopi görüntülerinde stomaları (aşağıda işaretli) saymaktır. Bu görüntüler, morfolojik işlemler ve kenar algılama gibi yüzeysel görüntü işleme tekniklerine dirençlidir. Aynı zamanda diğer hücre sayma görevlerinden farklıdır.

OpenCV kullanıyorum. Planım, stoma ayrımcılığı için potansiyel olarak yararlı özellikleri gözden geçirmektir.

  • Doku sınıflandırıcılar
    • DCT (Ayrık kosinüs dönüşümü / frekans-alan analizi)
    • LBP (Yerel ikili modeller)
  • HOG (Yönlendirilmiş gradyanların histogramı)
  • Sağlam özellik dedektörleri (şüpheciyim)
    • Harris köşeleri
    • SIFT, SURF, STAR, vb
  • Haar cascade sınıflandırıcı / Viola-Jones özellikleri

Ve muhtemelen yeni bir özellik tanımlayıcısı tasarlayın. Şimdilik bir sınıflandırıcı seçimi bırakıyorum.

Neyi kaçırdım? Bunu nasıl çözersiniz? Benzer nesne algılama problemleri için çözümler çok yardımcı olacaktır.

Örnek resimler burada .

stoma

Bant geçiren filtreden sonra: bant geçiren filtre

Canny kenar tespiti umut verici değil. Bazı görüntü alanları odak dışı: canny kenar algılama


1
Belki de stomaları bulmaya çalışmak yerine, mazy çizgilerini çıkarmayı deneyebilirsin?
Endolit

1
Ne kadar görüntü işlemek zorundasınız? Ne kadar hızlı olması gerekiyor? Ne kadar otomatik olması gerekiyor?
endolith

1
Çok hızlı olmak zorunda değil. 1000 görüntü sırasına göre işlem yapıyoruz. Otomatik olmalı - görüntüleri bir dizine atıp gidin.
Matt M.

Yanıtlar:


15

Üzgünüm, OpenCV'yi tanımıyorum ve bu tam bir cevaptan çok bir ön işleme adımı:

İlk önce, bir kenar dedektörü istemiyorsunuz. Bir kenar detektörü geçişleri dönüştürür (bu karanlık-aydınlık gibi):

    _____ / ~~~~~

sırtlara (karanlıktaki parlak çizgiler) şöyle:

    ____ / _____

Başka bir deyişle, bir ayrım yapar.

Fakat görüntülerinde, bize 3D yüzeyinin rahatlamasını gösteren tek bir yönden parlayan bir ışık var. Bunu çizgiler ve kenarlar olarak algılıyoruz, çünkü şeyleri 3B olarak görmeye alışkınız, ancak onlar gerçekten değil, bu yüzden kenar dedektörleri çalışmıyor ve şablon eşleştirmesi döndürülmüş görüntülerle kolayca çalışmayacak (mükemmel 0 derece dönme eşleşmesi aslında 180 derecede tamamen iptal olur çünkü açık ve karanlık birbiriyle aynı hizada olacaktır).

Bu labirent çizgilerin birinin yüksekliği yandan şöyle görünüyorsa:

    ____ / _____

o zaman bir taraftan aydınlatıldığında parlaklık işlevi şöyle görünür:

    ____ ∧v ____

Resimlerinizde gördüğünüz budur. Yüzeye bakan yüzey daha parlak olur ve arka yüzey daha koyu olur. Yani ayırt etmek istemiyorsun. Görüntüyü aydınlatma yönü boyunca birleştirmeniz gerekir ve bu size yüzeyin orijinal yükseklik haritasını (yaklaşık olarak) verecektir. Ardından, Hough dönüşümü veya şablon eşleştirme yoluyla veya her neyse, şeyleri eşleştirmek daha kolay olacaktır.

Aydınlatma yönünü nasıl bulacağımı otomatik olarak bilmiyorum. Tüm resimleriniz için aynıysa, harika. Aksi takdirde, en büyük kontrast çizgisini bulmanız ve ışığın ona veya başka bir şeye dik olduğunu varsaymanız gerekir. Örneğin, görüntüyü soldan gelen ışıkla doğru yönde olduğumu düşündüğüm gibi el ile döndürdüm:

orijinal, döndürülmüş

Yine de, yalnızca hızla değişen çizgi benzeri özellikleri vurgulamak için görüntüdeki tüm düşük frekans değişikliklerini kaldırmanız gerekir. Zil eserlerini çaldırmamak için 2D Gauss bulanıklığını kullandım ve sonra orjinalinden çıkardım:

filtrelenmiş yüksek geçiş

Entegrasyon (kümülatif toplam) yatay çizgiler üreten kolayca kaçak yapabilir. Bunları başka bir Gaussian yüksek geçişi ile kaldırdım, ancak bu sefer sadece yatay yönde:

çıktı

Şimdi stomalar, bazı yerlerde beyaz, bazı yerlerde siyah yerine beyaz elipsler.

Orijinal:

görüntü tanımını buraya girin

Entegre:

görüntü tanımını buraya girin

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)

Hough dönüşümü bu hesaplama ve bellekte gerçekten çok pahalı olsa da, "kenar piksel" yapılmış bu gibi mahya elipsler algılamak için kullanılabilir ve bir "özensiz" detektörün biraz olması gerekir böylece mükemmel elips değildir. Daha önce hiç yapmadım, ancak " kaba elips saptama " için çok fazla Google sonucu var . Birinin diğerinin içinde, belirli bir boyutta arama alanı içinde bir elips tespit etmesi durumunda, bunun stoma olarak sayılması gerektiğini söyleyebilirim.

Ayrıca bakınız:


PS Burada yaptığımın bir adı var mı? Yaygın bir filtre tipi mi?
Endolith

1
+1 - Harika cevap! Işık kaynağı açısının otomasyonu hakkında - hem büyüklüğü hem de degradeyi hesaplayan ve sonra degradenin ağırlıklı (mag.) Ortalamasını hesaplayan kenar detektörü kullanabilirsiniz. En güçlü tepkiler aydınlatma yönünde olmalıdır.
Andrey Rubshtein

11

Deneyeceğim ilk şey, şablonların eşleştirilmesidir, şablonlar tüm açılar için bir adım adım döndürülmüşlerdir. Dönen şablon burada önemlidir. Ayrıca şablon seçimi önemsiz olabilir - farklı ışıklandırmalarla birkaç olabilir ve şekillerdeki farklılığa izin vermek için bulanıklaştırılabilir.

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

Sonraki - HOG burada umut verici görünüyor. Başka bir çözüm, Moravec veya Shi-Tomasi gibi güçlü köşe dedektörlerini kullanmak (maksimum baskılama olmadan) ve adaylarla aynı çizgide 2 köşeli veya 3-4 köşeli gruplar arayabilir. Adayları bulduktan sonra doğrulama için aktif kontur uygulayabilirsiniz (gerçekten yardım edip edemeyeceğinden emin değilim, ancak bu mümkün)

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

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

Yine bir başka olasılık elipsler için Hough dönüşümünü kullanmaktır, muhtemelen 2 ama 3-4 serbest parametrelerle.


7

Kısmi cevap Mathematica ile aday bulma:

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]

görüntü tanımını buraya girin


İlginç bir sonuç ... belki başka bir programla birleştirebilirsiniz ...
Matt M.

@En Yep Ben hedeflenmemiş yüzeyin en az% 80'ini attığını düşünüyorum. Maskeyi biraz uzattıktan sonra, elipsleri aramalısınız. Kullandığınız yönteme bakılmaksızın (hala ne yapabileceğimi düşünüyorum) şimdi canavarların çevrelediğini biliyorsunuz.
Dr. Belisarius

1

Hassas bir kenar detektörü (örneğin düşük eşikli gradyan büyüklüğü) kullanarak başlar ve sonra elipsleri bulmaya çalışmak için Hough dönüşümünü kullanırdım. Canny hala da çalışabilir. Daha hassas hale getirmek ve bulanık kenarları almak için ince ayar yapabileceğiniz parametreler olduğundan eminim.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.