Jak mogę wykryć czworoboczny szyld z obrazu zarejestrowanego za pomocą telefonu komórkowego? Jak mogę wykryć kształty takie jak prostokąt? zaokrąglony prostokąt (zaokrąglone rogi zamiast kształtów)?
Korzystam z opencv.wrapper, ale jestem nowy.
Dzięki.
Oto przykład: alt text http://www.freeimagehosting.net/uploads/b03442fd36.png
alt text http://www.freeimagehosting.net/uploads/e6b36040e8.png
Ze względu na hałas i wiele linii tam nie jestem w stanie określić, która linia graniczna szyldu. Czasami mogę znaleźć granicę linii po transformacji Hougha. Jestem uwięziony ... w tego rodzaju scenariuszu ...
To są 2 surowe zdjęcia zrobione aparatem telefonu komórkowego
tekst alternatywny http://www.freeimagehosting.net/uploads/6dbd613edf.jpg tekst alternatywny http://www.freeimagehosting.net/uploads/720da20080.jpg
Potrzebuję porady, aby zobaczyć, jak mogę przetworzyć obraz, aby uzyskać szyld?
Dziękuję Ci bardzo
Odpowiedzi:
Oba obrazy zawierają wiele linii, które nie mają nic wspólnego ze znakiem, którego szukasz. I niektóre z tych linii są dłuższe / mają wyższy kontrast niż linie, których tak naprawdę chcesz, więc myślę, że wykrywanie linii krawędzi (np. Przy użyciu transformacji Hougha lub poprzez sumowanie kontrastów poziomo / pionowo) nie będzie działać.
Ale: Znak, którego szukasz, ma inne cechy, które powinny być łatwiejsze do wykrycia:
Więc szukasz dużego połączonego obszaru o niskim kontraście. Zhakowałem algorytm weryfikacji koncepcji w Mathematica. (Nie jestem ekspertem od OpenCV, ale kiedy je znam, wspomnę o odpowiedniej funkcji OpenCV.)
Najpierw używam filtrów pochodnych gaussowskich do wykrywania wielkości gradientu na każdym pikselu. Filtr pochodnej gaussowskiej ma szeroki otwór (w tym przypadku 11 x 11 pikseli), więc jest bardzo odporny na zakłócenia. Następnie normalizuję obraz gradientu do średniej = 1, więc mogę zastosować te same progi dla obu próbek.
Implementacja OpenCV: Możesz użyć
sepFilter2D
do faktycznego filtrowania, ale najwyraźniej będziesz musiał samodzielnie obliczyć wartości jądra filtra .Wynik wygląda następująco:
Na tym zdjęciu tło znaku jest ciemne, a granice znaku są jasne. Więc mogę binaryzować ten obraz i szukać ciemnych komponentów.
Implementacja OpenCV: Progowanie powinno być proste, ale myślę, że OpenCV nie zawiera analizy połączonych komponentów - możesz do tego użyć wypełnienia zalewowego lub cvBlobsLib .
Teraz znajdź największą kroplę w pobliżu środka obrazu i znajdź wypukły kadłub (po prostu użyłem największej kropli, która nie jest połączona z tłem, ale może to nie wystarczyć dla każdego obrazu).
Wyniki:
źródło
Innym podejściem, które można zastosować, które jest bardziej odporne na szumy w tej sytuacji, jest wygenerowanie krzywej średniego poziomu szarości obrazu wzdłuż osi X i wzdłuż osi Y. Oznacza to, że obliczyć średni poziom szarości dla każdej linii / kolumny na obrazie.
Jeśli na przykład szyld (lub jego obramowania) jest jaśniejszy niż jego otoczenie (co ma miejsce w przypadku wszystkich przykładów pokazanych w pytaniu), na krzywej osi X (dla lewej i prawej oraz granic) będą widoczne dwa piki ) i dwa szczyty w tobie krzywej osi y (dla górnej i dolnej granicy). Używając techniki wykrywania obramowania dla sygnału 1-wymiarowego (być może filtra górnoprzepustowego), możesz wydedukować współrzędne narożników szyldu.
Widziałem to podejście stosowane do wykrywania tablic rejestracyjnych, a także do rozpoznawania twarzy (nos zwykle jest jaśniejszą częścią twarzy, więc generuje pik na krzywych osi x i osi y).
źródło
To może być trochę do góry nogami pomysł, ale warto go wypróbować. Zamiast próbować wykryć prostokąt i myśleć o tekście jak szumie , być może możesz potraktować tekst jak informację i użyć go do łatwiejszego wykrycia prostokąta.
Oto zarys pomysłu:
Wyjaśnienia i zalety:
źródło