Znajdź aparaty szparkowe na obrazie z mikroskopii roślinnej

26

Oto pytanie do ekspertów w dziedzinie przetwarzania obrazu.

Pracuję nad trudnym problemem z widzeniem komputerowym. Zadanie polega na zliczeniu aparatów szparkowych (oznaczonych poniżej) na obrazach mikroskopowych DIC. Obrazy te są odporne na większość powierzchownych technik przetwarzania obrazu, takich jak operacje morfologiczne i wykrywanie krawędzi. Różni się także od innych zadań zliczania komórek.

Używam OpenCV. Mój plan polega na przejrzeniu potencjalnie użytecznych funkcji do dyskryminacji aparatów szparkowych.

  • Klasyfikatory tekstur
    • DCT (dyskretna transformacja kosinusowa / analiza w dziedzinie częstotliwości)
    • LBP (lokalne wzorce binarne)
  • HOG (Histogram zorientowanych gradientów)
  • Wytrzymałe detektory funkcji (jestem sceptyczny)
    • Harris rogi
    • SIFT, SURF, STAR itp.
  • Klasyfikator kaskadowy Haar / funkcje Viola-Jones

I ewentualnie zaprojektuj nowatorski deskryptor funkcji. Na razie pomijam wybór klasyfikatora.

Czego mi brakowało? Jak byś to rozwiązał? Rozwiązania podobnych problemów z wykrywaniem obiektów byłyby bardzo pomocne.

Przykładowe obrazy tutaj .

szparki

Po filtrze pasmowoprzepustowym: filtr pasmowy filtrowany

Wykrywanie ostrych krawędzi nie jest obiecujące. Niektóre obszary obrazu są nieostre: wykrywanie sprytnej krawędzi

Matt M.
źródło
1
Może zamiast próbować znaleźć szparki, możesz spróbować usunąć mgliste linie?
endolith,
1
Ile zdjęć musisz przetworzyć? Jak szybko to musi być? Jak musi być zautomatyzowana?
endolith,
1
To nie musi być bardzo szybkie. Przetwarzamy na 1000 zdjęć. Powinno być automatyczne - zrzuć obrazy do katalogu i idź.
Matt M.,

Odpowiedzi:

15

Przepraszam, nie znam OpenCV, a to bardziej etap wstępnego przetwarzania niż pełna odpowiedź:

Po pierwsze, nie chcesz wykrywacza krawędzi. Detektor krawędzi konwertuje przejścia (takie jak ten z ciemności na światło):

    _____ / ‾‾‾‾‾

w grzbiety (jasne linie na ciemności) w następujący sposób:

    ____ / _____

Innymi słowy, wykonuje różnicowanie.

Ale na twoich obrazach jest światło padające z jednego kierunku, co pokazuje nam relief powierzchni 3D. Widzimy to jako linie i krawędzie, ponieważ jesteśmy przyzwyczajeni do oglądania rzeczy w 3D, ale tak naprawdę nie są, dlatego detektory krawędzi nie działają, a dopasowywanie szablonów nie będzie łatwo działać z obróconymi obrazami (idealne dopasowanie przy obrocie o 0 stopni faktycznie anuluje się całkowicie przy 180 stopniach, ponieważ światło i ciemność zbiegną się ze sobą).

Jeśli wysokość jednej z tych mętnych linii wygląda z boku tak:

    ____ / _____

wtedy funkcja jasności po podświetleniu z jednej strony będzie wyglądać następująco:

    ____ ∧v ____

Oto, co widzisz na swoich obrazach. Powierzchnia czołowa staje się jaśniejsza, a powierzchnia tylna staje się ciemniejsza. Więc nie chcesz różnicować. Musisz zintegrować obraz wzdłuż kierunku oświetlenia, aby uzyskać oryginalną mapę wysokości powierzchni (w przybliżeniu). Wtedy łatwiej będzie dopasowywać różne elementy, niezależnie od tego, czy transformacja Hougha, dopasowanie szablonu lub cokolwiek innego.

