Usuwanie tła to jeden z problemów przetwarzania obrazów, który wydaje się być łatwy, a sprawia spore problemy.  W bibliotece OpenCV jest sekcja usuwania tła  w kontekście wideo. Pojawiają się tam funkcje typu: BackgroundSubtractorMOG , BackgroundSubtractorMOG2 czy BackgroundSubtractorGMG. Usuwają one tło z poszczególnych klatek tworząc maskę, którą można użyć do podświetlania interesujących nas obiektów. Z jednej strony te funkcje nie są idealne, z drugiej strony często posiadamy tylko dwie klatki, w których na jednej jest samo tło, a na drugiej mamy to samo tło z interesującym nas obiektem.  I chociaż możemy skorzystać z powyższych funkcji, to kusi skorzystanie z czegoś prostszego (może bardziej precyzyjnego).

 

Jeśli nasze klatki zawierają „laboratoryjnie” przygotowany obraz, czyli tło jest bez przesunięcia, a każdy piksel tła na jednym obrazie odpowiada pikselowi na drugim obrazie, również wartości tych pikseli są identyczne, sprawę można ograć funkcją compare. Oto jak można to zrobić:

Tworzenie maski zaczynamy od wrzucenia obrazu do cvtColor tworząc obraz jednowarstwowy, później obraz przechodzi przez węzeł compare z ustawionym code na CMP_NE.  Oprócz poszukiwanego śladu, mogą pojawić się artefakty w losowych miejscach, spowodowane one są kompresją. Niewielkie różnice w wartościach pikseli mogą zależeć od rodzaju kompresji oraz jej parametrów. Artefakty usuwamy funkcją erode. Tak przygotowaną maskę możemy wrzucić do bitwise i w efekcie można uzyskać obiekt bez tła.  Takie podejście jest autonomiczne i nie wymaga zmian parametrów dla innych przypadków.

 

Do usuwania tła jest też inna ciekawa metoda, oparta na funkcji watershed. Jest ona bardzo dokładna, jednak wymaga podania kluczowych regionów obiektu, który chcemy odseparować od tła.  Opiszę ją już następnym razem.