Problem segmentacji obrazu różnych materiałów


15

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ć. Przykład 1 przyklad 2 przyklad 3 przyklad4

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. przyklad 2

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, removeibridge
  • bwlabeldo 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?

Krawędzie szkła Gwiazda


Czy próbowałeś adaptacyjnego progu? Nie wydajesz się o tym wspominać. Myślę, że OTSU powinien jakoś działać po usunięciu hałasu, ale może próg adaptacyjny jest lepszy.
Rui Marques,

Cześć Rui, próbowałem adaptacyjnego progowania z tym rozszerzeniem Matlab: Adaptacyjne progowanie Oto wyniki zabawy z parametrami okna: 1. próba 2. próba 3. próba Jak widać, wraz ze wzrostem parametrów środkowa część zmienia kolor z białego na czarny (co jest dobre, imho), ale reszta tła zmienia się również w czerń, co jest złe.
mchlfchr

3
Czy wypróbowałeś podstawowe techniki redukcji obrazu? Na przykład odejmując korektę pola płaskiego, aby pozbyć się tego zaciemnienia w prawym górnym rogu ( en.wikipedia.org/wiki/Flat-field_correction ). Ponadto, jeśli cząstki są statyczne, zostaną natychmiast usunięte. Następnie możesz użyć dowolnej metody wykrywania krawędzi ...
PhilMacKay

Cześć Phil, o ile mi wiadomo i jak wiem, istnieje seria zdjęć, które są kręcone, zanim obiekt dostanie się do pieca. Rodzaj kalibracji jest tutaj. W poniedziałek porozmawiam z fizykiem odpowiedzialnym za CCD i środowisko. Ale dzięki za radę, dam temu szansę!
mchlfchr

Drugie dodane zdjęcie wygląda zupełnie inaczej. Czy możesz opublikować wszystkie możliwe obrazy?
Andrey Rubshtein

Odpowiedzi:


2

Możesz spróbować:


Cześć oli, jeśli chodzi o rzadkie metody: czy możesz bardziej szczegółowo określić, jakich metod tego kodu powinienem użyć? Nie jestem bardzo zagłębiony w tę sekcję i nie znalazłem czegoś pomocnego w dokumentach dotyczących usuwania szumów lub rozmycia ... Z góry dziękuję.
mchlfchr

1
Można znaleźć wersję „łatwiejszą w użyciu”, tam: lear.inrialpes.fr/people/mairal/denoise_ICCV09.tar.gz
oli

przepraszam, że narzekam innym razem ;-) ... czy masz również źródła Win32? Jeszcze raz dziękuję!
mchlfchr

Obawiam się, że nie ...
oli

2

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)

wprowadź opis zdjęcia tutaj

Spójrz na wszystkie wartości w pierwszej grupie:

wprowadź opis zdjęcia tutaj

Aby znaleźć tryby w histogramie trójmodalnym, można użyć grupowania K- z K=3intensywnością. Poniższy kod Matlab znajduje się th1=67w 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.

wprowadź opis zdjęcia tutaj

function [th1,th2]=SegmentHistTo3()
    im = imread('http://i.stack.imgur.com/U2sc5.png');
    h = imhist(im(:,:,1)); %# Calculate histogram

    th1new = round(256/3); %# Initial thresholds
    th2new = round(256*2/3);
    th1 = 0;
    th2 = 0;

    while (th1~=th1new) || (th2~=th2new) %# While the centroids keep on moving
        th1 = th1new;
        th2 = th2new;

        wa1 = WeightedAverage(h,1,th1);  %# Calculate 3 weighted averages
        wa2 = WeightedAverage(h,th1+1,th2);
        wa3 = WeightedAverage(h,th2,numel(h));

        th1new = round( (wa1+wa2)/2 );  %# The thresholds are middle points between the averages
        th2new = round( (wa2+wa3)/2 );
    end

    figure; hist( double( reshape(im(:,:,1),1,[]) ),256);
    hold on;
    plot( [th1 th1],[0 max(h)],'r','LineWidth',2);
    plot( [th2 th2],[0 max(h)],'r','LineWidth',2);

    figure;imshow( im(:,:,1)<th1);
end

function wa = WeightedAverage(region,th1,th2)    
    regionNonEmpty(th1:th2) = region(th1:th2);
    wa = sum( regionNonEmpty .* (1:numel(regionNonEmpty))) / sum(regionNonEmpty);    
