Portál AbcLinuxu, 9. května 2025 03:13

Dotaz: Jak najit pozici obrazku v screenshotu

Gilhad avatar 17.12.2011 22:54 Gilhad | skóre: 20 | blog: gilhadoviny
Jak najit pozici obrazku v screenshotu
Přečteno: 456×
Odpovědět | Admin
Mam program v pythonu, ktery sejme screenshot. Ted potrebuju v tom screenshotu najit souradnice obrazku (nebo zjistit, ze tam neni).

Obrazek byl vyriznut z jineho screenshotu, takze staci hledat na presnou shodu.

Samozrejme se da zacit prochazet screenshot po souradnicich a proste to brutal-force zkouset, ale to trva celkem dlouho, tak se ptam, jestli nekdo neco chytrejsiho uz nenapsal (nejlepe jako knihovnu pro python)
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

Gilhad avatar 17.12.2011 22:56 Gilhad | skóre: 20 | blog: gilhadoviny
Rozbalit Rozbalit vše Re: Jak najit pozici obrazku v screenshotu
Odpovědět | | Sbalit | Link | Blokovat | Admin
Jeste poznamka, jde o bitmapy, obrazky jsou generovane, takze skutecne lze spolehlive testovat rovnost.
18.12.2011 13:57 l4m4
Rozbalit Rozbalit vše Re: Jak najit pozici obrazku v screenshotu
Normálně se hledá maximum korelace, což lze pomocí FFT a s numpy by to asi ani nebylo tak těžké, ale zde pořád tak trochu kanón na vrabce.
18.12.2011 18:50 tyf
Rozbalit Rozbalit vše Re: Jak najit pozici obrazku v screenshotu
Neni to spis maximum konvoluce? Pokud jo, pak fft netreba a staci dvojity for. A pokud hleda presnou shodu, muze si dokonce hodnotu maxima predem spocitat.
18.12.2011 19:29 l4m4
Rozbalit Rozbalit vše Re: Jak najit pozici obrazku v screenshotu
Konvoluce: Ne, korelace. Rozdíl mezi konvolucí a korelací si najdeš i na Wikipedii. Z hlediska výpočetní složitosti jsou ekvivalentní (liší se obrácením kernelu), takže nerozumím, co se snažíš řešit.

Stačí dvojítý for: Ne, nestačí, protože to se tím zvedne algoritmická složitost z O(N log N) na O(MN), kde N a M jsou velikosti celého screenshotu a hledaného vzoru (předp. M < N), takže je to příšerně nechutně tragicky kolosálně pomalé.

Předem spočítat: WTF? Co spočítat? Nalezení maxima, když už mám spočtenu korelaci, je triviální O(N) operace, ta se vůbec neřeší.
18.12.2011 22:28 tyf
Rozbalit Rozbalit vše Re: Jak najit pozici obrazku v screenshotu
Nojo, termitologie. Zmatlo me mathworksove conv2/filter2 spojene s mou vrelou nenavisti ke statistice a tamni kovarianci a korelaci.

Algoritmicka narocnost by me netrapila. V nejblizsi spoustu let tohle pro realne screenshoty urcite nebude prusvih. Zato mivam problemy, ze mi algoritmy lezou z pameti a swapovani to zabije. Odhaduju, ze FFT nejde pocitat v uint8.

Proc predem spocitat hodnotu maxima? Je to jenom navrh, jak nejenom najit argmax, ale i rozhodnout, jestli je vubec vzor pritomen.

Ale mam podezreni, ze pro presnou shodu bude lepsi ten retezcovy algoritmus.
19.12.2011 00:04 l4m4
Rozbalit Rozbalit vše Re: Jak najit pozici obrazku v screenshotu
V nejblizsi spoustu let tohle pro realne screenshoty urcite nebude prusvih.
Ty akorát tak provokuješ, abychom se tu nenudili, co? V nejbližší spoustu let to pro reálné screenshoty znamená trvání hledání v minutách, pro větší monitor a screenshot i v desítkách minut. Na rozdíl od použití FFT, se kterým to v náročnějších případech mohou být jednotky sekund.

Zato bych prosil vysvětlit, jak by ses dokázal dostat s potřebnou pamětí přes 100MB, což je dnes zlomek operační paměti, i při výpočtu s FFT v double. Máš monitor s rozlišením 10000x10000?
HrabalVojta avatar 18.12.2011 16:33 HrabalVojta | skóre: 23 | blog: gentoo_pentoo | Třebíč
Rozbalit Rozbalit vše Re: Jak najit pozici obrazku v screenshotu
http://en.wikipedia.org/wiki/String_searching_algorithm a nebo http://en.wikipedia.org/wiki/Fuzzy_string_searching
USE="freedom -software_patents" emerge --deep --update --newuse world
18.12.2011 19:37 l4m4
Rozbalit Rozbalit vše Re: Jak najit pozici obrazku v screenshotu
Při přesné shodě bude Boyer-Moore výborný (aplikovaný po řádcích), ale fuzzy algoritmy pro stringy nejsou vhodné pro obrázky.
19.12.2011 09:30 vasek
Rozbalit Rozbalit vše Re: Jak najit pozici obrazku v screenshotu
Boyer-Moore není vhodný pro binární data. Tady bych použil KMP, ten by měl být o něco rychlejší.
19.12.2011 11:00 l4m4
Rozbalit Rozbalit vše Re: Jak najit pozici obrazku v screenshotu
To bych takhle kategoricky rozhodně neřekl, (ne)shody lze snadno hledat v každém RGB kanálu zvlášť. Naopak unicodový text má dneska buď příliš velkou abecedu (UCS-32) nebo je zamořen velkým množstvím identických bajtů a jejich sekvencí (UTF-8).

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.