2009-11-10 9 views
5

के साथ समान रंग पैलेट वाली छवियां खोजें मान लीजिए कि गैलरी में 10,000 जेपीईजी, पीएनजी छवियां हैं, समान रंग पट्टियों वाली सभी छवियों को समान छवि द्वारा क्रमबद्ध एक चयनित छवि में कैसे ढूंढें?पाइथन

+2

संभावित डुप्लिकेट: http://stackoverflow.com/questions/593925/how-do-i-find-images-with-a -सिमर-रंग-उपयोग-पायथन-और-पायल – ChristopheD

+0

हाँ, लेकिन उस प्रश्न पर कोई अच्छा जवाब नहीं है। :-) –

+0

यहां बहुत सी समान चर्चाएं हैं: http://stackoverflow.com/questions/1034900/near-duplicate-image-detection/1048723#1048723 – Paul

उत्तर

10

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

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

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

def bucket_from_pixel(r, g, b): 
    hue = hue_from_rgb(r, g, b) # [0, 360) 
    return (hue * NUM_BUCKETS)/360 

आप भी एक सामान्य मिलान चाहते हैं, तो आप कर सकते हैं पूर्ण आरजीबी मूल्य के आधार पर बाल्टी चुनें।

पीआईएल का उपयोग करके, आप अंतर्निहित histogram फ़ंक्शन का उपयोग कर सकते हैं। "निकटता" हिस्टोग्राम की गणना किसी भी दूरी माप का उपयोग करके की जा सकती है। उदाहरण के लिए, एक एल 1 दूरी हो सकता है:

hist_sel = normalize(sel.histogram()) 
hist = normalize(o.histogram()) # These normalized histograms should be stored 

dist = sum([abs(x) for x in (hist_sel - hist)]) 

एक एल 2 होगा:

dist = sqrt(sum([x*x for x in (hist_sel - hist)])) 

Normalize सिर्फ हिस्टोग्राम की राशि बलों कुछ निरंतर मूल्य (1.0 काम करता है ठीक) बराबर करने के लिए। यह महत्वपूर्ण है ताकि बड़ी छवियों को छोटी छवियों की तुलना में सही ढंग से तुलना की जा सके। यदि आप एल 1 दूरी का उपयोग करने जा रहे हैं, तो आपको normalize में एल 1 उपाय का उपयोग करना चाहिए। यदि एल 2, तो एल 2।

+0

@ फ्रैंक, आपकी सलाह के लिए धन्यवाद। क्या आप मुझे पायथन में कुछ उदाहरण कोड दे सकते हैं? पीआईएल का बिल्ड-इन हिस्टोग्राम() फ़ंक्शन एक सूची देता है, यह निर्धारित करने के लिए कि दो छवियों के हिस्टोग्राम कितने करीब हैं? – jack

+0

@ फ्रैंक, ऐसा लगता है कि 10,000 उम्मीदवारों में समान हिस्टोग्राम वाली छवियों को चुनते समय 10,000 दूरी की गणना की आवश्यकता होती है? क्या प्रत्येक छवि के साथ संख्यात्मक मानों को जोड़ना और उन्हें डेटाबेस में संग्रहीत करना संभव है, इस प्रकार तुलना को कुछ एसक्यूएल प्रश्नों के लिए सरल बनाया जा सकता है? – jack

+0

@ जेक, 10,000 कैल्स वास्तव में महंगा नहीं है। इस तरह के कोड को गति देने का सबसे अच्छा तरीका हिस्टोग्राम को पूर्णांक में कम नहीं करना है (जो आपको लगता है कि नहीं किया जा सकता है) लेकिन केवल ** कैश ** परिणाम। डेटाबेस में सॉर्ट ऑर्डर (प्रति छवि) कैश करें या इसे मेमोरी में कैश करें। सुनिश्चित करें कि आप डेटाबेस में या स्मृति में हिस्टोग्राम भी संग्रहीत करते हैं ताकि उन सॉर्ट ऑर्डर कैश का पुनर्निर्माण महंगा न हो। –

0

आपका प्रश्न पहले से ही उत्तर दिया गया है। इन अन्य अतः जवाब पर एक नज़र डालें:

Algorithm for finding similar images

How can I quantify difference between two images?

+2

एक टिप्पणी होना चाहिए ... – ChristopheD

+2

मैं नहीं कहूंगा कि इसका उत्तर दिया गया है। वह पीआईएल-भूमि में फंस गया है। –