Atvaizdo patikra OpenCV afinitetui

Ar OpenCV palaiko dviejų vaizdų palyginimą, grąžindamas tam tikrą vertę (galbūt procentą), kuris rodo, kaip panašūs šie vaizdai? Pavyzdžiui. 100% bus grąžinta, jei tas pats vaizdas bus perkeltas du kartus, 0% bus grąžintas, jei vaizdai bus visiškai skirtingi.

Jau perskaičiau daug panašių temų „StackOverflow“. Aš taip pat dariau gana daug. Deja, negalėjau rasti patenkinamo atsakymo.

111
18 июля '12 в 15:15 2012-07-18 15:15 Borisas yra nustatytas liepos 18 d., 12 val. 15:15 2012-07-18 15:15
@ 4 atsakymai

Tai tikrai didžiulė tema: trijų kodų eilutės atsako į visus mokslo žurnalus.

Kalbėsiu apie labiausiai paplitusius tokius metodus ir jų rezultatus.

Histogramų palyginimas

Vienas iš paprasčiausių ir greičiausių metodų. Prieš kelis dešimtmečius siūloma ieškoti nuotraukų. Idėja yra ta, kad miškas bus daug žalios, o žmogaus veidas yra daug rožinės ar kažkoks kitas. Taigi, jei palyginsite dvi nuotraukas su miškais, šiek tiek panašėsite į histogramas, nes abu yra daug žalios.

Smukimas: tai pernelyg supaprastinta. Bananai ir paplūdimys atrodys vienodi, nes abu yra geltoni.

OpenCV metodas: palygintiHist ()

Šablono atitikimas

Geras pavyzdys yra „ MatchTemplate“, skirtas rasti gerą rungtynę . Jis sutraukia paieškos vaizdą su paieška. Paprastai jis naudojamas mažoms nuotraukos dalims ieškoti didesniame.

Trūkumai: grąžina tik gerus rezultatus su tais pačiais vaizdais, tokio paties dydžio ir orientacijos.
OpenCV metodas: matchTemplate ()

Suderinimo funkcijos

Laikoma viena iš efektyviausių būdų ieškoti vaizdų. Iš paveikslėlio išskiriamos kelios funkcijos, užtikrinančios, kad tos pačios funkcijos vėl atpažįstamos, net jei jos yra pasuktos / sumažintos / iškreiptos. Taip paskirstytos funkcijos gali būti lyginamos su kitais vaizdo funkcijų rinkiniais. Kitas vaizdas, turintis didelę funkcijų dalį pirmajame, greičiausiai atitinka tą patį objektą / sceną. Ją galima naudoti norint nustatyti santykinį skirtumą tarp fotografavimo kampų tarp nuotraukų arba persidengimo.

Čia yra keletas OpenCV pamokų / pavyzdžių ir geras vaizdo įrašas. Tam skirtas visas OpenCV modulis (features2d).
Trūkumai: tai gali būti lėta. Tai nėra tobula.

162
18 июля '12 в 15:38 2012-07-18 15:38 atsakymas buvo pateiktas Sam , liepos 18 d., 12 val. 15:38 2012-07-18 15:38

Jei suderinti tuos pačius vaizdus (tas pats dydis / orientacija)

 // 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 } 

Šaltinis

27
31 окт. atsakymas duotas Kiran 31 okt. 2013-10-31 17:17 '13, 17:17, 2013-10-31 17:17

Sam sprendimas turėtų būti pakankamas. Naudojau histogramų skirtumo ir modelio atitikimo derinį, nes nė vienas metodas man nepadėjo 100% laiko. Tačiau histogramos metodui suteikiau mažesnę vertę. Štai kaip aš įdiegiau paprastą „python“ scenarijų.

 import cv2 class CompareImage(object): def __init__(self, image_1_path, image_2_path): self.minimum_commutative_image_diff = 1 self.image_1_path = image_1_path self.image_2_path = image_2_path def compare_image(self): image_1 = cv2.imread(self.image_1_path, 0) image_2 = cv2.imread(self.image_2_path, 0) commutative_image_diff = self.get_image_difference(image_1, image_2) if commutative_image_diff < self.minimum_commutative_image_diff: print "Matched" return commutative_image_diff return 10000 //random failure value @staticmethod def get_image_difference(image_1, image_2): first_image_hist = cv2.calcHist([image_1], [0], None, [256], [0, 256]) second_image_hist = cv2.calcHist([image_2], [0], None, [256], [0, 256]) img_hist_diff = cv2.compareHist(first_image_hist, second_image_hist, cv2.HISTCMP_BHATTACHARYYA) img_template_probability_match = cv2.matchTemplate(first_image_hist, second_image_hist, cv2.TM_CCOEFF_NORMED)[0][0] img_template_diff = 1 - img_template_probability_match # taking only 10% of histogram diff, since it less accurate than template method commutative_image_diff = (img_hist_diff / 10) + img_template_diff return commutative_image_diff if __name__ == '__main__': compare_image = CompareImage('image1/path', 'image2/path') image_difference = compare_image.compare_image() print image_difference 
2
03 авг. atsakymas duotas Priyanshu Chauhan 03 rug. 2017-08-03 16:36 '17, 16:36 pm 2017-08-03 16:36

Šiek tiek išjungti temą, bet pythoninis numpy yra naudingas. Jis yra tvirtas ir greitas, tačiau tiesiog lygina vaizdo elementus, o ne objektus ar duomenis, kuriuos turi vaizdas (ir tai reikalauja tokio paties dydžio ir formos vaizdų):

Labai paprastas ir greitas požiūris į tai be openCV ir bet kurios kompiuterinės vizijos bibliotekos yra normalizuoti vaizdų masyvus

 import numpy as np picture1 = np.random.rand(100,100) picture2 = np.random.rand(100,100) picture1_norm = picture1/np.sqrt(np.sum(picture1**2)) picture2_norm = picture2/np.sqrt(np.sum(picture2**2)) 

Nustačius, kaip normalizuoti vaizdai (arba matricos), galite tiesiog apibendrinti vaizdų, kuriuos norite palyginti, dauginimą:

1) Jei palyginate panašius vaizdus, ​​suma bus grąžinta 1:

 In[1]: np.sum(picture1_norm**2) Out[1]: 1.0 

2) Jei jie nėra panašūs, jūs gausite vertę nuo 0 iki 1 (procentais, jei padauginta iš 100):

 In[2]: np.sum(picture2_norm*picture1_norm) Out[2]: 0.75389941124629822 

Atkreipkite dėmesį, kad jei turite spalvotų vaizdų, turite tai padaryti visais trimis matmenimis arba tiesiog palyginti pilkos spalvos vaizdą. Dažnai turiu palyginti didžiulį skaičių vaizdų su savavališku turiniu ir tai yra labai greitas būdas tai padaryti.

0
09 июня '17 в 16:37 2017-06-09 16:37 Atsakymą pateikė Frankas birželio 09 d. 17 d. 4:37 2017-06-06 16:37

Kiti klausimai apie žymių arba Užduoti klausimą