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ć 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.
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: