Jak znaleźć obrazek w obrazku?

0

Witam
mam dwa obrazki jpg czy tam bmp(bez róznicy ale załóżmy że bmp). Pierwszy obrazek ma np 25x25 a drugi 100x100 z tym że drugi obrazek zawiera w sobie w śorku gdzieś pierwszy obrazek, czyli rózni się wielkościa bo po bokach ma cos dodatkowo(mam nadzieje że niezbyt chaotycznie to opisalem ale juz mi sie nie chcialo rysować w paintcie aby to pokazać:)). Problem w tym że nie wiem jak moge programowo sprawdzić czy w drugim obrazku zawarty jest ten pierwszy? Są jakieś gotowe funkcje w frameworku do tego czy musze Pixel po pixelu spradzać? Dobrze by było gdyby procz samego wyszukania obrazka w obrazku funkcja zwracała jego pozycje w drugim. Jeżeli macie jakies pomysły bąx tez znacie ciekawe linki do stron które mogłby mnie nakierować to z góry thx bo ja już szukam od paru godzin i jedyne bliskie tego co szukam to znalazlem porównywanie dówch obrazkow czy sa identyczne:)

Pozdrawiam

0

W pare godzin mozna to dosc latwo napisac. Dla przyspieszenia mozesz:

  1. sprawdzac tylko obszar: 0, szer_duz - szer_mal; 0, wys_duz - wys_mal
  2. przeprowadzac sprawdzanie wstepne sprawdzajace piksele w narozach malego obrazka.

Acha, jest roznica czy to bmp czy jpeg. Przy tym drugim podczas zapisu wiekszego obrazka moga wyjsc inne kolory na wskutek kompresji, wiec oba obrazki (oryginalny maly i wycinek duzego) nie beda identyczne.

0

Jeśli chodzi o jpg to najlepiej dać pewien przedział np

Bitmap bmp1 = new Bitmap("obrazek1.jpg");
Bitmap bmp2 = new Bitmap("obrazek1.bmp"); //nie ma znaczenia format


//to w petli
Color pixel1 = bmp1.GetPixel(x1,y1);
Color pixel2 = bmp1.GetPixel(x2,y2);

if((Math.Abs(pixel1.R-pixel2.R)<10)&&(Math.Abs(pixel1.G-pixel2.G)<10)&&(Math.Abs(pixel1.B-pixel2.B)<10)) //to można przyjąć fragment za identyczny

else  //zanleziono niepasujący piksel

Dla obrazków o większej kompresji można zwiększyć dopuszczalny błąd z 10 do 20 albo wiecej (byle nie przesadzić)

0

Zn to ode mnie będzie zależało jakie to obrazki będą ponieważ duży będzie z printscreena zdjęty i moge zapisać albo do bmp albo jpg a drugi właściwie tak samo z tym że będzie to tylko mała część tego dużego także moge zapisać do bmp/czy jpg z tym że na jpg chyba powinno to szybciej działać bo mniej zajmują ale myślałem też czy bys ie nie dało po prostu zamienić tych dwóch obrazków na ciag bajtów i wyszukać jednego ciągu w drugim?

0
Image napisał(a)

myślałem też czy bys ie nie dało po prostu zamienić tych dwóch obrazków na ciag
bajtów i wyszukać jednego ciągu w drugim?

Zdaje się, że to Ci właśnie zaproponowałem na drugim forum.

0
somekind napisał(a)

Zdaje się, że to Ci właśnie zaproponowałem na drugim forum.

no tak dokładnie a mógłbys mi napisać przykładowe nazwy tych algorytmów? bo po skrótach które podałeś nie moge znaleźć a jak szukam wyszukiwanie ciagu w ciagu to też z marnym rezultatem, a wydaje mi się że metoda ta będzie szybsza po prostu niz sprawdzac pixel po pixelu jeżeli będzie sie tak dało
z góry dzieki :)

0

Nie wierzę, że wpisałeś "algorytm KMP" do Google i nic nie znalazło.

0

Sory nie patrzyłem tego akurat już go sprawdziłem jednak jest to troche czasochłonne na małych obrazkach troche to zajeło i nic nie znalazło tak więc lepiej jest jednak wyszukiwać pixel po pixelu, miałem tylko nadzieje że juz to ktos uskrobał i opublikował wcześniej w necie ale trudno biore sie do roboty dzieki</quote>

0

Wyszukiwanie jednego ciagu w drugim troche odpada, chyba ze liniami. BMP bedzie szybciej, bo jpg musi zostac zdekompresowany do postaci bmp wlasnie. Niewielka roznica wprawdzie, ale jednak.

0

Tak, popierniczyło mi się, wyszukiwanie wzorców nic tu nie da, bo i tak trzeba uwzględniać współrzędne.

0
johny_bravo napisał(a)

Wyszukiwanie jednego ciagu w drugim troche odpada, chyba ze liniami.

somekind napisał(a)

Tak, popierniczyło mi się, wyszukiwanie wzorców nic tu nie da, bo i tak trzeba uwzględniać współrzędne.
Można wyszukiwać wzorzec, trzeba tylko rozszerzyć algorytm na przypadek dwuwymiarowy:
http://www.google.pl/search?q=two+dimensional+pattern+maching
http://www.google.pl/search?q=dwuwymiarowy+rabin+karp&btnG=Szukaj&lr=
etc.

@Image: jeśli format jest dowolny to radzę nie utrudniać sobie życia i użyć formatu bezstratnego, może nie BMP bo dużo waży, ale np. PNG.

0

Wyszukiwanie ciągu bajtów da efekt jedynie w przypadku nieskompresowanych obrazków. Należy pamiętać, że każda kompresja może utworzyć odrobinę inny obrazek i nie ma pewności, że jakiś bajt się nie zmieni. Szczególnie jeśli nie są to identyczne obrazki, a np. jeden obrazek jest fragmentem innego.

0
hubert_nnn napisał(a)

Wyszukiwanie ciągu bajtów da efekt jedynie w przypadku nieskompresowanych obrazków. Należy pamiętać, że każda kompresja może utworzyć odrobinę inny obrazek i nie ma pewności, że jakiś bajt się nie zmieni. Szczególnie jeśli nie są to identyczne obrazki, a np. jeden obrazek jest fragmentem innego.
Przecież sam pisałeś, że można to rozwiązać stosując pewien margines błędu podczas porównania :|

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