Nie jestem pewien, jak zautomatyzować wyszukiwanie kierunku oświetlenia. Jeśli to samo dla wszystkich twoich zdjęć, świetnie. W przeciwnym razie musisz znaleźć największą linię kontrastu i założyć, że światło jest do niej prostopadłe lub coś w tym rodzaju. Na przykład obróciłem obraz ręcznie w kierunku, który uważałem za właściwy, przy świetle padającym z lewej strony:

oryginalny, obrócony

Musisz jednak również usunąć wszystkie zmiany niskiej częstotliwości na obrazie, aby podświetlić tylko szybko zmieniające się funkcje podobne do linii. Aby uniknąć artefaktów dzwonienia, użyłem rozmycia Gaussa 2D, a następnie odjąłem go od oryginału:

filtr górnoprzepustowy

Integracja (suma skumulowana) może łatwo ulec ucieczce, co powoduje powstawanie poziomych smug. Usunąłem je za pomocą kolejnego górnoprzepustowego gaussowskiego, ale tym razem tylko w kierunku poziomym:

wydajność

Teraz aparaty szparkowe są dookoła białymi elipsami, zamiast białych w niektórych miejscach i czarnych w innych.

Oryginalny:

wprowadź opis zdjęcia tutaj

Zintegrowany:

wprowadź opis zdjęcia tutaj

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 przekształcać może być stosowana do wykrywania elipsy grzbiet jak ten, wykonany z „pikseli krawędzi”, choć jest to bardzo drogie w obliczeniach i pamięci, i nie są one doskonałe elipsy tak musiałby to być trochę „niechlujstwa” detektora. Nigdy tego nie robiłem, ale istnieje wiele wyników Google dotyczących „ wykrywania elipsy ”. Powiedziałbym, że jeśli wykryjesz jedną elipsę w drugiej, w obrębie określonej przestrzeni poszukiwań, należy ją zaliczyć do stomii.

Zobacz także:

endolit
źródło
PS Czy to, co tutaj zrobiłem, ma nazwę? Czy to popularny typ filtra?
endolith
1
+1 - Świetna odpowiedź! O automatyzacji kąta źródła światła - możesz użyć detektora krawędzi, który oblicza zarówno wielkość, jak i gradient, a następnie oblicza średnią ważoną (według mag.) Gradientu. Najsilniejsze reakcje powinny być skierowane w stronę oświetlenia.
Andrey Rubshtein
11

Pierwszą rzeczą, którą spróbowałbym, to dopasowanie szablonu, z szablonami obróconymi o wszystkie kąty z pewnym krokiem. Tutaj niezbędny jest obrotowy szablon. Również wybór szablonu może być nietrywialny - może być kilka z innym oświetleniem i może być rozmazany, aby umożliwić różnicę kształtów.

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

Dalej - HOG wygląda tutaj obiecująco. Innym rozwiązaniem może być użycie silnego detektora narożnego, takiego jak Moravec lub Shi-Tomasi (z nie maksymalnym tłumieniem) i poszukiwanie grup 2-narożnych lub 3-4 narożnych na tej samej linii co kandydaci. Po znalezieniu kandydatów możesz zastosować aktywny kontur do weryfikacji (nie jestem pewien, czy to naprawdę pomogłoby, ale taka jest możliwość)

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

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

Jeszcze inną możliwością jest użycie transformaty Hougha dla elips, prawdopodobnie z nie 2, ale 3-4 wolnymi parametrami.

mirror2image
źródło
7

Częściowa odpowiedź. Znajdowanie kandydatów w 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]

wprowadź opis zdjęcia tutaj

Dr Belizariusz
źródło
Ciekawy wynik ... może połączyć z jakimś innym schematem ...
Matt M.,
@MAtt Tak, myślę, że odrzuciłem co najmniej 80% powierzchni docelowej. Po nieco rozszerzeniu maski powinieneś poszukać elips. Niezależnie od wybranej metody (wciąż myślę, co mógłbym zrobić), jest o wiele łatwiej, gdy wiesz, że bestie są otoczone.
Dr Belisarius,
1

Zacznę od użycia czułego detektora krawędzi (np. Wielkości gradientu z niskim progiem), a następnie skorzystam z transformacji Hougha, aby znaleźć elipsy. Canny może nadal działać. Jestem pewien, że istnieją parametry, które można dostosować, aby były bardziej czułe i wychwytywać rozmyte krawędzie.

Dima
źródło