Witam CV / Pattern Recognition Community,
Mam poważny problem z segmentacją obrazu. Scenariusz to atmosfera w piecu, która powoduje, że moja głowa oszaleje. I muszę wykryć kontury obiektów z różnych materiałów (szkło, ceramika, Al, Ir, ...) w krótkim czasie (<10 sekund), a nie tylko w jednym specjalnym przypadku. Potrzebuję również konturu w sekwencyjnym rzędzie pikseli dla kodu. Dlatego potrzebny jest również kod łańcucha lub tak zwane śledzenie krawędzi / konturu, więc otwarte otwory nie są dobre. W tle pojawiają się nieliniowe odgłosy, w przybliżeniu pyłu, cząstek lub czegoś innego, które pojawiają się od czasu do czasu.
Mile widziane sugestie Matlab lub OpenCV.
Aby było to bardziej jasne, zamieściłem inny obraz mojego celu i półprzezroczysty obiekt, który również należy wykryć. Także dalsze przykłady, o których należy pamiętać.
Jak widać na zdjęciu nr 1, cząstki znajdują się w prawej części obrazu i w pobliżu zewnętrznego obrysu gwiazdy, która jest obiektem. Również ogólny kontrast nie jest zbyt dobry. Sam obiekt stoi na ziemi, co nie jest istotne dla wykrywania konturu. Zdjęcie nr 2 pokazuje półprzezroczysty obiekt, co jest również możliwe.
Chcę znaleźć kontur / obwód tego obiektu, jak na następnym ekranie (czerwona linia). Dwa prostokąty (żółty) oznaczają początkowy (lewy) i końcowy (prawy). Niebieska linia jest niezauważalna.
Na początku myślałem, że mogę rozwiązać problem tej brudnej atmosfery za pomocą samych filtrów. Ale po honorowym okresie inwestowania właśnie zdałem sobie sprawę, że muszę znacznie wyeliminować lub zmniejszyć hałas, aby zwiększyć kontrast pierwszego planu i tła. Próbowałem wielu metod, takich jak wyrównanie histogramu, wyrównanie adaptacyjne Otsu, filtry liniowe (np. Gauss), filtry nieliniowe (mediana, dyfuzja), aktywne kontury, k-średnie, Fuzzy-c-średnie, a także Canny dla czystej Wykrywanie krawędzi w połączeniu z operatorami morfologicznymi.
- Canny: Cząsteczki i atmosfera powodują dziury, ale potrzebuję pełnego obrysu obiektu. Jednak przy zamykaniu, rozszerzaniu operatorów morfologicznych nie jest to wystarczające. Canny ma wciąż najlepsze wyniki ze wszystkich metod, które badałem ze względu na histerezę.
- Aktywne kontury: działają również na krawędziach / gradientach, zachowują się całkowicie szalone po zainicjowaniu wewnątrz obiektu, co może być spowodowane przez mapę krawędzi tworzącą „otwarty” obiekt. O ile wiem, kontur musi być zamknięty. Wypróbowałem to z różnymi pochodnymi (GVF / VFC / Classic Snake).
- k-Środki: Wyniki obejmują atmosferę pieca z powodu zamglonego tła. To samo dotyczy rozmytych-c-średnich. Wybrałem dwa klastry ze względu na oddzielenie obiektu od tła. Więcej klastrów prowadzi do słabszych wyników.
- Histogram / Otsu: Z powodu bardzo bliskiej intensywności szarości (imho!) Łączy obiekt z tłem. Wypróbowałem to za pomocą metod lokalnych i globalnych.
- Filtry: Szczególnie GLPF lub inny LPF rozmazują krawędzie, co nie jest tak dobre i nawet nie zmniejsza mglistej atmosfery.
- Filtry nieliniowe zachowują krawędzie. Większość z nich zajmuje zbyt dużo czasu na obliczenie dużych zdjęć. Na razie wziąłem szybki filtr dwustronny. Wyniki patrz poniżej.
Dlatego żadna metoda nie jest wystarczająca dla etapów przetwarzania końcowego, ponieważ uzyskane wyniki segmentu obiektowego są słabo konkurowane z istniejącym algorytmem. Ten istniejący algorytm jest bardzo lokalny i dlatego działa w tym szczególnym scenariuszu.
Pytam więc, czy coś zupełnie przeoczyłem ... Nie mam pojęcia, jak przetwarzać i jak uzyskać dobre wyniki konturów, bez przerw i dziur. Czy to możliwe bez wprowadzania wielu zmian w CCD i środowisko fizyczne? Z góry dziękuję!
Ostatnie podejście do tej pory (po długiej nocy eksperymentów z MO):
- Filtr dwustronny (zachowujący krawędzie, ale wygładzający jednorodne obszary)
- Canny (Sigma = 2, Próg = [0,04 0,08])
- Operacji morfologicznych (MO)
bwareopen
,closing
,remove
ibridge
bwlabel
do wybierania tylko obwodu konturu, który usuwa niepożądane dźwięki. brak zaktualizowanych zrzutów ekranu, ale działa dla gwiazdy. szkło ma wewnętrzny kontur, który jest połączony z konturem zewnętrznym, co można również zobaczyć na zrzucie ekranu poniżej.
Obawiam się więc, że potrzebuję specjalnego algorytmu do przejścia konturu zewnętrznego. Będzie to wyszukiwanie okolic w prawo / w lewo. Ten krok w prawo / w lewo może się przełączać, jeśli jest punkt narożny. jeśli jest przerwa, zwiększ promień i spójrz ponownie. jeśli istnieją dwa lub więcej możliwych punktów, wybierz ten, który uzyskał ten sam kierunek co poprzedni. Czy uważasz, że ten algorytm śledzenia konturów ma sens?
Odpowiedzi:
Możesz spróbować:
Wydajna segmentacja obrazów na podstawie wykresów: http://www.cs.brown.edu/~pff/segment/ (dostępny kod)
Segmentacja oparta na GraphCut: http://www.csd.uwo.ca/~olga/OldCode.html (dostępny kod)
Najpierw usuń obraz za pomocą rzadkich metod: http://spams-devel.gforge.inria.fr/ (dostępny kod)
źródło
Myślę, że zbyt wcześnie zrezygnowałeś z technik progowych. Spójrz na swój histogram, jest on wyraźnie trójmodalny: (ręcznie usunąłem białe kolumny po prawej stronie obrazu, zakładam, że nie są one częścią obrazu - proszę zrobić to zdjęcie przed uruchomieniem mojego kodu)
Spójrz na wszystkie wartości w pierwszej grupie:
Aby znaleźć tryby w histogramie trójmodalnym, można użyć grupowania K- z
K=3
intensywnością. Poniższy kod Matlab znajduje sięth1=67
w kodzie. Chodzi o założenie, że masz 3 zestawy i obliczyć ważony centroid na każdym z nich. Następnie każdy poziom intensywności jest przypisywany do własnego klastra. Zatrzymujesz się, gdy ważone centroidy przestaną się poruszać. Oto wynik znalezienia dwóch progów na obrazie, pokazanych na histogramie.Późniejsze rozwiązanie problemu to bułka z masłem, wystarczy wykonać proste operacje morfologiczne, takie jak otwieranie.
źródło
imhist
nahist
Jak sugerowano powyżej, progowanie może być bardzo skuteczne na tym obrazie, który jest zasadniczo binarny, z wyjątkiem tego, że stały próg nie zadziała z powodu nierównomiernego oświetlenia. Potrzebujesz adaptacyjnego progowania.
Moją radą byłoby wykonanie rekonstrukcji tła za pomocą prostego modelu (możliwie płaskiego [3 DOF] lub kwadrycznego [6 DOF]), poprzez próbkowanie niewielkiej liczby wartości w jasnych obszarach. Najlepiej jest używać małych ROI, aby uśrednić hałas. Następnie popraw cieniowanie, odejmując (lub dzieląc) wartości tła.
Jeśli interakcja człowieka nie jest opcją, możesz zautomatyzować wyszukiwanie obszarów tła, zaczynając od pierwszego prostego Otsu i biorąc pod uwagę jednolite ROI (niska wariancja) znacznie poniżej progu. Po pierwszej rekonstrukcji tła można prawdopodobnie poprawić, stosując ten proces do płasko skorygowanego obrazu.
Cały proces można wdrożyć tak, aby działał znacznie poniżej sekundy.
źródło
Myślę, że najlepszym sposobem jest użycie aktywnych konturów. Jeśli nie wiesz, jakie są aktywne kontury, obejrzyj ten film na youtube http://www.youtube.com/watch?v=ijNe7f3QVdA
Zasadniczo musisz zainicjować segmentację, a to poprawi kształt. Moją sugestią jest jedna z metod omówionych w tym poście i użycie aktywnych konturów jako drugiego kroku, tj. jako krok ulepszenia.
Oto implementacja aktywnych konturów, których możesz użyć http://www.mathworks.com/matlabcentral/fileexchange/19567
źródło
Wiesz dokładnie, o co ci chodzi, ale nie wspomniałeś o zastosowaniu progów, w szczególności czy próbowałeś zastosować próg globalny za pomocą Otsu, aby obliczyć właściwy poziom, a następnie znaleźć kontury i wybrać największy?
[Edytuj, aby wyjaśnić]
Globalny próg oczywiście nie zadziała z powodu widocznej widoczności na obrazie.
Szybko się z tym pobawiłem i stwierdziłem, że jeśli podzielisz obraz na 6 części (2 rzędy po 3 kolumny o równej wielkości), a następnie wykonasz progowanie za pomocą Otsu na każdym z nich, a następnie złożysz ponownie, to całkiem dobra robota, jeśli chodzi o oczyszczenie wizerunek.
W górnej prawej części gwiazdy wciąż znajdują się drobne artefakty.
Przyszło mi do głowy, że ponieważ obiekt ma granice linii prostych, możesz rozważyć transformację Hougha, aby wydobyć te krawędzie, przeciąć je, aby zlokalizować wierzchołki i użyć wyniku jako konturu obiektu.
źródło
Czy kontury są zawsze prostymi liniami lub znanymi krzywymi?
Jeśli tak, to zamiast próbować poprawnie ustawić każdy piksel wzdłuż krawędzi, użyłbym transformacji Hougha, aby uzyskać równania linii, a następnie odtworzyć kontury z linii i iteracji
źródło