Przetwarzanie obrazu: Jak wykryć czterostopniowy szyld na obrazie?


14

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


2
Słowa kluczowe: opencv, hough transform Duplikaty: stackoverflow.com/questions/1817442 stackoverflow.com/questions/2068013

Tak, choć przekształcić FTW!

ale na obrazie widać szum, w jaki sposób mogę dowiedzieć się, która granica jest szyldem

@ xabi123: transformacja hougha, próg, odczyt granicy

1
Czy możesz udostępnić przykładowy obraz?

Odpowiedzi:


7

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:

  • Tam znak tła ma (prawie) stałą jasność
  • Zajmuje względnie duży obszar obrazu
  • Jest blisko środka obrazu

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.

src = Import["http://www.freeimagehosting.net/uploads/720da20080.jpg"];
pixels = ImageData[ColorConvert[src, "Grayscale"]];
gradient = Sqrt[GaussianFilter[pixels, 5, {1, 0}]^2 + GaussianFilter[pixels, 5, {0, 1}]^2];
gradient = gradient/Mean[Flatten[gradient]];

Implementacja OpenCV: Możesz użyć sepFilter2Ddo faktycznego filtrowania, ale najwyraźniej będziesz musiał samodzielnie obliczyć wartości jądra filtra .

Wynik wygląda następująco:

wielkość gradientu

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.

binaryBorders = Binarize[Image[gradient], 0.2];
sign = DeleteBorderComponents@ColorNegate[binaryBorders];
largestComponent = SortBy[ComponentMeasurements[sign, {"Area", "ConvexVertices"}][[All, 2]], First][[-1, 2]];

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: wprowadź opis zdjęcia tutaj wprowadź opis zdjęcia tutaj


0

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).


hmm .. co zrobić, jeśli szyld jest obrócony lub kamera jest obracana?
Mustafa

0

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:

  • wykryj tekst na obrazie . Nie musi to być solidna implementacja (powinieneś być w stanie przejrzeć małą bibliotekę Google, która to robi, a może OpenCV to ma), tylko przybliżone oszacowanie tekstu na obrazie
  • znajdź cener wszystkich wykrytych tekstów . Nawet przy hałaśliwym obrazie powinno to być wokół prawdziwego miejsca
  • wykonaj dekompresję prostokątną Hough na obszarze wokół wykrytych tekstów . Może użyć środkowej odległości od środka wykrycia tekstu lub czegoś podobnego. Wykonuj różne średnice i przywołaj najsilniej .

Wyjaśnienia i zalety:

  • obszar wokół tekstu jest zwykle jednorodny - prawdziwy prostokąt powinien być pierwszym silnym przypomnieniem
  • w ten sposób nie musisz przeprowadzać transformacji hough na całym obrazie, więc możesz to zrobić bardziej thuralnie (może wiele razy na tym samym obszarze, ale z różnymi rozmiarami wiadra ...)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.