Jak usunąć określone tło z obrazu?

11

Pomarańczowy

To był obraz uzyskany po filtrowaniu Gabora ... Czy istnieje jakiś sposób na usunięcie linii wewnątrz obrazu oprócz jasnej białej zaokrąglonej wady.

Czy spróbowałem innej orientacji filtra gabor, uzyskaliśmy następujący wynik:

wprowadź opis zdjęcia tutaj

Po progowaniu: co jest wystarczające, ale nie świetne

wprowadź opis zdjęcia tutaj

Po filtrowaniu medianowym:

wprowadź opis zdjęcia tutaj

Z góry dziękuję

vini
źródło
2
Dobra robota z filtrem mediany. Jesteś na dobrej drodze.
Rethunk
To wydaje się być dobrym scenariuszem dla zastosowania filtra dyfuzyjnego. Spróbuj też pytać w: <br/> dsp.stackexchange.com/ <br> photo.stackexchange.com/ <br>
Danny Varod
Czy zastosowałeś filtr mediany po progu? Jeśli tak, spróbuj bez progu.
Danny Varod,
Tak, wypróbowałem to po przekroczeniu progu i uzyskałem prawie taki sam wynik, kiedy to zrobiłem wcześniej
vini

Odpowiedzi:

12

Jeśli dane wyjściowe filtra Gábora są wiarygodne, a zmienność danych obrazu nie jest tak duża, że ​​wynik wygląda zupełnie inaczej, możesz zastosować następujące podejście (jego części, o których już wspomniano):

  1. Binaryzuj swój drugi obraz za pomocą dowolnego algorytmu automatycznego progowania. Jak widać, zakres progów, które będą działać, jest duży.

  2. Użyj algorytmu oznaczania składników, aby oznaczyć każdy podłączony region piksela unikalną wartością.

  3. Oblicz dla każdego elementu obrazu właściwość, która opisuje, jak blisko jest twój obiekt do wypełnionego koła. W tym celu możesz użyć na przykład zwartości . Użyłem poniżej ułamka pikseli w równoważnym promieniu dysku . Ten promień jest promieniem dysku o takim samym obszarze, jaki miałby Twój obiekt.

    1. Obszar po prostu liczy liczbę pikseli twojego obiektu
    2. Obliczanie promienia okręgu na podstawie jego obszaru również powinno być możliwe do zarządzania
    3. Dla piksela w tym promieniu potrzebujesz środka każdego obiektu obrazu, ale to tylko średnia ze wszystkich pozycji obiektu-pikseli. Jeśli jesteś fizykiem, znasz środek masy kilku mas punktowych. To jest równoważne.
    4. Teraz obliczasz dla każdego piksela każdego obiektu odległość od jego środka i sprawdzasz, czy jest mniejszy niż promień okręgu. Dzieląc dwie liczby, otrzymujesz ułamek piksela wewnętrznego i zewnętrznego.
  4. Weź obiekt o najwyższej frakcji. Uwaga: obiekty z tylko jednym pikselem otrzymają wartość 1. Więc powinieneś ustawić próg wielkości i brać tylko obiekty większe, powiedzmy 10 pikseli.

Aby zobaczyć, że automatyczna binaryzacja powinna działać, oto wyniki dla bardzo niskiego i bardzo wysokiego progu:

wprowadź opis zdjęcia tutaj wprowadź opis zdjęcia tutaj

Zaktualizuj etykietowanie komponentów

Wybór oznakowania komponentu nie jest krytyczny dla twojej aplikacji. Sugerowałbym, abyś musiał wdrożyć go samodzielnie, aby zastosować bardzo prostą metodę. Wersja jednoprzebiegowa ze strony Wikipedii jest bardzo łatwa. Zasadniczo iterujesz przez obraz binarny, a kiedy napotykasz piksel, który jest biały i nie jest jeszcze oznaczony, używasz nowej etykiety dla tego obiektu i zaczynasz od tego piksela.

Proces znakowania tego obiektu etykietą jest zasadniczo podobny do wypełnienia zalewowego. To jest na stronie Wikipedii wewnętrzne kroki 1-4 w algorytmie. Zaczynasz od tego piksela oznaczonego i umieszczasz wszystkich jego sąsiadów na stosie (użyli wektora ). Dla piksela na stosie sprawdzasz, czy jest on na pierwszym planie i nie jest już oznaczony. Jeśli musisz go oznaczyć, ponownie umieszczasz wszystkich jego sąsiadów na stosie. Rób to, dopóki twój stos nie będzie pusty.

Następnie kontynuuj skanowanie obrazu. W przeciwieństwie do opisu na stronie Wiki, nie musisz usuwać piksela z oryginalnego obrazu, po prostu przeskakujesz, gdy masz wartość inną niż 0 w obrazie etykiety.

halirutan
źródło
do jakiego algorytmu etykietowania, którego dotyczysz tutaj?
vini
1
@vini, zaktualizowałem swój post. Phonon, dzięki. Używamy wielu miar morfologicznych, a zwłaszcza zwartość była bardzo przydatna jakiś czas temu.
tak świetnie mam :)
vini
6

Kilka pomysłów:

  1. Filtruj krawędzie na podstawie gęstości wytrzymałości krawędzi. Korzystając z aproksymacji okrągłego jądra, znajdź średnią siłę krawędzi (lub inną miarę). Przejdź przez dowolne krawędzie na poziomie lub powyżej wartości progowej, ustaw kolor czarny na wszystkie krawędzie poniżej progu.
  2. Użyj morfologicznej operacji „zamknij” (rozszerz, a następnie erozji), aby oczyścić obraz, a następnie użyj algorytmu znakowania regionu (inaczej połączonego komponentu, obiektów blob), aby znaleźć wszystkie obiekty BLOB. Filtruj dane obiektów blob według rozmiaru, stosunku osi głównej do pomocniczej itp.
  3. Wypróbuj rozmycie gaussowskie, znajdź próg binaryzacji, aby podzielić światło na ciemne, a następnie odfiltruj plamy, jak opisano w kroku 2 powyżej. (Aby szybko przybliżyć rozmycie gaussowskie, ściśnij powieki najczęściej zamknięte i zmrużysz oczy na obrazie.)
  4. Wypróbuj kilka filtrów w Photoshopie lub GIMP.

EDYCJA: po kroku filtrowania mediany jesteś na dobrej drodze. Dobra robota! Punkt 2, który zasugerowałem powyżej (zamknij, a następnie oznaczenie regionu) to jedna technika, która zabierze Cię do końca.

Rethunk
źródło
yup spróbuje, abyś wiedział, co się stanie
vini
1

Możesz wypróbować aktywne kontury. Chociaż może być powolny, może poradzić sobie z takimi skomplikowanymi przypadkami.

Możesz też użyć wcześniejszej wiedzy do przetworzenia tego obrazu. Na przykład wiesz, że obiekt blob jest „duży” i „połączony”. Tak więc, licząc liczbę każdego połączonego regionu, możesz go znaleźć.

pułapka
źródło