Wydzielanie obiektów z obrazu

0

Witam! :)

Muszę napisać algorytm do podziału obrazu jednobitowego (tylko 2 kolory) na n obrazów gdzie n równa się liczbie obiektów zawartych na tym obrazie.

Przykład:
Obraz źródłowy:
user image
Obrazy wynikowe:
user image | user image | user image

Mój pomysł to wykorzystanie algorytmu do wypełniania obszaru. W pętli lecę po pikselach i jeśli znajdę jakiś czarny, to w tym miejscu odpalam ów algorytm wypełniania obszaru - z tym że oprócz zamiany tego obszaru na biały (tak aby zniknął i nie brał już udziału w dalszym wyszukiwaniu kolejnych obiektów) byłby również zapalany piksel w nowym obrazie o takich samych współrzędnych. W ten sposób jak gdyby przeniosę obiekt na drugi obraz.

Po zakończeniu działania algorytmu (po przeniesieniu obiektu) kontynuuję skanowanie pierwotnego obrazu (już bez tego obiektu) w poszukiwaniu kolejnego czarnego piksela. I tak do ostatniego elementu obrazu.

W efekcie powinienem uzyskać to, czego oczekuję. Jeszcze tego nie testowałem z braku sprzętu ale może znacie jakieś inne podejście - może lepsze, optymalniejsze, prostsze.

Będę wdzięczny za pomysły, przykłady, przemyślenia.

Całość ma powstać w Matlabie, ale jeśli ktoś chciałby podać jakiś kod, to będę wdzięczny za jakikolwiek język: PseudoJęzyk, C, Pascal - poradzę sobie :).

0

Twój pomysł z Flood-fill'em wydaje się być sensowny (jeżeli tylko nie musisz rozpoznawać figur, tj tworzyć meta-plików). Zrobiłbym to dokładnie tak jak to opisałeś. Jeżeli tylko figury nie będą "dziergane" tzn

[code]







[/code]

to algorytm powinien działać bez najmniejszego problemu.

0

Jeżeli tylko figury nie będą "dziergane"

No tak - zapomniałem napisać, że sąsiedztwo pikseli po ukosie jest uznawane ze ten sam obiekt. Więc jeśl mamy 2 obiekty które stykają się nawet jednym narożnikiem 2 pixeli, to jest to uznane jako 1 obiekt.

0

Więc jeśl mamy 2 obiekty które stykają się nawet jednym narożnikiem 2 pixeli, to jest to uznane jako 1 obiekt.

Wypelnianie tez to obsluzy, pod warunkiem, ze wezmiemy 8 kierunkow zamiast 4.
//wiem ale dopisałem tę informację dla innych - m.M

Jakos zaden inny pomysl na razie tez nie przychodzi mi do glowy. Twoj jest zapewne skuteczny, ale jego wydajnosc wydaje sie byc nieciekawa :(

0

A gdyby zacząć od znalezienia czarnego punktu należącego do granicy (stykającego się z białum) i maszerowanie od niego "po granicy" aż znajdziesz się znów w tym punkcie? To pozwoliłoby Ci zdefiniować obiekt nieco szybciej zapewne. Choć nie wiem, czy nie stracisz później przy przenoszeniu/czyszczeniu z oryginału. No i zgubisz obiekty zagniezdżone... To chyba nie jest dobry pomysł.

0

W pomysle z flood fillem dobrze jest zrobic implementacje iteracyjna (stos), a nie rekurencyjna - to bedzie nieco szybciej.

0

W pomysle z flood fillem dobrze jest zrobic implementacje iteracyjna (stos), a nie rekurencyjna - to bedzie nieco szybciej.

Taki miałem zamiar - muszę tylko zamienić obsługę stosu na operacji na tablicy - bo to ma być w matlabie ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1