2008-12-03 8 views
38

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

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

संपादित करें: findimagedupes से प्रासंगिक कोड, ImageMagick

try $image->Sample("160x160!"); 
try $image->Modulate(saturation=>-100); 
try $image->Blur(radius=>3,sigma=>99); 
try $image->Normalize(); 
try $image->Equalize(); 
try $image->Sample("16x16"); 
try $image->Threshold(); 
try $image->Set(magick=>'mono'); 
($blob) = $image->ImageToBlob(); 
का उपयोग कर

संपादित करें: चेतावनी! ImageMagick $ image ऑब्जेक्ट में पढ़ने वाली छवि फ़ाइल के निर्माण समय के बारे में जानकारी शामिल है। इसका मतलब है कि आपको प्राप्त होने वाला ब्लॉब एक ​​ही छवि के लिए अलग होगा, अगर इसे किसी अन्य समय पर पुनर्प्राप्त किया गया हो। यह सुनिश्चित करने के लिए कि फिंगरप्रिंट वही रहता है, अंतिम छवि के रूप में $ image-> getImageSignature() प्राप्त करें।

+1

यह प्रक्रिया बेहद प्रोसेसर गहन लगता है। – endolith

+0

* इसका मतलब है कि आपको प्राप्त होने वाला ब्लॉब एक ​​ही छवि के लिए भी अलग होगा, अगर इसे किसी अन्य समय पर पुनर्प्राप्त किया गया था। * यह $ $ blob "स्ट्रिंग (यदि डबल कोट्स में डाल दिया गया है) के लिए सच नहीं है, यदि छवि पिक्सल समान हैं तो वही 32 बाइट होंगे। – pts

उत्तर

14

findimagedupes बहुत अच्छा है। उदाहरण के लिए, आप इसे "प्रेसेप्टिव हैश" प्रिंट करने के लिए "findimagedupes -v फिंगरप्रिंट छवियों" चला सकते हैं।

+0

बिल्कुल पाइथन में लागू एक ही एल्गोरिदम (ग्राफ़िक्स मैगिक भारी उठाने के साथ): https://github.com/pts/pyfindimagedupes – pts

-2

आप यह देखने के लिए diff का उपयोग कर सकते हैं कि वे वास्तव में अलग हैं या नहीं .. मुझे लगता है कि यह बहुत बेकार तुलना को हटा देगा। फिर, एल्गोरिदम के लिए, मैं एक संभाव्य दृष्टिकोण का उपयोग करूंगा .. वे क्या संभावनाएं देख रहे हैं .. मैं प्रत्येक पिक्सेल में आरजीबी की मात्रा पर आधारित था। आप कुछ अन्य मीट्रिक भी पा सकते हैं जैसे चमकदारता और उस तरह की चीजें।

1

मुझे इसके पीछे एल्गोरिदम नहीं पता है, लेकिन Microsoft Live Image Search बस added यह क्षमता। पिकासा में छवियों में चेहरों की पहचान करने की क्षमता भी है, और समूह समान दिखते हैं। ज्यादातर समय, यह वही व्यक्ति है।

कुछ मशीन सीखने की तकनीक जैसे समर्थन वेक्टर मशीन, तंत्रिका नेटवर्क, बेवकूफ बेयस क्लासिफायर या बेयसियन नेटवर्क इस प्रकार की समस्या पर सबसे अच्छा होगा। मैंने हस्तलिखित अंकों को वर्गीकृत करने के लिए पहले तीन में से प्रत्येक को लिखा है, जो अनिवार्य रूप से छवि पैटर्न पहचान है।

0

छवि को 1x1 पिक्सेल में आकार बदलें ... यदि वे सटीक हैं, तो एक छोटी संभावना है कि वे एक ही तस्वीर हैं ... अब इसे 2x2 पिक्सेल छवि में आकार दें, यदि सभी 4 पिक्सल सटीक हैं, तो वहां एक बड़ी संभावना है कि वे सटीक हैं ... फिर 3x3, यदि सभी 9 पिक्सल सटीक हैं ... अच्छा मौका इत्यादि फिर 4x4, यदि सभी 16 पिक्सेल सटीक हैं, तो बेहतर मौका।

आदि ...

यह इस तरह से कर रही है, आप दक्षता improvments कर सकते हैं ... अगर 1x1 पिक्सेल ग्रिड एक बहुत से बंद है, क्यों 2x2 ग्रिड जाँच परेशान? आदि

+0

यह उन मामलों में काम नहीं करेगा जहां एक छवि को थोड़ा समायोजित किया गया है, ताकि यह थोड़ा हो गहरा या अधिक संतृप्त, या एक छोटी राशि फसल की गई है। आपको यह भी ध्यान रखना होगा कि पुनर्वसन एक महंगी मामला है, खासकर जब बड़ी छवियों पर बाइबिक इंटरपोलेशन का उपयोग करते हैं। –

+0

निश्चित रूप से पहला कदम मूल छवि को कम से कम आकार में कम करना होगा। "एक पहाड़ी पर फूल" छवि को "जीड पर फूल" से अलग करने के लिए 10 ग्राम होने के लिए "पहाड़ी पर पेड़" की कोई आवश्यकता नहीं है। – willc2

-2

DPEG, "द डुप्लिकेट मीडिया प्रबंधक है, लेकिन इसका कोड खुला नहीं है। यह एक बहुत पुराना टूल है - मुझे 2003 में इसका उपयोग याद है।

+2

दो डाउनवॉट क्यों? उपयोगकर्ता कमांड लाइन उपकरण मांग रहा था, प्रोग्रामिंग समाधान नहीं। –

+0

@pts: लिंक मेरे लिए टूटा नहीं गया था; यह वर्तमान लिंक पर रीडायरेक्ट किया गया। मैंने वैसे भी जवाब अपडेट किया है। –

0

यदि आपके पास बहुत सारी छवियां हैं, तो एक रंग हिस्टोग्राम का उपयोग छवियों की मोटाई निकटता प्राप्त करने के लिए किया जा सकता है ताकि प्रत्येक छवि की एक पूर्ण छवि तुलना पूरी हो सके (यानी ओ (एन^2))।

4

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

5

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

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

MATLAB उदाहरण: Registering an Image Using Normalized Cross-Correlation

विकिपीडिया कॉल इस "phase correlation" और यह भी वर्णन करता है making it scale- and rotation-invariant:

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

संबंधित मुद्दे