wyszukiwanie pionowych linii

0

witam.
pytanie jak w temacie, na pewno ktos wie, a ja sie nad tym mecze.. jak w takim obrazku <ort>znaleŹĆ </ort>tylko te 5 pionowych linii? dodam ze linii poziomych moze byc wiecej niz na tm obrazku;/

user image

dziekuje ;]
pozdrawiam

0

Jeśli masz pewność, że obrazek jest we właściwej pozycji i zawsze monochromatyczny, to proponuję pętlą przelecieć przez wszystkie linie poziome i policzyć ile w każdej jest białych pikseli, po których bezpośrednio znajdują się czarne. Wartość najczęstsza będzie wynikiem.

Jeśli obrazek jest zaszumiony, proponuję wcześniej zastosować rozmycie lub - aby nie wprowadzać nowych odcieni do obrazka - medianę.

0

możesz sprawdzić, czy zaczynając od białego piksela u góry, jesteś w stanie przejść na dół nie skręcając (średnio) pod kątem większym niż arctg(wys/szer). punkt startu to każdy biały piksel pierwszego rzędu, przed (albo za, ale nie przed lub za jednocześnie) którym występuje czarny. punkt stopu - osiągnięcie ostatniego rzędu (sukces) lub niemożność znalezienia sąsiedniego białego znajdującego się pod kątem (liczonym od punktu startu, a nie od poprzedniego punktu) mniejszym, niż podany wcześniej arctg (porażka).

0

Co to znaczy pionowych wg Ciebie ? Musisz przyjąć jakąś tolerancję (pochylenie graniczne). Jakbyś to jakimś algorytmem zamienił na wektor, to potem było by już z górki (przecięcie + odrzucenie tych co nie spełniają warunku granicznego pochylenia). Jeśli chcesz operować na rastrze (bitmapie), to jest wiele kwestii. M. in. nadmienione szumy. Może Ci się trafić "dziurka w linii". Algorytm Szczawik'a nie jest zły, ale może się nie sparwdzić przy większym zagęszczeniu linii poziomych. Trzeba by go jakoś ulepszyć. Przyjmując np jakąć grubość graniczną (w pixelach) linii. Jeśli skanujesz którąś linijkę i białe przekroczą tą graniczną wielkość to tą linijkę odrzucasz ze statystyki bo może zakłamywać. Gdzieś kiedyś widziałem taki algorytm (nie wiem jak się fachowo nazywa), który odchudzał takie obrazki, pozostawiając linie o grubości 1-pixelowej - może warto było by go zastosować.

0

Jeśli każda pionowa linia łączy górny brzeg rysunku z dolnym - masz prosto.

  1. wyznaczasz "białe" punkty na górnej stronie bitmapy, to samo - na dolnej.
  2. każda linia ma określoną grubość - więc ma lewą i prawą krawędź. Ich równania wyznacza się z prostych zależności
  3. przyjmujesz wyznaczone krawędzie jako brzegi, od których "w lewo" i "w prawo" zamalowujesz każdy biały piksel

Mam nadzieję, że rozumiesz, nie chce mi się męczyć z tym edytorkiem i wpisywać wzorów, jak coś - dopytaj.

0

A jak mu się trafi pozioma linia na samej górze, albo na samym dole rysunku : ) ? Albo z dołu będzie wychodziła jakaś ukośna która nie kończy się u góry ...

Mało precyzyjne informacje na temat danych wejściowych

0

Odniosłem się do przykładu, a Ty utrudniasz :) No ale bez większych komplikacji można "ulepszyć" algorytm:

  1. pozioma linia na górze lub na dole - skanujemy linia po linii coraz niżej/wyżej, aż napotkamy linię nie składającą się wyłącznie z białych punktów, wtedy jedziemy algorytmem jak w poprzednim poście. Jeśli to jest linia "pofalowana" - sorry Winnettou, bez zaprzęgania zaawansowanych metod analizy obrazu nie wyrobi.

  2. jeśli linie mogą się kończyć na bokach, ale nie mogą się krzyżować - przypadek trywialny, do przelecenia dochodzą boczne krawędzie. Jeśli mogą - uwaga jak wyżej :)

0

Po co tak komplikujecie. Szczawik podał bardzo prosty i do tego skuteczny sposób, jeśli obrazki mają podobne cechy do tego przykładowego.

npeb, dałbyś jeszcze kilka przykładów, jakieś skrajne przypadki zniekształcenia, ale stawiam, że sposób Szczawika spokojnie wystarczy.

0

adf - z powodu ortografa w treści postu nie wiadomo, czy chodzi o POLICZENIE - wtedy Szczawika patent wystarczy - czy o wyplucie RYSUNKU bez linii poziomych - wtedy patent Szczawika jest o kant. Więc, jak widzisz, nikt tu nie kombinuje, tylko Ty zawężasz :P

// najedź myszką na tego orta... - Ł

0

Aby znaleźć ich pozycję można zrobić tak:
Wykryć tak jak szczawik pisał lewe i prawe krawędzie białych kresek i przeprowadzić regresje. Wartości mocno odbiegające od średniej odrzucić. Również odrzucić te linie, w których kreski są zbyt grube lub ich ilość jest różna od ilości średniej.
Wartości skrajne można odrzucić korzystając ze wstępnej linii średniej liczonej ze wszystkich punktów. Krok ten można powtórzyć, to linia będzie dokładniejsza.

0

ŁF - dzięki, nie wpadłem na to : )
adf - sposób, który zaproponowałem jest chyba najprostszy, nie musisz skanować całego obrazka : )

Temat chyba już się wyczerpał : )

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