छवि तुलना - तेज एल्गोरिथ्म


393

मैं छवियों की एक आधार तालिका बनाना चाह रहा हूं और फिर यह निर्धारित करने के लिए कि कोई नई छवि की तुलना करता है कि क्या नई छवि आधार की एक सटीक (या करीबी) नकल है।

उदाहरण के लिए: यदि आप 100 बार उसी छवि के संग्रहण को कम करना चाहते हैं, तो आप इसकी एक प्रति संग्रहीत कर सकते हैं और इसे संदर्भ लिंक प्रदान कर सकते हैं। जब एक नई छवि दर्ज की जाती है तो आप मौजूदा छवि की तुलना यह सुनिश्चित करने के लिए करना चाहते हैं कि यह डुप्लिकेट नहीं है ... विचार?

मेरा एक विचार एक छोटे से थंबनेल को कम करना था और फिर बेतरतीब ढंग से 100 पिक्सेल स्थानों को चुनना और तुलना करना था।

जवाबों:


459

इस समस्या को हल करने के लिए नीचे तीन दृष्टिकोण हैं (और कई अन्य हैं)।

  • पहला कंप्यूटर विजन, कीपॉइंट मैचिंग में एक मानक दृष्टिकोण है। इसे लागू करने के लिए कुछ पृष्ठभूमि ज्ञान की आवश्यकता हो सकती है, और यह धीमा हो सकता है।

  • दूसरी विधि केवल प्रारंभिक छवि प्रसंस्करण का उपयोग करती है, और संभवतः पहले दृष्टिकोण की तुलना में तेज है, और लागू करने के लिए सीधा है। हालांकि, यह समझने में क्या लाभ करता है, इसमें मजबूती का अभाव है - स्केलिंग, घुमाया या फीका पड़ा हुआ चित्रों पर मिलान विफल रहता है।

  • तीसरी विधि तेज और मजबूत दोनों है, लेकिन लागू करने के लिए संभवतः सबसे कठिन है।

कीपिंग मैचिंग

100 रैंडम पॉइंट लेने से बेहतर है 100 महत्वपूर्ण पॉइंट्स को चुनना । एक छवि के कुछ हिस्सों में दूसरों (विशेष रूप से किनारों और कोनों) की तुलना में अधिक जानकारी होती है, और ये वे हैं जो आप स्मार्ट छवि मिलान के लिए उपयोग करना चाहते हैं। Google " कीपॉइंट निष्कर्षण " और " कीपॉइंट मैचिंग " और आपको इस विषय पर कुछ अकादमिक पेपर मिलेंगे। इन दिनों, SIFT कीपॉइंट यकीनन सबसे लोकप्रिय हैं, क्योंकि वे अलग-अलग तराजू, घुमाव और प्रकाश व्यवस्था के तहत छवियों का मिलान कर सकते हैं। कुछ SIFT कार्यान्वयन मिल सकते हैं यहां हैं

कीपॉइंट मैचिंग के लिए एक नकारात्मक पहलू भोली कार्यान्वयन का चल रहा समय है: O (n ^ 2m), जहाँ n प्रत्येक छवि में keypoint की संख्या है, और m डेटाबेस में छवियों की संख्या है। कुछ चतुर एल्गोरिदम निकटतम मैच को तेज़ी से देख सकते हैं, जैसे क्वाडट्रैस या बाइनरी स्पेस विभाजन।


वैकल्पिक समाधान: हिस्टोग्राम विधि

