Paprastas ir greitas būdas lyginti vaizdus su panašumu

Man reikia paprasto ir greito būdo palyginti du vaizdus panašumui. Tai reiškia, kad noriu gauti didelę vertę, jei juose yra lygiai toks pats, bet gali būti šiek tiek kitokio pobūdžio ir gali būti perkeltas / pakeistas keliais pikseliais.

(Tiksliau, jei tai svarbu: vienas vaizdas yra piktograma, o kitas vaizdas yra ekrano apylinkė, ir aš noriu žinoti, ar šis apylinkis yra piktograma, ar ne.)

Turiu OpenCV , bet aš vis dar nepratauju .

Viena iš galimybių, kurias aš jau galvoju apie tai: padalinkite abi nuotraukas į 10x10 ląsteles ir palyginkite spalvų histogramą su kiekviena iš šių 100 ląstelių. Tada galiu nustatyti tam tikrą slenkstinę vertę ir, jei vertė, kurią gaunu, viršija šią ribą, manau, jie yra panašūs.

Aš neišbandžiau, kaip gerai tai veikia, bet manau, kad būtų malonu. Vaizdai jau yra labai panašūs (mano atveju), todėl galiu naudoti gana didelę ribinę vertę.

Manau, kad dėl to yra daugybė kitų galimų sprendimų, kurie veiks daugiau ar mažiau (kadangi pati užduotis yra gana paprasta, nes tik noriu rasti panašumų, jei jie yra labai panašūs). Ką jūs siūlote?


Yra keletas labai panašių / panašių klausimų apie parašo / pirštų atspaudo / maišos iš vaizdo gavimą:

Be to, suklupau šiems įgyvendinimams, kurie turi tokias funkcijas pirštų atspaudams gauti:

Kai kurios diskusijos apie vaizdo suvokimo hashes: čia


Šiek tiek netinkamas: yra daug būdų, kaip sukurti garso pirštų atspaudus. „MusicBrainz“ , žiniatinklio paslauga, teikianti pirštų atspaudų paiešką dainose, turi gerą savo wiki apžvalgą . Dabar jie naudoja „ AcoustID“ . Taip yra ieškant tikslių (arba tiksliai) tikslų. Jei norite ieškoti panašių atitikmenų (arba jei turite tik kai kuriuos fragmentus ar didelį triukšmą), žiūrėkite Echoprint . Susijęs klausimas čia yra SO. Taigi atrodo, kad tai nutarta dėl garso. Visi šie sprendimai veikia gerai.

Šiek tiek bendresnis klausimas apie apytikslę paiešką yra čia . Pavyzdžiui. Yra jautrumas vietai ir artimiausio kaimyno paieškai .

150
16 нояб. nustatė Albertas lapkričio 16 d. 2010-11-16 19:31 '10, 19:31, 2010-11-16 19:31
@ 7 atsakymai

Ar galiu pakeisti ekrano ar piktogramą (mastelį, pasukti, pasvirti ...)? Mano galvoje yra keletas būdų, kurie gali padėti jums:

  • Paprastas Euklido atstumas , kaip nurodo @carlosdc (neveikia su konvertuotais vaizdais ir jums reikia slenksčio).
  • (Normalizuota) kryžminė koreliacija - paprasti rodikliai, kuriuos galite naudoti vaizdo sričių palyginimui. Jis yra patvaresnis nei paprastas Euklido atstumas, tačiau neveikia transformuotų vaizdų, ir jums reikės dar kartą nustatyti ribą.
  • Histogramų palyginimas - jei naudojate normalizuotas histogramas, šis metodas veikia gerai ir nepriklauso nuo afino transformacijų. Problema yra tinkamos ribos nustatymas. Jis taip pat labai jautrus spalvų pokyčiams (ryškumas, kontrastas ir tt). Ją galite sujungti su ankstesniais dviem.
  • Pagrindiniai taškų / zonų detektoriai - pavyzdžiui, MSER (ypatingai tvarūs ekstremalūs regionai) , SURF arba SIFT . Tai yra labai patikimi algoritmai, ir jie gali būti pernelyg sudėtingi jūsų paprasta užduotis. Gerai, kad nereikia turėti tikslios srities su viena piktograma, šie detektoriai yra pakankamai galingi, kad surastų tinkamą atitikimą. Geras šių metodų įvertinimas šiame straipsnyje: Vietiniai nenuolatinių funkcijų detektoriai: apžvalga .

