2008-09-25 11 views
40

मुझे उस एप्लिकेशन के लिए लाल आंखों में कमी को लागू करने की आवश्यकता है जिस पर मैं काम कर रहा हूं।लाल आंखों में कमी एल्गोरिदम

Googling ज्यादातर वाणिज्यिक अंत उपयोगकर्ता उत्पादों के लिंक प्रदान करता है।

आप एक अच्छे लाल आँख कमी एल्गोरिथ्म, जो एक GPL आवेदन में इस्तेमाल किया जा सकता पता है?

उत्तर

43

मैं यहाँ जिस तरह से पार्टी के लिए देर हो रही है, लेकिन भविष्य खोजकर्ताओं के लिए मैं मैंने लिखा एक व्यक्तिगत अनुप्रयोग के लिए निम्नलिखित कलन विधि का उपयोग किया है।

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

//Value of red divided by average of blue and green: 
Pixel pixel = image.getPixel(x,y); 
float redIntensity = ((float)pixel.R/((pixel.G + pixel.B)/2)); 
if (redIntensity > 1.5f) // 1.5 because it gives the best results 
{ 
    // reduce red to the average of blue and green 
    bm.SetPixel(i, j, Color.FromArgb((pixel.G + pixel.B)/2, pixel.G, pixel.B)); 
} 

मैं वास्तव में इस के परिणाम की तरह है क्योंकि वे रंग की तीव्रता, जिसका अर्थ है आँख की रोशनी प्रतिबिंब कम नहीं है रखने के लिए। (इसका मतलब है कि आंखें अपना "जीवित" दिखती रहती हैं।)

+0

तुम भी उपयोगकर्ता द्वारा प्रदान की एक अधिकतम त्रिज्या के साथ क्लिक प्वाइंट पर एक "जादू की छड़ी" का चयन उपकरण का उपयोग कर सकता है। – rafaelcastrocouto

3

सबसे सरल एल्गोरिदम, और अभी भी बहुत प्रभावी है जो रुचि के क्षेत्र के लिए आरजीबी ट्रिपल के आर को शून्य करना होगा।

लाल गायब हो जाता है, लेकिन दूसरे रंग संरक्षित कर रहे हैं।

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

4

यदि कोई और अधिक प्रत्यक्ष उत्तर के साथ आता है, तो आप हमेशा the source code for GIMP डाउनलोड कर सकते हैं और देख सकते हैं कि वे इसे कैसे करते हैं।

3

यदि आप ImageMagick कोशिश कर सकते हैं - कैसे उस पृष्ठ

6

प्रथम पर लाल आँख के लिए

http://www.cit.gu.edu.au/~anthony/info/graphics/imagemagick.hints

खोज आप आंखों को खोजने की जरूरत करने के लिए इस पृष्ठ पर कुछ सुझाव दिए गए! मानक तरीका एक किनारे डिटेक्टर को चलाने के लिए होगा और फिर एक ही आकार की दो मंडलियों को खोजने के लिए एक हफ़ ट्रांसफॉर्म होगा, लेकिन लाल पिक्सेल के क्लस्टर को ढूंढने के लिए आसान एल्गोरिदम हो सकते हैं।

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

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

3

ओपन सोर्स प्रोजेक्ट सी # में एक कार्यान्वयन है Paint.NET

+0

मुझे नहीं लगता कि किसी भी अधिक स्रोत प्राप्य है। –

7

एक महान पुस्तकालय आँखों को खोजने के लिए openCV है। यह छवि प्रसंस्करण कार्यों के साथ बहुत समृद्ध है। इलिया वी। सफोनोव से "स्वचालित लाल आंख का पता लगाने" शीर्षक के साथ this पेपर भी देखें।

2

यहाँ जावा कार्यान्वयन समाधान

public void corrigirRedEye(int posStartX, int maxX, int posStartY, int maxY, BufferedImage image) { 
    for(int x = posStartX; x < maxX; x++) { 
     for(int y = posStartY; y < maxY; y++) { 

      int c = image.getRGB(x,y); 
      int red = (c & 0x00ff0000) >> 16; 
      int green = (c & 0x0000ff00) >> 8; 
      int blue = c & 0x000000ff; 

      float redIntensity = ((float)red/((green + blue)/2)); 
      if (redIntensity > 2.2) { 
       Color newColor = new Color(90, green, blue); 
       image.setRGB(x, y, newColor.getRGB()); 
      } 


     } 
    } 
} 

मापदंडों खुला सीवी की तरह एक आवेदन के द्वारा पता लगाया दो आयतों से लिया गया जा रहा है (यह आंख स्थिति से जुड़े एक आयत)

int posStartY = (int) leftEye.getY(); 

    int maxX = (int) (leftEye.getX() + leftEye.getWidth()); 
    int maxY = (int) (leftEye.getY() + leftEye.getHeight()); 

    this.corrigirRedEye(posStartX, maxX, posStartY, maxY, image); 

    // right eye 

    posStartX = (int) rightEye.getX(); 
    posStartY = (int) rightEye.getY(); 

    maxX = (int) (rightEye.getX() + rightEye.getWidth()); 
    maxY = (int) (rightEye.getY() + rightEye.getHeight()); 

    this.corrigirRedEye(posStartX, maxX, posStartY, maxY, image); 
1

होना चाहिए यह बेनी द्वारा प्रदान किए गए उत्तर का एक और पूर्ण कार्यान्वयन है:

using SD = System.Drawing; 

    public static SD.Image ReduceRedEye(SD.Image img, SD.Rectangle eyesRect) 
    { 
    if ( (eyesRect.Height > 0) 
     && (eyesRect.Width > 0)) { 
     SD.Bitmap bmpImage = new SD.Bitmap(img); 
     for (int x=eyesRect.X;x<(eyesRect.X+eyesRect.Width);x++) { 
      for (int y=eyesRect.Y;y<(eyesRect.Y+eyesRect.Height);y++) { 
       //Value of red divided by average of blue and green: 
       SD.Color pixel = bmpImage.GetPixel(x,y); 
       float redIntensity = ((float)pixel.R/((pixel.G + pixel.B)/2)); 
       if (redIntensity > 2.2f) 
       { 
       // reduce red to the average of blue and green 
       bmpImage.SetPixel(x, y, SD.Color.FromArgb((pixel.G + pixel.B)/2, pixel.G, pixel.B)); 
       pixel = bmpImage.GetPixel(x,y); // for debug 
       } 
      } 
     } 
     return (SD.Image)(bmpImage); 
    } 
    return null; 
    } 
0

इस ब्लॉग को पढ़ने, वहाँ का पता लगाने और रेड-आई के सुधार के बारे में एक अच्छा व्याख्या है। Red eye correction with OpenCV and python

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