एक और कम मजबूत लेकिन संभावित रूप से तेज समाधान प्रत्येक छवि के लिए फीचर हिस्टोग्राम बनाना है, और छवि को इनपुट छवि के हिस्टोग्राम के सबसे करीब हिस्टोग्राम के साथ चुनना है। मैंने इसे एक अंडरग्रेड के रूप में लागू किया, और हमने 3 रंग हिस्टोग्राम (लाल, हरा और नीला), और दो बनावट हिस्टोग्राम, दिशा और पैमाने का उपयोग किया। मैं नीचे विवरण दूंगा, लेकिन मुझे ध्यान देना चाहिए कि यह केवल डेटाबेस छवियों के समान मिलान वाली छवियों के लिए अच्छी तरह से काम करता है। पुनः-स्केल की गई, घुमाई हुई या फीकी पड़ी हुई छवियां इस पद्धति से विफल हो सकती हैं, लेकिन क्रॉपिंग जैसे छोटे परिवर्तन एल्गोरिथ्म को नहीं तोड़ेंगे

रंग हिस्टोग्राम की गणना करना सीधा है - बस अपने हिस्टोग्राम बाल्टी के लिए सीमा चुनें, और प्रत्येक सीमा के लिए, उस सीमा में रंग के साथ पिक्सेल की संख्या टैली करें। उदाहरण के लिए, "हरे" हिस्टोग्राम पर विचार करें, और मान लें कि हम अपने हिस्टोग्राम के लिए 4 बाल्टी चुनते हैं: 0-63, 64-127, 128-191 और 192-255। फिर प्रत्येक पिक्सेल के लिए, हम हरे रंग के मूल्य को देखते हैं, और एक बाल्टी को उपयुक्त बाल्टी में जोड़ते हैं। जब हम टैलिंग कर रहे होते हैं, तो हम हरे रंग के चैनल के लिए सामान्यीकृत हिस्टोग्राम प्राप्त करने के लिए पूरी छवि में पिक्सेल की संख्या से प्रत्येक बाल्टी को विभाजित करते हैं।

बनावट दिशा हिस्टोग्राम के लिए, हमने छवि पर किनारे का पता लगाने के लिए शुरुआत की। प्रत्येक किनारे बिंदु के किनारे पर लंबवत दिशा में एक सामान्य वेक्टर इंगित होता है। हमने 0 और PI के बीच सामान्य वेक्टर के कोण को 6 बाल्टी में परिमाणित किया है (चूंकि किनारों में 180-डिग्री समरूपता है, हमने कोण को -PI और 0 के बीच 0 और PI के बीच परिवर्तित किया है)। प्रत्येक दिशा में बढ़त बिंदुओं की संख्या का मिलान करने के बाद, हमारे पास एक सामान्यीकृत हिस्टोग्राम है जो बनावट दिशा का प्रतिनिधित्व करता है, जिसे हमने प्रत्येक बाल्टी को छवि में कुल बढ़त बिंदुओं द्वारा विभाजित करके सामान्य किया है।

बनावट के पैमाने हिस्टोग्राम की गणना करने के लिए, प्रत्येक किनारे बिंदु के लिए, हमने उसी दिशा के साथ अगले-निकटतम किनारे बिंदु की दूरी को मापा। उदाहरण के लिए, यदि एज पॉइंट ए में 45 डिग्री की दिशा है, तो एल्गोरिथ्म उस दिशा में चलता है जब तक कि यह 45 डिग्री (या एक उचित विचलन के भीतर) के साथ एक और बढ़त बिंदु नहीं पाता है। प्रत्येक किनारे बिंदु के लिए इस दूरी की गणना करने के बाद, हम उन मूल्यों को एक हिस्टोग्राम में डंप करते हैं और इसे किनारे की कुल संख्या से विभाजित करके सामान्य करते हैं।

अब आपके पास प्रत्येक छवि के लिए 5 हिस्टोग्राम हैं। दो छवियों की तुलना करने के लिए, आप प्रत्येक हिस्टोग्राम बाल्टी के बीच अंतर का पूर्ण मूल्य लेते हैं, और फिर इन मूल्यों को जोड़ते हैं। उदाहरण के लिए, छवियों A और B की तुलना करने के लिए, हम गणना करेंगे

|A.green_histogram.bucket_1 - B.green_histogram.bucket_1| 

