2011-03-02 19 views
13

जब मैं इसे अपने रूबी पर रेल एप्लिकेशन पर अपलोड करता हूं तो मुझे छवि से औसत रंग जानने की आवश्यकता होती है। क्या इस रंग का उपयोग इस छवि को प्रदर्शित करने के लिए बाद में इस रंग का उपयोग करने के लिए हेक्स या आरजीबी में औसत रंग मान प्राप्त करना संभव है?क्या RMagick के साथ औसत छवि रंग प्राप्त करना संभव है?

कुछ की तरह:

img = Magick::Image.read(path).first 
hexVal = img.getHexValue 
+0

जैसा कि मैंने जावास्क्रिप्ट का उपयोग करके आपके [संबंधित प्रश्न] पर पूछा है (http://stackoverflow.com/questions/ 5162828/कैसे-औसत-से-औसत-या-मुख्य-रंग-से-एक-छवि-के-जावास्क्रिप्ट के साथ): "क्या आप केवल सटीक पिक्सेल रंग चाहते हैं, या किसी विशेष एचएसवी रेंज के भीतर? (मैं चाहता था सुझाव देते हैं कि उत्तरार्द्ध आपको बेहतर सेवा देगा।) " – Phrogz

उत्तर

19

मुझे नहीं लगता कि आप अपनी औसत रंग सीधे के लिए एक RMagick छवि पूछ सकते हैं, लेकिन ऐसी बात कंप्यूटिंग कि मुश्किल नहीं है।

मुझे लगता है कि color histogram निकालने का सबसे आसान तरीका होगा और फिर अपने औसत की गणना करने के लिए इसका उपयोग करें। आप शायद छवि पहले quantize हालांकि, रंग का एक बहुत के साथ एक छवि के लिए हिस्टोग्राम कंप्यूटिंग चाहते हैं सस्ते और शायद व्यर्थ व्यस्त काम करता है, तो आप सिर्फ एक औसत में रुचि रखते हैं नहीं है:

total = 0 
avg = { :r => 0.0, :g => 0.0, :b => 0.0 } 
img.quantize.color_histogram.each { |c, n| 
    avg[:r] += n * c.red 
    avg[:g] += n * c.green 
    avg[:b] += n * c.blue 
    total += n 
} 
[:r, :g, :b].each { |comp| avg[comp] /= total } 

दैट ' आपको avg में औसत रंग देगा। लेकिन, रंग ImageMagick के आंतरिक प्रारूप में होगा (यानी घटकों शून्य से Magick::QuantumRange तक होती है जाएगा) ताकि आप उन्हें 0-255 के लिए नीचे पैमाने पर करने होंगे:

[:r, :g, :b].each { |comp| avg[comp] = (avg[comp]/Magick::QuantumRange * 255).to_i } 

और अंत में आप में आरजीबी घटक शून्य और 255 के बीच पूर्णांक के रूप में avg और हेक्स प्रारूप में औसत रंग प्राप्त करना तुच्छ होना चाहिए। वांछित अगर आप इसे आसानी से औसत चरण में विलय कर सकते हैं।

मैं शायद इटरेटर के साथ चतुर हो सकता हूं लेकिन .each चतुरता से अच्छा और स्पष्ट और स्पष्टता अधिक महत्वपूर्ण है।

आप क्वांटिज़ेशन चरण के साथ और उसके बिना भी कोशिश कर सकते हैं और जिन भी छवियों के साथ आप काम कर रहे हैं उनके लिए सबसे अच्छा काम कर सकते हैं।

+7

@zarazan: वह ब्लॉग 5 जुलाई 2011 दिनांकित है, मेरा उत्तर 2 मार्च 2011 को पोस्ट किया गया था। –

+1

@muistooshort यदि सभी क्वांटिज़ फ़ंक्शन करता है तो पिक्सल रंगों (मानते हुए) के औसत लेकर छवि कम जटिल होती है - यदि आप छवि को नीचे रंग की तरह मापते हैं तो भी आसान नहीं होगा: – sfkaos

+0

@sfkaos: मुझे अनुमान है कि आपकी टिप्पणी का लापता हिस्सा छवि को एक रंग में मापने के बारे में है। यह काम कर सकता है और मुझे लगता है कि यह [स्टीफ के] (http://stackoverflow.com/a/5164917/479863) के समान प्रभाव होगा "इसे एक पिक्सेल तक स्केल करें" दृष्टिकोण। मुझे यकीन नहीं है कि अंतर्निहित एल्गोरिदम पैलेट के साथ क्या करेंगे, मैं वास्तविक छवियों के साथ क्या होता है यह देखने के लिए कुछ परीक्षण चलाने के लिए चाहता हूं। हालांकि साफ विचार। –

21

छवि को एक पिक्सेल में बदलें और उसका रंग प्राप्त करें? - सभी प्रमात्रण समारोह करता है एक छवि कम जटिल बनाने है https://github.com/jonbuda/miro

+1

ए (बहुत) त्वरित परीक्षण से पता चला कि यह 'color_histogram' का उपयोग करने से बहुत तेज है। – joost

+1

वास्तव में स्मार्ट समाधान! +1 – bodacious

+0

हमें "मैजिक :: पिक्सेल" ऑब्जेक्ट मिलता है, लेकिन अगर हम हेक्स प्रारूप में आरजीबी चाहते हैं "जैसे सीएसएस उपयोग करता है (उदा। # F0a1b2)" हम इसे कैसे कर सकते हैं? – Aleksandrus

1

Miro मणि है, जो के दृष्टिकोण का पालन करने के लिए "म्यू बहुत छोटा है" लगता है उपयोग करने पर विचार पिक्सेल रंग की औसत लेने के द्वारा (यह मानते हुए) - और भी आसान अगर आप सिर्फ छवि quantized नहीं होगा की तरह रंग के लिए नीचे:

img.quantize(1,Magick::RGBColorspace).color_histogram 

और बस जिसके परिणामस्वरूप रंग का उपयोग करें?

1

@muistooshort के अनुसार:

img = Magick::Image.read(path).first 
pix = img.scale(1, 1) 
averageColor = pix.pixel_color(0,0) 
3

मुझे यहां प्रस्तुत सभी संभावनाओं का परीक्षण करने के बाद मेरा समाधान (here) मिला।

def maincolor() 
    img = Magick::Image.read(self.url).first 
    pix = img.scale(1, 1) 
    avg_color_hex = pix.to_color(pix.pixel_color(0,0)) 
    return avg_color_hex 
end 

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

+0

से नीचे tingel2k द्वारा इसका उत्तर दिया जाता है दुर्भाग्यवश यह विधि कभी-कभी अमान्य हेक्स रंग देता है। उदाहरण: "# एएसी 5 सी 3 एफ 1"। –

+0

क्या आप वाकई सही हैं, आपकी तस्वीर में सही रंग गहराई है? – tingel2k

+0

हम ... मुझे यकीन नहीं है। मैं उसे कैसे जान सकता हूं? या मैं छवि को कैसे परिवर्तित कर सकता हूं? –