end

Późniejsze rozwiązanie problemu to bułka z masłem, wystarczy wykonać proste operacje morfologiczne, takie jak otwieranie.


1
Cześć Andrey, ale jak mam dokonać uogólnienia tego progu, o którym wspomniałeś? Dostałem kilka skrzynek, nie tylko tę i wciąż potrzebuję automatyzacji. A Próg Otsu (funkcja w Matlabie) nie dał mi dobrych wyników. Jakieś dalsze wskazówki? Z pozdrowieniami
mchlfchr,

Cześć, jeszcze raz dzięki, ale kod nie działa. Pojawi się pusty ekran z rysunkami. Wypróbowałem to z moimi oryginalnymi danymi (mapami bitowymi) i PNG, który opublikowałeś powyżej. Tymczasem
debuguję

@mchlfchr, masz zestaw narzędzi do przetwarzania obrazu? Jeśli tego nie zrobisz, możesz zmienić imhistnahist
Andrey Rubshtein

@mchlfchr, proszę zobaczyć zaktualizowaną wersję
Andrey Rubshtein

Andrey, jeśli wstawię oryginalny plik bitmapy, wyniki będą takie, jak wspomniałem w moim poście źródłowym. Może dzieje się tak w przypadku rozdzielczości? Obraz źródłowy ma 576 x 768 pikseli i skalę szarości (256). Oto wyniki, jeśli użyję twojej funkcji z moim oryginalnym obrazem: i.imgur.com/UXALJ.png histogram-liczba twojej funkcji: i.imgur.com/7RiPP.png Dziękujemy za pomoc! pozdrowienia
mchlfchr,

1

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.


Cześć Yves, preferowane jest automatyczne przetwarzanie. Aspekt DOF jest interesujący, ale nie jestem pewien co do metody Otsu, ponieważ sam Otsu nie działa dobrze. Czy dobrze rozumiem, że chcesz wybrać losowe obszary obrazu, a następnie przekroczyć wartość średnią dla wszystkich wybranych obszarów? Z poważaniem
mchlfchr,

1

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


Witamy w dsp.se :) Dziękujemy za pomoc, podałeś miłą odpowiedź. Jeśli chcesz uczynić to jeszcze lepszym, myślę, że interesujące byłoby udzielenie odpowiedzi na niektóre z tych pytań: Dlaczego uważasz, że to najlepsze podejście (np. Czy masz osobiste doświadczenie z tecnhique)? Które z sugerowanych już podejść działałoby dobrze w połączeniu z twoją sugestią? Podaj krótkie wyjaśnienie techniki lub, jeśli masz czas, spróbuj dostarczyć wyniki eksperymentalne, korzystając z techniki na dostarczonych przykładowych obrazach. I baw się dobrze na dsp!
penelopa

@mkuse, ponieważ być może przeczytałeś początkowy post, próbowałem już aktywnych konturów w połączeniu z redukcją szumów i mapami krawędzi. wyniki były złe i źle działały w przypadku dużych obrazów.
mchlfchr

co powiesz na techniki redukcji hałasu. Ich
mkuse

1
@mkuse, wspomniałem już o mechanice, którą opublikowałeś w pliku PPT w moim pierwszym poście. Zredagowałem swój pierwszy post, aby wyjaśnić, jakiego rodzaju filtrów użyłem.
mchlfchr

0

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.


Cześć Dave, próbowałem Otsu, ale przynosi efekt, że prawe górne tło łączy się z obiektem, co jest absolutnie niedopuszczalne.
mchlfchr

Cześć Dave, Hough nie jest opcją, ze względu na wymagania dotyczące czasu wykonywania i, o ile mam wiedzę na temat HT, jest to bardzo czasochłonne w przypadku dużych obrazów.
mchlfchr

0

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


1
Jak już wspomniałem: potrzebuję podejść w pobliżu w czasie rzeczywistym. I o ile wiem, HT jest bardzo czasochłonne. Innym aspektem jest to, że nie znam krzywych, a linie nie zawsze są proste. Kontur zależy od materiału, który znajduje się w piecu (więcej informacji znajduje się w poście o moim pochodzeniu).
mchlfchr

W przypadku linii prostych jest dość szybki, a jeśli z grubsza wiesz, gdzie są linie (np. Z poprzedniej klatki), możesz przeszukać tylko tę przestrzeń parametrów
Martin Beckett,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.