zwiększ bardzo mocno kontrast obrazka (jak bardzo - musisz to sprawdzić doświadczalnie) i/lub zmień kolory na monochromatyczne (tak samo musisz potraktować wszystkie obrazki wzorcowe). następnie usuń z obrazka wszystkie jasne obszary mniejsze od kilku procent powierzchni. na koniec policz korelację (algorytmów jest kilka, znajdź sobie najbardziej odpowiedni, np. http://local.wasp.uwa.edu.au/~pbourke/miscellaneous/correlate/) między obrazkami, wybierz ten o największym współczynniku, jeśli współczynnik dla niego jest odpowiednio wysoki (zgaduję, że więcej niż 0,7), to wygrałeś.
do ćwiczenia polecam matlaba, gdzie będziesz mógł wszystko sprawdzić nie bawiąc się w szczegóły implementacyjne.
w drugiej, prostszej ale też i prymitywnej opcji robisz tak: najpierw jak wyżej, zwiększ bardzo mocno kontrast obrazka (jak bardzo - musisz to sprawdzić doświadczalnie) i/lub zmień kolory na monochromatyczne (tak samo musisz potraktować wszystkie obrazki wzorcowe). potem
Kopiuj
pętla po każdym z wzorcowych obrazków W
{
pętla zmieniająca obrazek W od rozmiaru np. 10% mniejszego wymiaru obrazka D do 50% mniejszego wymiaru obrazka D (skok o kilka-kilkanaście procent)
{
pętla po szerokości dużego obrazka D (skok o kilka procent szerokości)
{
pętla po wysokości dużego obrazka D (skok o kilka procent wysokości)
{
p = ile procent obrazka W zgadza się z leżącym pod nim obrazkiem D;
p > największe_p ?
{
zapamiętaj p jako nowe największe_p;
zapamiętaj obrazek W;
zapamiętaj współrzędne;
nowe p większe od np. 90%? bardzo duża korelacja, pewnie znaleźliśmy właściwy obrazek, wyjdź ze wszystkich pętli;
}
}
}
}
}
ośmiokąt i okrąg to prawie to samo, do tego okrągłe są zarówno znaki zakazów, jak i nakazów,
warto więc dla okręgu sprawdzić kolor znaku: korzystając z zapamiętanych współrzędnych i wiedzy
o środku obrazka W przesuwamy się po oryginalnym (przed usunięciem kolorów) obrazku i liczymy
średnią po kilkunastu/kilkudziesięciu pikselach, jeśli w średniej dominuje niebieski, to jest to
znak nakazu, jeśli czerwony, to znak stop (zakaz wjazdu ma w środku białą krechę), biały/szary,
niebieski lub czerwony z dużym dodatkiem niebieskiego to nakaz.
problem można trochę uprościć pozbywając się skalowania wzorca i modląc się, żeby wzorzec i znak na zdjęciu odpowiadały sobie wielkością.
tak czy inaczej problem jest niebanalny i wydaje mi się, że jeśli będziesz próbował go rozwiązać pierwszą metodą i nie uda Ci się, ale będziesz umiał wytłumaczyć i uzasadnić algorytm wykładowcy/ćwiczeniowcowi, to i tak zaliczy.
poczytaj koniecznie o szukaniu wzorca w obrazku. algorytmów jest sporo, być może korelacja nie jest najprostszym (choć na pewno nie jest najtrudniejszym) i znajdziesz coś łatwiejszego.
matlab na pewno ułatwi Ci pracę na etapie szukania rozwiązania (ma zaimplementowane tysiące funkcji matematycznych i nie tylko, w tym te do liczenia korelacji).