हरे हिस्टोग्राम में प्रत्येक बाल्टी के लिए, और अन्य हिस्टोग्राम के लिए दोहराएं, और फिर सभी परिणामों को योग करें। परिणाम जितना छोटा होगा, मैच उतना ही बेहतर होगा। डेटाबेस में सभी छवियों के लिए दोहराएं, और सबसे छोटे परिणाम जीत के साथ मैच। आप शायद एक दहलीज चाहते हैं, जिसके ऊपर एल्गोरिथ्म यह निष्कर्ष निकालता है कि कोई मैच नहीं मिला।


तीसरी पसंद - कीपॉइंट्स + निर्णय पेड़

एक तीसरा दृष्टिकोण जो संभवतः अन्य दो की तुलना में बहुत तेज है, शब्दार्थ टेक्स्टन वनों का उपयोग कर रहा है (पीडीएफ) । इसमें सरल कुंजीप्वाइंट निकालना और छवि को वर्गीकृत करने के लिए संग्रह निर्णय पेड़ों का उपयोग करना शामिल है। यह साधारण SIFT की पॉइंट मिलान की तुलना में तेज़ है, क्योंकि यह महंगी मिलान प्रक्रिया से बचता है, और की-पॉइंट, SIFT की तुलना में बहुत सरल है, इसलिए की-पॉइंट निष्कर्षण बहुत तेज़ है। हालाँकि, यह रोटेशन, स्केल और लाइटिंग के लिए SIFT मेथड के इनविरेंस को संरक्षित करता है, एक महत्वपूर्ण विशेषता जिसे हिस्टोग्राम विधि की कमी थी।

अपडेट :

मेरी गलती - सिमेंटिक टेक्स्टन फॉरेस्ट पेपर विशेष रूप से छवि मिलान के बारे में नहीं है, बल्कि क्षेत्र लेबलिंग है। मूल पेपर जो मिलान करता है वह यह है: रैंडमाइज्ड पेड़ों का उपयोग करते हुए कीपॉइंट रिकॉग्निशन । इसके अलावा, नीचे दिए गए कागजात विचारों को विकसित करते हैं और कला की स्थिति का प्रतिनिधित्व करते हैं (सी। 2010):


हिस्टोग्राम दृष्टिकोण सबसे अधिक समझ में आता है। मुझे लगता है कि आप छवि को घुमा सकते हैं सभी पक्षों पर यह प्रदर्शन करने के लिए बस छवि की तुलना में बदल गया था (4 के रूप में एक ही छवि का इलाज) - धन्यवाद
मीड

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

@redmoskito: मेरा एक सवाल है। उदाहरण के लिए आपको हरे रंग के हिस्टोग्राम का संख्यात्मक मूल्य कैसे मिलता है? तो आप इसे अन्य छवि हिस्टोग्राम के साथ घटा सकते हैं? मान लें कि हमारे पास हरे रंग का हिस्टोग्राम है जिसमें 3 पिक्सेल 0-63 बाल्टी से संबंधित हैं, और 5 पिक्सेल 64-127 से संबंधित हैं। मूल्य कौन सा है?
गतिशील

3
@ इकासो अगर इसकी एक ही छवि है, तो आप शायद ऐसा कुछ भी उपयोग नहीं करना चाहते हैं और सरल सीआरसी या एमडीआर तुलना का उपयोग करने पर विचार करें। यदि यह पर्याप्त नहीं है, जैसे कि एकल पिक्सेल हैं जो अलग हैं या मेटाडेटा बदल गया है, तो हिस्टोग्राम विधि भी पर्याप्त है। यदि आपकी छवियां समान हैं, लेकिन घुमाए गए या स्केल किए गए हैं, तो एक हिस्टोग्राम आधारित विधि पर्याप्त हो सकती है, लेकिन शायद विफल हो जाएगी। यदि आपकी छवियों ने रंग बदल दिए हैं तो आपको रुचि बिंदु आधारित एल्गोरिदम का उपयोग करने की आवश्यकता है।
पुनः

