2012-07-04 12 views
11

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

कुछ छवियां "कंप्यूटर ग्राफ़िक" हैं - यानी ठोस रंग भरने वाले रेक्ट, रास्टरराइज्ड ग्रंथ आदि। जबकि "फोटोग्राफिक" छवियां भी हैं - जिनमें समृद्ध रंग स्पेक्ट्रम होता है, जो उचित शोर आयाम के साथ अधिक चिकनी होता है।

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

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

मुझे आश्चर्य है कि पसंदीदा हैशिंग एल्गोरिदम क्या है।

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

लेकिन इस तरह के एक बेवकूफ एल्गोरिदम का उपयोग "कृत्रिम" ग्राफिक्स के साथ नहीं किया जा सकता है। समान पिक्सल, पैटर्न दोहराते हुए, ज्यामितीय ऑफ़सेट आविष्कार ऐसी छवियों के लिए बहुत आम हैं। सभी पिक्सल XOR-ing किसी भी छवि के लिए 0 समान पिक्सेल की संख्या के साथ 0 देगा।

सीआरटी -32 जैसे कुछ का उपयोग कुछ हद तक आशाजनक दिखता है, लेकिन मैं कुछ तेज़ी से समझना चाहता हूं। मैं पुनरावृत्ति सूत्र के बारे में सोचा, प्रत्येक नए पिक्सेल वर्तमान हैश मान mutates, इस तरह:,

hashValue = (hashValue * /*something*/ | newPixelValue) % /* huge prime */ 

सापेक्ष अभाज्य संख्या कर शायद एक अच्छा फैलाव देना चाहिए ताकि मैं इस विकल्प की ओर झुकाव रहा हूँ। लेकिन मैं जानना चाहता हूं कि बेहतर विक्रेता हैं या नहीं।

अग्रिम धन्यवाद।

+0

आप एमडी 5 जैसे कुछ सादा हैशिंग एल्गोरिदम का उपयोग क्यों नहीं करते? –

+0

@ करोल होर्वथ: अच्छा सवाल। दरअसल यह वही है जो मुझे कम या ज्यादा चाहिए। हालांकि एमडी 5 (अनुमानतः) सीपीयू-भूखा है, इसे एक तरफा हैश फ़ंक्शन होने के लिए डिज़ाइन किया गया है। ओटीओएच मुझे कुछ आसान चाहिए, क्योंकि मेरे पास कोई सुरक्षा विचार नहीं है। हालांकि मैं सीआरसी -32 के बारे में। लेकिन मैं कुछ भी आसान समझना चाहता हूं – valdo

+0

यदि आप इसे बहुत सारी छवियों पर करते हैं, तो बाधा आपकी डिस्क की गति होगी .. –

उत्तर

7

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

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

एक सरल एल्गोरिथ्म

Random generator = new generator(2847) // Initialized with fixed seed 
int num_iterations = 100 

int hash(Image image) { 
    generator.reset() //To ensure consistency on each evaluation 
    int value = 0 
    for num_iteration steps { 
     int nextValue = image.getPixel(generator.nextInt()%image.getSize()).getValue() 
     value = value + nextValue*generator.nextInt() 
    } 
    return value 
} 
+0

उत्तर के लिए धन्यवाद। मुझे पूरे ग्रिड सेल को पढ़ने में कोई समस्या नहीं है। मेरी ग्रिड कोशिकाएं बहुत छोटी हैं (8x8 या 16x16)। इसके अलावा, जब दो छवियों के हैश मान बराबर होते हैं - मैं फिर भी सुनिश्चित करता हूं कि छवियां बराबर हैं। लापता एकमात्र पैरामीटर हैश फ़ंक्शन स्वयं ही है। यह क्या होना चाहिए? – valdo

+2

यदि आपको क्रिप्टोग्राफ़िक सुरक्षा की आवश्यकता नहीं है, और केवल कृत्रिम छवियों के बारे में चिंतित है, तो वर्णित गुणांक वाले पिक्सेल-मानों का एक सरल रैखिक संयोजन पर्याप्त होना चाहिए, जैसा कि मैंने वर्णन किया है। समस्या एक पूर्णांक सरणी के हैश को खोजने के समान है जैसे v1 = [34,2,4,92,3], v2 = [10,3,5,20,3]। आपका लक्ष्य यह देखने के लिए है कि कौन से हैं बराबर हैं। शुरुआत में एक यादृच्छिक रूप से चुने गए निश्चित वेक्टर एम = [72,37,1,4,34] चुनें। प्रत्येक इनपुट वेक्टर के लिए, v1 का हैश मान v1 * m = 34 * 72 + 2 * 37 + 4 * 1 + 92 * 4 + 3 * 34 है। यदि आप चाहें तो आप इस नंबर मॉड्यूलो को किसी प्राइम की भी गणना कर सकते हैं। – akashnil

5

की छद्म कोड phash एल्गोरिथ्म http://www.hackerfactor.com/blog/index.php?/archives/432-Looks-Like-It.html जो बारीकी से मिलान छवियों को खोजने के लिए किया जाता है पर इस ट्यूटोरियल पर एक नज़र डालें।

+0

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

+0

@ वाल्डो: मैंने कुछ और जानकारी जोड़ा। – Bytemain

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