algorithm - दो छवियों की तुलना करने के लिए एल्गोरिदम




image image-processing (6)

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

क्या आप इस तरह की नौकरी करने के लिए कोई एल्गोरिदम जानते हैं?


एक विचार:

  1. छवि में कुछ बिंदुओं (जैसे सिफ्ट, सुरफ, ग्लो, या एलईएसएच) के स्केल- और ट्रांसफॉर्म-इनवेरिएंट डिस्क्रिप्टर खोजने के लिए कीपॉइंट डिटेक्टरों का उपयोग करें।
  2. दोनों छवियों (जैसे पैनोरामा सिलाई में) के समान वर्णनकर्ताओं के साथ कीपॉइंट्स को संरेखित करने का प्रयास करें, यदि आवश्यक हो तो कुछ छवि परिवर्तनों की अनुमति दें (जैसे स्केल और घुमाएं, या लोचदार खींचें)।
  3. यदि कई कीपॉइंट्स अच्छी तरह संरेखित होते हैं (ऐसे ट्रांसफॉर्म मौजूद हैं, तो किपॉइंट संरेखण त्रुटि कम है; या परिवर्तन "ऊर्जा" कम है, आदि), आपके पास समान छवियां हो सकती हैं।

चरण 2 छोटा नहीं है। विशेष रूप से, आपको अन्य छवि पर सबसे समान कुंजीपटल खोजने के लिए एक स्मार्ट एल्गोरिदम का उपयोग करने की आवश्यकता हो सकती है। प्वाइंट डिस्क्रिप्टर आमतौर पर बहुत उच्च-आयामी होते हैं (सौ पैरामीटर की तरह), और देखने के लिए कई बिंदु हैं। केडी-पेड़ यहां उपयोगी हो सकते हैं, हैश लुकअप अच्छी तरह से काम नहीं करते हैं।

प्रकार:

  • अंक के बजाय किनारों या अन्य विशेषताओं का पता लगाएं।

ऐसा लगता है कि यह वास्तव में बहुत कम सरल है :-) निक का सुझाव एक अच्छा है।

शुरू करने के लिए, ध्यान रखें कि किसी भी सार्थक तुलना विधि अनिवार्य रूप से छवियों को एक अलग रूप में परिवर्तित करके काम करेगी - एक ऐसा फॉर्म जो समान सुविधाओं को चुनना आसान बनाता है। आमतौर पर, यह सामान बहुत हल्के पढ़ने के लिए नहीं बनाता है ...


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

http://en.wikipedia.org/wiki/RGB_color_space
http://upvector.com/index.php?section=tutorials&subsection=tutorials/colorspace


एक और उदाहरण में हफ़ ट्रांसफॉर्म नामक कुछ शामिल है। यह परिवर्तन अनिवार्य रूप से एक छवि को लाइनों के एक सेट में विघटित करता है। फिर आप प्रत्येक छवि में कुछ 'सबसे मजबूत' रेखाएं ले सकते हैं और देख सकते हैं कि वे लाइन अप करते हैं या नहीं। आप रोटेशन और स्केलिंग के लिए भी कोशिश करने और क्षतिपूर्ति करने के लिए कुछ अतिरिक्त काम कर सकते हैं - और इस मामले में, कुछ लाइनों की तुलना करने से पूरी छवियों में ऐसा करने से बहुत कम कम्प्यूटेशनल काम होता है - यह इतना बुरा नहीं होगा।

http://homepages.inf.ed.ac.uk/amos/hough.html
http://rkb.home.cern.ch/rkb/AN16pp/node122.html
http://en.wikipedia.org/wiki/Hough_transform


पेपर पढ़ें: पोरिक्ली, फतेह, ओनेल तुज़ेल और पीटर मीर। "रिमैनियन मैनिफोल्ड्स पर मीन के आधार पर मॉडल अपडेट का उपयोग कर कॉन्वर्सिस ट्रैकिंग"। (2006) आईईईई कंप्यूटर विजन और पैटर्न पहचान।

मैं इस पेपर में प्रस्तुत तकनीक का उपयोग करके निकटवर्ती वेबकैम से प्राप्त छवियों में ओवरलैपिंग क्षेत्रों का पता लगाने में सफलतापूर्वक सक्षम था। मेरा कॉन्वर्सिस मैट्रिक्स सोबेल, कैनी और सुसान पहलू / एज डिटेक्शन आउटपुट के साथ-साथ मूल ग्रेस्केल पिक्सल से बना था।