5
मैं चाहता हूँ कि आजकल, SIFT के कई तेज़ विकल्प मौजूद हैं, जैसे कि FAST डिटेक्टर और बाइनरी डिस्क्रिप्टर (BRIEF, BRISK, ORB, FREAK, BinBoost)। बाइनरी डिस्क्रिप्टर पर एक ट्यूटोरियल यहाँ पाया जा सकता है: gilscvblog.wordpress.com/2013/08/26/…
गिल्लीवी

85

सबसे अच्छी विधि मुझे पता है कि एक अवधारणात्मक हैश का उपयोग करना है। ऐसे उपलब्ध हैश का एक अच्छा खुला स्रोत कार्यान्वयन प्रतीत होता है:

http://phash.org/

मुख्य विचार यह है कि प्रत्येक छवि मूल चित्र फ़ाइल में मुख्य विशेषताओं की पहचान करके और उन सुविधाओं के एक कॉम्पैक्ट प्रतिनिधित्व हैशिंग के बजाय एक छोटे से हैश कोड या 'फिंगरप्रिंट' के लिए कम हो जाती है (सीधे छवि डेटा हैशिंग के बजाय)। इसका मतलब यह है कि झूठी सकारात्मक दर एक सरल दृष्टिकोण की तुलना में बहुत कम हो जाती है जैसे कि छवियों को एक छोटे अंगूठे के आकार की छवि को कम करना और अंगूठे के निशान की तुलना करना।

phash कई प्रकार के हैश प्रदान करता है और इसका उपयोग चित्र, ऑडियो या वीडियो के लिए किया जा सकता है।


इस विधि में कौन दिलचस्प है, लिंक github.com/ameingast/cocoaimagehashing
एलेक्सी वोइटेंको

@AlexeyVoitenko क्या यह डिफ़ॉल्ट डिफ़ॉल्ट कॉन्फ़िगरेशन में phash.org द्वारा निर्मित हैश के साथ है?
माइकल

1
मेरे अनुभव में फ़ैश एक ही छवि के विभिन्न आकारों को खोजने के लिए अच्छी तरह से काम करता है, लेकिन समान छवियों के लिए नहीं। उदाहरण के लिए एक ही वस्तु की दो अलग-अलग तस्वीरों में बहुत अलग हैश हो सकता है।
रेना

39

यह पोस्ट मेरे समाधान का शुरुआती बिंदु था, यहाँ बहुत सारे अच्छे विचार थे, हालाँकि मैं अपने परिणाम साझा करूँगा। मुख्य अंतर्दृष्टि यह है कि मैंने फेश की गति का दोहन करके की-पॉइंट-आधारित छवि के धीमेपन के चारों ओर जाने का एक रास्ता ढूंढ लिया है।

सामान्य समाधान के लिए, कई रणनीतियों को नियोजित करना सबसे अच्छा है। प्रत्येक एल्गोरिथ्म कुछ प्रकार के छवि परिवर्तनों के लिए सबसे उपयुक्त है और आप इसका लाभ उठा सकते हैं।

सबसे ऊपर, सबसे तेज़ एल्गोरिदम; सबसे नीचे (हालांकि अधिक सटीक) सबसे धीमा। यदि धीमे मैच को तेज स्तर पर पाया जाता है, तो आप धीमे लोगों को छोड़ सकते हैं।

  • सटीक डुप्लिकेट के लिए फ़ाइल-हैश आधारित (md5, sha1, आदि)
  • विकृत छवियों के लिए अवधारणात्मक हैशिंग (फ़ैश)
  • संशोधित छवियों के लिए सुविधा-आधारित (SIFT)

मुझे बहुत अच्छे परिणाम मिल रहे हैं। सटीकता बढ़ी हुई छवियों के लिए अच्छा है। यह (अवधारणात्मक) संशोधित छवियों (क्रॉप्ड, रोटेटेड, मिरर किए हुए, आदि) के लिए अच्छा नहीं है। हैशिंग गति से निपटने के लिए हमें हैस्टैक के लिए हैश बनाए रखने के लिए डिस्क कैश / डेटाबेस को नियोजित करना चाहिए।

