दिलचस्प पोस्ट
एक निर्माता में वर्चुअल सदस्य कॉल मैं प्राथमिक सारांश में एंड्रॉइड पसंद के वर्तमान मूल्य को कैसे प्रदर्शित करूं? यह निर्धारित करने के लिए कि क्या कोई बिंदु 2 डी त्रिकोण में है? छोरों के साथ `दो 'और ब्लॉक स्कोपिंग का स्पष्टीकरण रिलेशनल डेटाबेस में आईपीवी 6-संगत पते को कैसे स्टोर करना है ट्यूपल्स में अस्थिर वस्तुओं क्यों हो सकते हैं? एक पिक्सेल संपादक के लिए ग्रिड का एक प्रकार चाहते हैं डाटाबेस आईडी को खोलना – सुरक्षा जोखिम? लंबे समय से सी / सी ++ विजुअल स्टूडियो 2005 पर Google सी ++ परीक्षण फ्रेमवर्क (गेटेस्ट) कैसे सेटअप करें जावा में स्ट्रिंग पूल क्या है? एंड्रॉइड में प्रोग्राम को कैसे खोलें? JQuery के साथ भागने की कुंजी के लिए कौन सी कुंजीकोड एंड्रॉइड एकल टास्क या सिंगल इंस्टेंस लॉन्च मोड? जावा में एक ज़िप फ़ाइल कैसे बनाएं

OpenCV के साथ समानता के लिए छवियों की जांच करना

क्या OpenCV दो छवियों की तुलना का समर्थन करता है, कुछ मूल्य (शायद एक प्रतिशत) लौटाता है जो यह दर्शाता है कि इन चित्रों की समानता कितनी है? उदाहरण के लिए, यदि 100% छवि दो बार पारित की गई तो 0% लौटा दी जाएगी, यदि छवियाँ पूरी तरह से अलग थीं।

मैंने पहले से ही StackOverflow पर बहुत सारे समान विषय पढ़ा है I मैंने भी काफी कुछ Googling किया था अफसोस की बात है कि मैं एक संतोषजनक उत्तर के साथ नहीं आया।

वेब के समाधान से एकत्रित समाधान "OpenCV के साथ समानता के लिए छवियों की जांच करना"

यह एक बहुत बड़ा विषय है, जिसमें 3 लाइनों के कोड से संपूर्ण शोध पत्रिकाओं के लिए उत्तर दिया गया है।

मैं सबसे आम ऐसी तकनीकों और उनके परिणामों की रूपरेखा करेगा

हिस्टोग्राम की तुलना करना

सरल और सबसे तेज़ तरीकों में से एक प्रस्तावित दशकों से पहले तस्वीर समानताएं ढूंढने के साधन के रूप में यह विचार यह है कि जंगल में बहुत अधिक हरे रंग का होगा, और एक बहुत बड़ा गुलाबी मनुष्य होगा, या जो भी हो इसलिए, अगर आप जंगलों के साथ दो चित्रों की तुलना करते हैं, तो आपको हिस्टोग्राम के बीच कुछ समानता मिलेगी, क्योंकि आपके दोनों में बहुत हरे हैं।

नकारात्मक पक्ष: यह बहुत सरल है एक केले और एक समुद्र तट एक ही दिखाई देगा, क्योंकि दोनों पीले हैं

ओपनसीवी विधि: तुलनात्मक ()

टेम्पलेट मिलान

यहां एक अच्छी मिसाल मुकाबला करें । यह खोज छवि को एक में खोज के साथ समेटे हुए है यह आम तौर पर बड़ी छवियों में छोटे छवि भागों को खोजने के लिए उपयोग किया जाता है

डाउनसाइड्स: यह केवल समान चित्र, एक ही आकार और उन्मुखीकरण के साथ अच्छे परिणाम देता है।
ओपनसीवी विधि: मैचटेम्पलेट ()

फ़ीचर मिलान

छवि खोज करने के सबसे प्रभावी तरीकों में से एक माना जाता है कई विशेषताओं को एक छवि से निकाला जाता है, इस तरह की गारंटी देता है कि उसी सुविधाओं को फिर से पहचाना जाएगा, फिर भी इसे घुमाया / स्केल / स्क्यूड किया जाता है। इस तरह की सुविधाओं को अन्य छवि फीचर सेट के साथ मिलान किया जा सकता है। एक और छवि जिसमें पहले एक में विशेषताओं का उच्च अनुपात है, वह संभवत: उसी ऑब्जेक्ट / सीन का चित्रण कर रहा है। यह तस्वीरों के बीच शूटिंग के कोण या ओवरलैपिंग की मात्रा में सापेक्ष अंतर खोजने के लिए इस्तेमाल किया जा सकता है।

इस पर ओपनसीवी ट्यूटोरियल / नमूने हैं, और यहां एक अच्छा वीडियो है । एक संपूर्ण ओपनसीवी मॉड्यूल (फीचर 2 डी) इसके लिए समर्पित है।
डाउनसाइड्स: यह धीमा हो सकता है यह सही नहीं है

यदि समान चित्रों के मिलान के लिए (समान आकार / अभिविन्यास)

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

स्रोत

थोड़ा विषय बंद है, लेकिन उपयोगी numpy दृष्टिकोण है इसकी मजबूत और तेजी से, लेकिन पिक्सल की तुलना करता है, न कि ऑब्जेक्ट या डेटा में चित्र शामिल है (और इसमें उसी आकार और आकार की छवियों की आवश्यकता है):

यह बिना ओपनसीवी के लिए एक बहुत ही सरल और तेजी से दृष्टिकोण और कंप्यूटर दृष्टि के लिए किसी भी पुस्तकालय द्वारा चित्र सरणियों का आदर्श है

 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)) 

दोनों सामान्यकृत चित्रों (या मैट्रिक्स) को परिभाषित करने के बाद आप चित्रों की गुणा करके बस तुलना कर सकते हैं जिन्हें आप तुलना करना पसंद करते हैं:

1) यदि आप समान तस्वीरों की तुलना करते हैं तो राशि 1:

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

2) यदि वे समान नहीं हैं, तो आपको 0 और 1 के बीच एक मान मिलेगा (यदि आप 100 से गुणा करेंगे):

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

कृपया ध्यान दें कि यदि आपके पास रंगीन चित्र हैं तो आपको यह सभी 3 आयामों में करना होगा या सिर्फ एक ग्रेस्केल संस्करण की तुलना करें मुझे अक्सर मनमाना सामग्री के साथ बड़ी मात्रा में चित्रों की तुलना करना पड़ता है और यह ऐसा करने का एक बहुत तेज़ तरीका है।

सैम का समाधान पर्याप्त होना चाहिए। मैंने दोनों हिस्टोग्राम अंतर और टेम्पलेट मिलान के संयोजन का उपयोग किया है क्योंकि एक बार मेरे लिए 100% बार काम नहीं किया गया था। मैंने हिस्टोग्राम विधि को हालांकि कम महत्व दिया है। यहाँ मैं कैसे सरल अजगर स्क्रिप्ट में कार्यान्वित किया है।

 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's 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