मेरा मानना ​​है कि यदि आप हर संभव अभिविन्यास और नकारात्मक संस्करणों के दृष्टिकोण को लागू करने के इच्छुक हैं, तो छवि पहचान (अच्छी विश्वसनीयता के साथ) की अच्छी शुरुआत eigenfaces का उपयोग करना है: http://en.wikipedia.org/wiki/Eigenface

एक और विचार दोनों छवियों को उनके घटकों के वैक्टर में बदलने के लिए होगा। ऐसा करने का एक अच्छा तरीका है एक वेक्टर बनाना जो x * y आयामों में चल रहा है (x आपकी छवि की चौड़ाई और वाई ऊंचाई है), प्रत्येक आयाम के लिए मान (x, y) पिक्सेल मान पर लागू होता है। फिर दो श्रेणियों के साथ के-नजदीकी पड़ोसियों का एक संस्करण चलाएं: मैच और कोई मिलान नहीं। यदि यह मूल छवि के करीब पर्याप्त है तो यह मैच श्रेणी में फिट होगा, अगर नहीं तो यह नहीं होगा।

के निकटतम पड़ोसियों (केएनएन) यहां पाए जा सकते हैं, वेब पर भी इसके बारे में अन्य अच्छी व्याख्याएं हैं: http://en.wikipedia.org/wiki/K-nearest_neighbor_algorithm

केएनएन के लाभ यह है कि आप जिस मूल रूप से मूल छवि की तुलना कर रहे हैं, उतना सटीक एल्गोरिदम बन जाता है। नकारात्मकता आपको पहले सिस्टम को प्रशिक्षित करने के लिए छवियों की एक सूची की आवश्यकता है।


यदि आप लिनक्स चला रहे हैं तो मैं दो टूल्स सुझाऊंगा:

पैकेज hugin-tools से align_image_stack - एक कमांडलाइन प्रोग्राम है जो स्वचालित रूप से रोटेशन, स्केलिंग और अन्य विकृतियों को सही कर सकता है (यह ज्यादातर एचडीआर फोटोग्राफी को कंपोजिट करने के लिए है, लेकिन वीडियो फ्रेम और अन्य दस्तावेजों के लिए भी काम करता है)। अधिक जानकारी: http://hugin.sourceforge.net/docs/manual/Align_image_stack.html

पैकेज इमेजमैजिक से तुलना करें - एक प्रोग्राम जो दो छवियों में विभिन्न पिक्सेल की मात्रा को ढूंढ और गिन सकता है। यहां एक साफ ट्यूटोरियल है: http://www.imagemagick.org/Usage/compare/ -fuzz एन% uising आप त्रुटि सहनशीलता बढ़ा सकते हैं। जितना ऊंचा होगा उतना अधिक त्रुटि सहनशीलता जितनी अधिक होगी उतनी ही दो पिक्सेल की गणना होगी।

align_image_stack को किसी ऑफसेट को सही करना चाहिए ताकि तुलना कमांड को वास्तव में समान पिक्सल का पता लगाने का मौका मिले।


यह सिर्फ एक सुझाव है, यह काम नहीं कर सकता है और मैं इस पर फोन करने के लिए तैयार हूं।

यह झूठी सकारात्मक उत्पन्न करेगा, लेकिन उम्मीद है कि झूठी नकारात्मक नहीं है।

  1. दोनों छवियों का आकार बदलें ताकि वे एक ही आकार के हों (मुझे लगता है कि चौड़ाई से लेकर लंबाई दोनों के अनुपात दोनों छवियों में समान हैं)।

  2. एक लापरवाह संपीड़न एल्गोरिदम (जैसे gzip) के साथ दोनों छवियों का एक बिटमैप संपीड़ित करें।

  3. उन फाइलों के जोड़े खोजें जिनमें समान फ़ाइल आकार हैं। उदाहरण के लिए, आप बस फाइलों के प्रत्येक जोड़ी को सॉर्ट कर सकते हैं कि फाइल आकार कितने समान हैं और शीर्ष एक्स को पुनर्प्राप्त कर सकते हैं।

जैसा कि मैंने कहा, यह निश्चित रूप से झूठी सकारात्मक उत्पन्न करेगा, लेकिन उम्मीद है कि झूठी नकारात्मक नहीं है। आप इसे पांच मिनट में कार्यान्वित कर सकते हैं, जबकि Porikil et। अल। शायद व्यापक काम की आवश्यकता होगी।





image-recognition