फाश के बारे में वास्तव में अच्छी बात यह है कि एक बार जब आप अपने हैश डेटाबेस का निर्माण करते हैं (जो मेरे लिए लगभग 1000 चित्र / सेकंड हैं), तो खोज बहुत तेज हो सकती है, विशेष रूप से जब आप पूरे हैश डेटाबेस को मेमोरी में पकड़ सकते हैं। यह काफी व्यावहारिक है क्योंकि एक हैश केवल 8 बाइट्स है।

उदाहरण के लिए, यदि आपके पास 1 मिलियन चित्र हैं, तो इसके लिए 1 मिलियन 64-बिट हैश मान (8 MB) की आवश्यकता होगी। कुछ CPU पर यह L2 / L3 कैश में फिट बैठता है! व्यावहारिक उपयोग में मैंने 1 गीगा-हम्म / सेकंड की तुलना में एक कोर 7 देखा है, यह केवल सीपीयू के लिए मेमोरी बैंडविड्थ का सवाल है। 1 बिलियन-छवि डेटाबेस 64-बिट CPU (8GB RAM की आवश्यकता) पर व्यावहारिक है और खोज 1 सेकंड से अधिक नहीं होगी!

संशोधित / फसली छवियों के लिए यह एक ट्रांसफ़ॉर्म-इनवेरिएंट फ़ीचर / कीपॉइंट डिटेक्टर की तरह प्रतीत होगा जैसे SIFT जाने का रास्ता है। SIFT अच्छे कीपॉइंट का उत्पादन करेगा जो फसल / रोटेट / मिरर इत्यादि का पता लगाएगा। हालाँकि चरण की तुलना में इस्तेमाल की गई हैमिंग दूरी की तुलना में डिस्क्रिप्टर की तुलना बहुत धीमी है। यह एक प्रमुख सीमा है। वहाँ तुलना करने के लिए बहुत सारे हैं, क्योंकि अधिकतम IxJxK वर्णनकर्ता एक छवि को देखने के लिए तुलना करते हैं (I = num haystack images, J = target keypoint per hystack image, K = लक्ष्य कीपॉइंट प्रति सुई छवि)।

गति के मुद्दे के आसपास पाने के लिए, मैंने उप-आयत को निर्धारित करने के लिए सुविधा आकार / त्रिज्या का उपयोग करते हुए प्रत्येक पाया जाने वाले कीप के चारों ओर फ़ैश का उपयोग करने की कोशिश की। इस काम को अच्छी तरह से करने के लिए, अलग-अलग उप-आयत स्तर (सुई की छवि पर) उत्पन्न करने के लिए त्रिज्या को बढ़ाना / सिकोड़ना है। आम तौर पर पहला स्तर (अनकल्कड) मेल खाता होगा लेकिन अक्सर इसमें कुछ और बदलाव होते हैं। मुझे यकीन नहीं है कि यह क्यों काम करता है 100%, लेकिन मैं कल्पना कर सकता हूं कि यह उन सुविधाओं को सक्षम करता है जो काम करने के लिए बहुत कम हैं (32x32 तक फेज़ स्केल चित्र)।

एक और मुद्दा यह है कि SIFT मुख्य रूप से की-पॉइंट वितरित नहीं करेगा। यदि बहुत से किनारों के साथ छवि का एक भाग है, तो कीपॉइंट्स वहां जाएंगे और आपको किसी अन्य क्षेत्र में नहीं मिलेगा। मैं वितरण में सुधार करने के लिए OpenCV में GridAdaptedFeatureDetector का उपयोग कर रहा हूं। यह निश्चित नहीं है कि ग्रिड आकार सबसे अच्छा है, मैं एक छोटे ग्रिड (1x3 या 3x1 का उपयोग कर रहा हूं जो छवि अभिविन्यास पर निर्भर करता है)।

