2010-08-16 12 views
14

मुझे अजगर में एक साधारण छवि विश्लेषण करने पर कुछ सलाह चाहिए। मुझे किसी छवि की "चमक" के लिए मान की गणना करने की आवश्यकता है। मुझे पता है PIL इस तरह कुछ करने के लिए गोटो लाइब्रेरी है। एक अंतर्निहित हिस्टोग्राम समारोह है।पायथन का उपयोग कर छवि चमक का विश्लेषण करने के कुछ तरीके क्या हैं?

मुझे क्या चाहिए "perceived brightness" मूल्य मैं तय कर सकता हूं कि छवि में और समायोजन आवश्यक हैं या नहीं। तो इस स्थिति में काम करने वाली बुनियादी तकनीकों में से कुछ क्या हैं? क्या मुझे सिर्फ आरजीबी मूल्यों के साथ काम करना चाहिए, या हिस्टोग्राम मुझे कुछ करीब दे देगा?

एक संभावित समाधान दोनों को गठबंधन करना, और हिस्टोग्राम का उपयोग करके औसत आर, जी, और बी मान उत्पन्न करना हो सकता है, फिर "कथित चमक" सूत्र लागू करें।

+0

क्या आपको पीआईएल के साथ पाइथन में जुड़े एल्गोरिदम को लागू करने से रोकता है? क्या आप एक वैकल्पिक एल्गोरिदम के बारे में पूछ रहे हैं, पीआईएल का उपयोग कैसे करें या क्या? –

+0

बस यह सुनिश्चित करना चाहते हैं कि मुझे कुछ स्पष्ट सुविधा/मॉड्यूल नहीं मिल रहा है जो पहले से ही ऐसा करता है। ऐसा लगता है कि इस तरह की चीज पहले से मौजूद होनी चाहिए। – cmcginty

+0

एक * छवि * पर कथित चमक को समझना एक साधारण रंग की तुलना में मूल रूप से अलग है। दर्शक विषय की चमक के बारे में और अधिक ख्याल रख सकता है, लेकिन आमतौर पर विषय पिक्सेल की तुलना में अधिक पृष्ठभूमि पिक्सल होते हैं। –

उत्तर

30

प्रश्न में उल्लिखित तकनीकों का उपयोग करके, मैं कुछ अलग संस्करणों के साथ आया था।

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

  1. छवि को ग्रेस्केल में कनवर्ट करें, औसत पिक्सेल चमक लौटें।

    def brightness(im_file): 
        im = Image.open(im_file).convert('L') 
        stat = ImageStat.Stat(im) 
        return stat.mean[0] 
    
  2. Convert छवि, greyscale के लिए आरएमएस लौट पिक्सेल चमक।

    def brightness(im_file): 
        im = Image.open(im_file).convert('L') 
        stat = ImageStat.Stat(im) 
        return stat.rms[0] 
    
  3. औसत पिक्सल, फिर "कथित चमक" को बदलना।

    def brightness(im_file): 
        im = Image.open(im_file) 
        stat = ImageStat.Stat(im) 
        r,g,b = stat.mean 
        return math.sqrt(0.241*(r**2) + 0.691*(g**2) + 0.068*(b**2)) 
    
  4. पिक्सेल के आरएमएस, फिर "कथित चमक" में बदल जाते हैं। पिक्सल के

    def brightness(im_file): 
        im = Image.open(im_file) 
        stat = ImageStat.Stat(im) 
        r,g,b = stat.rms 
        return math.sqrt(0.241*(r**2) + 0.691*(g**2) + 0.068*(b**2)) 
    
  5. की गणना "कथित चमक", तो औसत लौट आते हैं।

    def brightness(im_file): 
        im = Image.open(im_file) 
        stat = ImageStat.Stat(im) 
        gs = (math.sqrt(0.241*(r**2) + 0.691*(g**2) + 0.068*(b**2)) 
         for r,g,b in im.getdata()) 
        return sum(gs)/stat.count[0] 
    

अद्यतन टेस्ट परिणाम मैं 200 छवियों के खिलाफ एक सिमुलेशन भाग गया। मैंने पाया कि विधियों # 2, # 4 ने लगभग समान परिणाम दिए हैं। इसके अलावा विधियों # 3, # 5 भी लगभग समान थे। विधि # 1 बारीकी से # 3, # 5 (कुछ अपवादों के साथ) का पालन किया।

+1

बस की गति पर टिप्पणी करने से अधिक preferrable है: मेरे परीक्षणों में उन्हें ले जा रहा जैसे ही वे हैं, विधि # 2, # 3, और # 4 समान रूप से तेज़ थे (विभिन्न आकारों की 20 छवियों को संसाधित करने के लिए ~ 140ms ले रहे थे), विधि # 1 केवल थोड़ा धीमा (~ 180 मिमी) था और विधि # 5 वास्तव में धीमी है (~ 3505ms)। उम्मीद की जा सकती है, लेकिन यदि आप # 1, # 3 और # 5 के बीच चयन कर रहे हैं तो शायद # 3 के साथ रहना चाहिए। –

2

यह देखते हुए कि आप पूरी छवि में औसत की तलाश कर रहे हैं, न कि प्रति-पिक्सेल चमक मूल्य, पीआईएल के हिस्टोग्राम औसत और आउटपुट में चमक कार्य लागू करने से उस पुस्तकालय के लिए सबसे अच्छा तरीका लगता है।

तो ImageMagick का उपयोग कर (PythonMagick बाइंडिंग के साथ), मैं "वर्बोज़" विकल्प सेट के साथ identify आदेश का उपयोग कर सुझाव है। यह आपको प्रत्येक चैनल के लिए एक औसत मूल्य प्रदान करेगा, जिससे आप हिस्टोग्राम — को योग करने और औसत करने की आवश्यकता को बचाएंगे, आप बस प्रत्येक चैनल को गुणा कर सकते हैं।

+1

जिसने पायथन मैगिक को बनाए रखने की कोशिश की और 0.9.1 संस्करण प्रदान किया, मैं इसकी वर्तमान स्थिति में इसका उपयोग करने की अनुशंसा नहीं करता। ImageMagick में हालिया परिवर्तनों ने बहुत सारे पायथन मैगिक कोड को तोड़ दिया। पैकेज के मूल लेखक, एक और ImageMagick अजगर बाइंडिंग के साथ आया था http://public.procoders.net/PythonMagickWand/docs/html/index.html, यह वर्तमान PythonMagick –

1

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

मैं कैसे रूपांतरण एक मनमाना सूत्र का उपयोग जनहित याचिका में स्केल के लिए क्या करने के लिए यकीन नहीं है, लेकिन मैं यह संभव है अनुमान लगा रहा हूँ।

+0

एक अच्छा विचार की तरह लगता है। मैं भी कोशिश करूँगा। – cmcginty

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