Dauguma jų jau įdiegtos OpenCV - žr., Pavyzdžiui, cvMatchTemplate metodą (naudoja histogramų atitikimą): http://dasl.mem.drexel.edu/~noahKuntz/openCVTut6.html . Galimi ir specializuoti taškų / zonų jutikliai - žr. „ OpenCV“ funkcijų aptikimą .

87
17 нояб. Atsakymą pateikė Karel Petranek lapkričio 17 d. 2010-11-17 12:59 '10, 12:59, 2010-11-17 12:59

Neseniai susiduriu su tomis pačiomis problemomis, išspręsti šią problemą (paprastą ir greitą dviejų vaizdų palyginimo algoritmą) vieną kartą ir visiems laikams, prisidedu prie modulio „ img_hash“ į „opencv_contrib“, galite rasti informacijos iš šios nuorodos .

„Img_hash“ modulyje yra šeši vaizdų maišymo algoritmai, kuriuos lengva naudoti.

Kodo pavyzdys

2019

Ar yra ekrano piktograma? Jei taip, gali būti pakankamas dviejų vaizdų L2 atstumas. Jei L2 atstumas neveikia, kitas žingsnis yra pabandyti padaryti kažką paprasto ir nusistovėjusio, pavyzdžiui: Lucas-Kanade . Esu įsitikinęs, kad jis yra „OpenCV“.

8
17 нояб. Atsakymą pateikė carlosdc lapkričio 17 d. 2010-11-17 00:55 '10, 0:55, 2010-11-17 00:55

Jei norite gauti indeksą apie abiejų vaizdų panašumą, siūlau iš rodiklių naudoti SSIM indeksą. Tai labiau atitinka žmogaus akis. Čia yra straipsnis apie tai: Struktūrinis panašumo indeksas

Jis taip pat įgyvendinamas OpenCV ir gali būti pagreitintas naudojant grafikos procesorių: OpenCV SSIM su grafikos procesoriumi

4
12 сент. atsakymas duotas ramez 12 sep . 2013-09-12 19:49 '13, 19:49 PM 2013-09-12 19:49

Jei galite būti tikri dėl tikslaus jūsų modelio (piktogramos) išlygiavimo bandymų srityje, tuomet veiks bet kokia senų pikselių skirtumų suma.

Jei išlygiavimas yra tik nereikšmingas, galite ištrinti abu vaizdus iš cv :: GaussianBlur prieš surandant pikselių skirtumų sumą.

Jei lygiavimo kokybė yra potencialiai prasta, aš rekomenduoju orientuotų gradientų histogramą arba vieną iš OpenCV patogių taškų apibrėžimo / deskriptoriaus algoritmų (pvz., SIFT arba SURF ).

3
18 нояб. atsakymą pateikė rcv 18 nov. 2010-11-18 02:28 '10, 02:28 2010-11-18 02:28

Jei atitinka vienodus vaizdus - atstumas L2

 // Compare two images by getting the L2 error (square-root of sum of squared error). double getSimilarity( const Mat A, const Mat B ) { if ( A.rows > 0  A.rows == B.rows  A.cols > 0  A.cols == B.cols ) { // Calculate the L2 relative error between images. double errorL2 = norm( A, B, CV_L2 ); // Convert to a reasonable scale, since L2 error is summed across all pixels of the image. double similarity = errorL2 / (double)( A.rows * A.cols ); return similarity; } else { //Images have a different size return 100000000.0; // Return a bad value } 

Greitas. Bet ne atsparus šviesos / požiūrio pokyčiams ir pan. Šaltinis

3
04 апр. atsakymas duotas Kiran 04 Bal 2014-04-04 11:23 '14 at 11:23 2014-04-04 11:23

Jei norite palyginti vaizdą panašumui, siūlau naudoti OpenCV. OpenCV turi keletą funkcijų ir modelių derinių derinių. Kad atitiktų charakteristikas, yra SURF, SIFT, FAST ir kt. Detektorius. Tai galite naudoti norėdami rasti, apibūdinti ir atvaizduoti vaizdus. Po to galite naudoti konkretų indeksą, kad rastumėte dviejų vaizdų atitikmenų skaičių.

2
19 янв. Atsakymą pateikė Hua Er Lim sausio 19 d. 2013-01-19 08:17 '13, 8:17, 2013-01-19 08:17