आप शायद फ़ीचर डिटेक्शन से पहले छोटे आकार (और सुई) को सभी छोटे पैमाने पर स्केल करना चाहते हैं (मैं अधिकतम आयाम के साथ 210px का उपयोग करता हूं)। यह छवि में शोर को कम करेगा (हमेशा कंप्यूटर दृष्टि एल्गोरिदम के लिए एक समस्या), यह भी अधिक प्रमुख विशेषताओं पर डिटेक्टर को केंद्रित करेगा।

लोगों की छवियों के लिए, आप चेहरे का पता लगाने की कोशिश कर सकते हैं और इसका उपयोग छवि आकार को स्केल और ग्रिड आकार के लिए निर्धारित करने के लिए कर सकते हैं (उदाहरण के लिए सबसे बड़ा चेहरा 100px होने के लिए)। फीचर डिटेक्टर कई पैमाने के स्तरों (पिरामिड का उपयोग करके) के लिए खाता है, लेकिन यह कितने स्तरों का उपयोग करेगा (यह निश्चित रूप से ट्यूबल है) के लिए एक सीमा है।

कीपॉइंट डिटेक्टर शायद सबसे अच्छा काम कर रहा है जब यह आपके द्वारा वांछित सुविधाओं की संख्या से कम रिटर्न देता है। उदाहरण के लिए, यदि आप 400 मांगते हैं और 300 वापस पाते हैं, तो यह अच्छा है। यदि आपको हर बार 400 वापस मिल जाते हैं, तो शायद कुछ अच्छी सुविधाओं को छोड़ना होगा।

सुई छवि में हैस्टैक छवियों की तुलना में कम कीपॉइंट हो सकते हैं और फिर भी अच्छे परिणाम प्राप्त कर सकते हैं। अधिक जोड़ना आवश्यक नहीं है कि आपको भारी लाभ मिले, उदाहरण के लिए J = 400 और K = 40 के साथ मेरी हिट दर लगभग 92% है। J = 400 और K = 400 के साथ हिट दर केवल 96% तक जाती है।

हम स्केलिंग, रोटेशन, मिररिंग आदि को हल करने के लिए हैमिंग फ़ंक्शन की चरम गति का लाभ उठा सकते हैं। एक मल्टीपल-पास तकनीक का उपयोग किया जा सकता है। प्रत्येक पुनरावृत्ति पर, उप-आयतों को फिर से बदलें, और फिर से खोज फ़ंक्शन चलाएँ।


8

जैसा कि कार्टमैन ने बताया, आप सटीक डुप्लिकेट खोजने के लिए किसी भी प्रकार के हैश मान का उपयोग कर सकते हैं।

करीबी चित्र खोजने के लिए एक शुरुआती बिंदु यहां हो सकता है । यह CG कंपनियों द्वारा उपयोग किया जाने वाला एक उपकरण है जो यह जांचने के लिए करता है कि क्या प्रतिमा चित्र अभी भी अनिवार्य रूप से एक ही दृश्य दिखा रहे हैं।


7

मेरे पास एक विचार है, जो काम कर सकता है और यह बहुत तेजी से होने की संभावना है। आप 80x60 रिज़ॉल्यूशन या तुलनीय कहने के लिए एक छवि को उप-नमूना कर सकते हैं, और इसे ग्रे स्केल में बदल सकते हैं (सब्मिट करने के बाद यह तेज़ हो जाएगा)। उन दोनों छवियों को संसाधित करें जिनकी आप तुलना करना चाहते हैं। फिर दो छवियों (क्वेरी छवि और db से प्रत्येक), या इससे भी बेहतर सामान्यीकृत क्रॉस सहसंबंध के बीच चुकता अंतर का सामान्यीकृत योग चलाएं, जो दोनों छवियों के समान होने पर प्रतिक्रिया को 1 के करीब देता है। तब यदि छवियां समान हैं तो आप यह सत्यापित करने के लिए अधिक परिष्कृत तकनीकों पर आगे बढ़ सकते हैं कि यह वही छवियां हैं। स्पष्ट रूप से यह एल्गोरिथ्म आपके डेटाबेस में छवियों की संख्या के मामले में रैखिक है, भले ही यह आधुनिक हार्डवेयर पर प्रति सेकंड 10000 छवियों तक बहुत तेज़ हो। यदि आपको घूमने के लिए व्युत्क्रम की आवश्यकता है, तो इस छोटी छवि के लिए एक प्रमुख ढाल की गणना की जा सकती है, और फिर पूरे समन्वय प्रणाली को कैनोनिकल ओरिएंटेशन के लिए घुमाया जा सकता है, हालांकि यह धीमा होगा। और नहीं, यहाँ पैमाने पर कोई भी आक्रमण नहीं है।

