getRGB

2011-12-31 8 views
6

का उपयोग कर जावा में समान रंगों से मिलान कैसे करें मैं रोबोट का उपयोग करके स्क्रीन के स्क्रीनशॉट ले रहा हूं और फिर उन स्क्रीनशॉट के भीतर छोटी छवियों की खोज कर रहा हूं। यह विंडोज पर काम करता है लेकिन गामा सुधार की वजह से ओएस एक्स नहीं। सबसे अच्छा समाधान मैं साथ आ सकता हूं बस सटीक रंग मिलान के बजाय समान रंगों से मेल खाना है।getRGB

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

मेरा प्रश्न कैसे मैं निर्धारित करने के बारे में जाना है, कहते हैं कि मैं BufferedImage स्क्रीनशॉट और BufferedImage smallImage था की सुविधा देता है, अगर Screenshot.getRGB (1,1) और smallImage.getRGB (1,1) कर रहे हैं समान रंग?

+0

आप एक तेज़ तरीका से * getRGB * ... * getRGB * वास्तव में हो सकता है पिक्सेल मूल्यों को प्राप्त करने के बारे में एक टिप्पणी में पूछा: Ava, वहाँ किसी भी आसान तरीका आरजीबी मूल्यों से कन्वर्ट करने के लिए अन्य रंग रिक्त स्थान में है बहुत धीमी: कुछ ओएस एक्स संस्करणों पर यह अंतर्निहित * int [] * से सीधे पिक्सेल मान प्राप्त करने की तुलना में धीमी गति से दो ऑर्डर परिमाण (yup, एक सौ बार धीमा [!], ओएस एक्स 10.4 पर मापा जा सकता है) तक धीमा हो सकता है। किसी छवि से हिस्टोग्राम निकालने के तेज़ तरीके के बारे में यहां मेरे (स्वीकृत) उत्तर देखें: http://stackoverflow.com/questions/8218072/faster-way-to-extract-histogram-from-an-image/8218570#8218570 आपके मामले में एक समान तकनीक लागू की जा सकती है, दोनों तेजी से और गामा सुधार चकमा दे सकते हैं। – TacticalCoder

उत्तर

4

एक दिलचस्प कागज वास्तव में इस समस्या पर नहीं है: एम द्वारा

एक नई Perceptually वर्दी सामग्री आधारित छवि के लिए एसोसिएटेड रंग समानता उपाय और वीडियो रिट्रीवल साथ रंग रिक्ति Sarifuddin और Rokia Missaoui

आप इस गूगल या विशेष रूप से आसानी से का उपयोग कर पा सकते हैं Google Scholar.

संक्षेप में, कुछ रंग रिक्त स्थान (उदा। आरजीबी, एचएसवी, लैब) और दूरी उपायों (जैसे कि ज्यामितीय माध्य और यूक्लिडियन दूरी) दूसरों की तुलना में रंग समानता के मानव धारणा के बेहतर प्रतिनिधित्व हैं। पेपर एक नई रंगीन जगह के बारे में बात करता है, जो बाकी की तुलना में बेहतर है, लेकिन यह आम मौजूदा रंग रिक्त स्थान और दूरी उपायों की अच्छी तुलना भी प्रदान करता है। योग्यता *, ऐसा लगता है कि सामान्य रूप से उपलब्ध रंग रिक्त स्थान का उपयोग करके अवधारणात्मक दूरी के लिए सबसे अच्छा उपाय है: एचएसवी रंग स्थान और बेलनाकार दूरी माप।

* कम से कम, संदर्भित पेपर में चित्र 15 के अनुसार।

बेलनाकार दूरी मापन (लेटेक्स संकेतन में) है:

D_ {cyl} = \ sqrt {\ डेल्टा वी^{2} + S_1^{2} + S_2^{2} -2S_1S_2cos (\ डेल्टा एच)}

यह भी ध्यान रखें कि कुछ इसी तरह के सवाल है कि एक ही मुद्दे के समाधान कर रहे हैं:

finding similar colors programatically

"Distance" between colours in PHP

अंत में, जम्मू में

ColorSpace.fromRGB

1

रंग समानता के लिए, DR=R1-R2, DG=G1-G2, DB=B1-B2, तो DR×DR+DG×DG+DB×DB की गणना और कि का वर्गमूल ले, और कुछ सीमा मूल्य की तुलना करते हैं। बेशक, इसे स्क्वायर रूट भाग को छोड़कर बस थ्रेसहोल्ड को स्क्वायर करके अनुकूलित किया जा सकता है।

लेकिन आप से बेहतर हो सकता है अगर आप किसी भी तरह OSX एक PNG परदे पर अपनी छवि युक्त रेंडर करने के लिए प्राप्त करने के लिए प्रबंधन, तो स्क्रीन के उस भाग को पढ़ने, और फिर उस के खिलाफ सटीक मिलान के लिए लग रही है।

+0

आपका एक ज्यामितीय मतलब है, मुझे लगता है। यूक्लिडियन दूरी गणना का उपयोग करने से यह बेहतर कैसे है? छद्म कोड में, 'sqrt (वर्ग (आर 1-आर 2) + वर्ग (जी 1-जी 2) + वर्ग (बी 1-बी 2)) ' –

+0

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

+0

@ होवरक्राफ्टफुलऑफल्स डॉन अल्जाइमर। मैं अपना जवाब सही कर दूंगा। –

0

क्या आप this getRGB विधि का उपयोग कर रहे हैं? यदि हां, तो मैं सरणी तत्वों 1 से 3 (आरजीबी) की तुलना एक दूसरे के साथ घटाकर और जांच करूँगा कि इसका पूर्ण मूल्य किसी दिए गए थ्रेसहोल्ड (उदा। 10) से नीचे है या नहीं। तो यह हो सकता है अगर बयान के बिना की तरह कुछ

if(Math.abs(firstPixel[1]-secondPixel[1])<10) 
    redIsSimilar = true; 
else 
    redIsSimilar=false; 

:

redIsSimilar = Math.abs(firstPixel[1]-secondPixel[1]) < 10; 

बेशक आप हरे और नीले रंग के लिए इस पेस्ट के साथ-साथ कॉपी करना होगा। आशा इस मदद करता है, क्रिस्टोफ

+0

मैं यहां bufferedImage क्लास के getRGB का उपयोग कर रहा हूं http://docs.oracle.com/javase/1.4.2/docs/api/java/awt/image/BufferedImage.html#getRGB(int, int) – Macmee