यदि आप कुछ अधिक सामान्य चाहते हैं या बड़े डेटाबेस (छवियों के मिलियन) का उपयोग कर रहे हैं, तो आपको छवि पुनर्प्राप्ति सिद्धांत (पिछले 5 वर्षों में दिखाई देने वाले कागजात का भार) पर ध्यान देने की आवश्यकता है। अन्य उत्तरों में कुछ संकेत हैं। लेकिन यह ओवरकिल हो सकता है, और सुझाव हिस्टोग्राम दृष्टिकोण काम करेगा। हालांकि मुझे लगता है कि कई अलग-अलग तेज़ दृष्टिकोणों का संयोजन और भी बेहतर होगा।


7

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

मैं कहना चाहता हूं कि मैंने एक आदर्श समाधान खोजने का प्रयास करने के लिए इंटरनेट पर दूर-दूर तक खोज की है। मैंने अपना स्वयं का एज डिटेक्शन एल्गोरिथम भी विकसित किया।
मैंने कई मॉडलों की गति और सटीकता का मूल्यांकन किया है। मेरी छवियां, जिनमें सफेद पृष्ठभूमि है, चरणबद्ध तरीके से काम करती है। जैसे रैडक्लेक्स ने कहा, मैं फश या अहाश की सलाह देता हूं। ऐसा न करेंMD5 हैशिंग या किसी भी प्रकार के क्रिप्टोग्राफ़िक हैश का उपयोग करें। जब तक, आप केवल EXACT छवि मिलान चाहते हैं। छवियों के बीच होने वाले किसी भी आकार या हेरफेर से एक अलग हैश निकलेगा।

Phash / ahash के लिए, इसे देखें: imagehash

मैं अपना कोड और मेरी सटीकता पोस्ट करके * redcalx * पोस्ट को विस्तारित करना चाहता था।

मैं क्या करूं:

from PIL import Image
from PIL import ImageFilter
import imagehash

img1=Image.open(r"C:\yourlocation")
img2=Image.open(r"C:\yourlocation")
if img1.width<img2.width:
    img2=img2.resize((img1.width,img1.height))
else:
    img1=img1.resize((img2.width,img2.height))
img1=img1.filter(ImageFilter.BoxBlur(radius=3))
img2=img2.filter(ImageFilter.BoxBlur(radius=3))
phashvalue=imagehash.phash(img1)-imagehash.phash(img2)
ahashvalue=imagehash.average_hash(img1)-imagehash.average_hash(img2)
totalaccuracy=phashvalue+ahashvalue

यहाँ मेरे कुछ परिणाम हैं:

item1  item2  totalsimilarity
desk1  desk1       3
desk1  phone1     22
chair1 desk1      17
phone1 chair1     34

उम्मीद है की यह मदद करेगा!


6

मेरा मानना ​​है कि छवि का आकार लगभग एक आइकन आकार तक गिराना, 48x48 कहना, फिर ग्रेस्केल में परिवर्तित करना, फिर पिक्सेल या डेल्टा के बीच का अंतर लेना, अच्छी तरह से काम करना चाहिए। क्योंकि हम वास्तविक पिक्सेल रंग के बजाय पिक्सेल रंग में बदलाव की तुलना कर रहे हैं, इससे कोई फर्क नहीं पड़ेगा कि छवि थोड़ी हल्की है या गहरी है। पिक्सेल के बहुत अधिक प्रकाश / अंधेरे खो जाने से बड़े बदलाव मायने रखेंगे। आप इसे एक पंक्ति में लागू कर सकते हैं, या आप सटीकता बढ़ाना पसंद करते हैं। तुलनात्मक कुंजी बनाने के लिए आपके पास 47x47 = 2,209 सबट्रैक्शन होंगे।


3

100 यादृच्छिक बिंदुओं को चुनने का मतलब यह हो सकता है कि समान (या कभी-कभी भी असमान) छवियों को उसी के रूप में चिह्नित किया जाएगा, जो मुझे लगता है कि आप क्या चाहते हैं। एमडी 5 हैश काम नहीं करेगा अगर चित्र अलग-अलग प्रारूप (पीएनजी, जेपीईजी, आदि) थे, विभिन्न आकार थे, या अलग मेटाडेटा थे। सभी छवियों को एक छोटे आकार में कम करना एक अच्छी शर्त है, पिक्सेल-फॉर-पिक्सेल तुलना करना तब तक बहुत लंबा नहीं होना चाहिए जब तक आप एक अच्छी छवि पुस्तकालय / तेज़ भाषा का उपयोग कर रहे हैं, और आकार काफी छोटा है।

आप उन्हें छोटा बनाने की कोशिश कर सकते हैं, फिर अगर वे एक ही आकार पर एक और तुलना करते हैं - तो गति और सटीकता का एक अच्छा संयोजन हो सकता है ...


यदि आप सटीक डुप्लिकेट की तलाश कर रहे हैं, लेकिन विभिन्न स्वरूपों / मेटाडेटा के साथ, आप वास्तविक पिक्सेल मानों का हैश (जैसे MD5) कर सकते हैं। Imagemagick इसे एक हस्ताक्षर (क्रिप्टोग्राफ़िक हस्ताक्षर से संबंधित नहीं) कहता है। आप इसे पहले भी कम कर सकते हैं, उदाहरण के लिए जेपीईजी कलाकृतियों के प्रभाव को कम करने के लिए प्रति पिक्सेल 4 बिट्स को काटकर, या थोड़े से रिकॉल किए गए चित्रों से मिलान करने के लिए ग्रेस्केल में परिवर्तित करें।
रेना

2

यदि आपके पास बड़ी संख्या में चित्र हैं, तो एक ब्लूम फ़िल्टर पर गौर करें , जो एक संभावित लेकिन कुशल परिणाम के लिए कई हैश का उपयोग करता है। यदि छवियों की संख्या बहुत बड़ी नहीं है, तो m55 जैसी क्रिप्टोग्राफ़िक हैश पर्याप्त होनी चाहिए।


तो (ब्लूम फ़िल्टर को समझने की कोशिश कर रहा है) - क्या इसका मतलब यह है कि आप बेस इमेज पर यादृच्छिक पिक्सेल बिंदुओं का चयन करते हैं, अनियमित रूप से पिक्सेल का लाल / हरा / नीला मूल्य प्राप्त करते हैं - फिर नई छवि की तुलना करें? और फिर एक संभावना स्तर (90% मैच) का उपयोग करके यह निर्धारित करें कि दोनों चित्र समान कैसे हैं?
९'०

5
यह एक समानता जांच नहीं है, यह एक तुल्यता जांच है। यदि आपको समानता की आवश्यकता है, तो हैशिंग सही दृष्टिकोण नहीं है। ब्लूम के पीछे का विचार अद्वितीय पहचान की संभावना को बढ़ाने के लिए कई हैश एल्गोरिदम का उपयोग करना है। यादृच्छिक अंकों का चयन करना हैशिंग एल्गोरिथ्म के लिए सबसे अच्छा तरीका नहीं है क्योंकि यह हर बार अलग-अलग परिणाम देगा।
jdigital
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.