2011-08-09 8 views
12

मेरे पास छवियों, फ़ोटो, वेब ग्राफिक्स, लोगो, आदि की निर्देशिका है ... ये सभी वेब से खींचे गए हैं। .jpg, .gif, और .png फ़ाइलें हैं।मैं ग्राफिक्स और तस्वीरों के बीच अंतर कैसे कर सकता हूं?

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

त्रुटि का एक बड़ा (यहां तक ​​कि बहुत बड़ा) मार्जिन स्वीकार्य है। imagecolorstotal()

  • हटाया छवियां हैं चौड़ाई अनुपात के बड़े ऊंचाई, और इसके विपरीत (3+ के अनुपात आश्चर्यजनक अच्छी तरह से काम करता है) का उपयोग कम रंग की गिनती के साथ

    • हटा दिया छवियों:

      मैं पहले से ही है।

    • हटा दिया छवियों कि एक निश्चित आयाम से छोटे हैं (50-75px अच्छा है)

    मैं नहीं बल्कि एक चिकनी या वितरित की अवस्था की तुलना में, कुछ रंगों के आसपास केंद्रित हिस्टोग्राम मूल्यों के साथ छवियों को निकालने के बारे में सोच रहा हूँ। मैंने अभी तक इसका प्रयास नहीं किया है।

    मैं वास्तविक तस्वीरों को निकालने के लिए छवियों के इस फ़िल्टरिंग को और कैसे सुधार सकता हूं? मैं PHP का उपयोग करना पसंद करूंगा लेकिन इसकी आवश्यकता नहीं है।

    अपडेट: यह पता चला है कि मेरे आवेदन के लिए, पहले तीन चीजें जो मैंने पहले ही कोशिश की थी वह एक ठोस 80% समाधान था। नीचे दिए गए कुछ उत्तरों का उपयोग करके आगे फ़िल्टरिंग किया जा सकता है।

  • +0

    आप जी.डी. पुस्तकालय इस्तेमाल कर सकते हैं कच्चे छवि डेटा की प्रक्रिया, और किनारों, छवि समानता जैसी चीजों के लिए जाँच करने के लिए सक्षम होने के लिए और अन्य बातें। मैं कुछ और सटीक पोस्ट करूंगा, लेकिन इस समय php.net मेरे लिए नीचे प्रतीत होता है। मैंने वॉटरमार्क डालने से पहले जीडी का उपयोग किया है और जैसे, यह थोड़ा जटिल है, लेकिन आप इसके साथ बहुत कुछ भी कर सकते हैं। –

    +0

    'exif' की जांच के बारे में कैसे? - http://php.net/manual/en/book.exif.php – ajreal

    उत्तर

    2

    नीचे दिया गया कोड है और मैंने प्रत्येक फ़िल्टर को क्यों लागू किया है इसके पीछे तर्क है। मैंने इन कार्यों और सेटिंग्स पर बहुत से परीक्षण किए हैं, लेकिन आप अभी भी छवियों के अपने सेट के लिए इन सेटिंग्स को अनुकूलित करने के लिए कुछ परीक्षण चलाना चाहते हैं।

    मैं IMagick का उपयोग किया है (ImageMagick के लिए पीएचपी आवरण) जब निम्न छवि की गणना के काम करने के लिए जिम्मेदार बताते हैं:

    $Image  = new Imagick($image_path); 
    $height  = $Image->getImageHeight(); 
    $width  = $Image->getImageWidth(); 
    $histogram = $Image->getImageHistogram();    
    $num_colors = $image->getImageColors(); 
    

    ऊंचाई चौड़ाई अनुपात को

    छनन छवियों से चौड़ाई अनुपात की ऊंचाई जंक के एक बड़े प्रतिशत को समाप्त करती है। अपने फ़िल्टर को 1: 1 पर सेट करने के करीब, यह फ़िल्टर बेहतर काम करता है, लेकिन आप बहुत अच्छी छवियों को भी फ़िल्टर करना शुरू कर देंगे।

    // max height to width ratio we allow on images before we junk them 
    $max_size_ratio = 3; 
    if($size_ratio > $max_size_ratio) 
        throw new Exception("image height to width ratio exceeded max of $max_size_ratio"); 
    

    रंग

    के बहुत सारे 32 रंग नीचे

    छनन छवियां आम तौर पर केवल कबाड़ छवियों, हालांकि, मैं भी खो हटाता की संख्या: यह सबसे अधिक मूल्यवान फिल्टर मैं आवेदन किया है में से एक है काले और सफेद आरेख और चित्र।

    // min number of colors allowed before junking 
    $min_colors = 32; 
    if($num_colors < $min_colors) 
        throw new Exception("image had less than $min_colors colors"); 
    

    मिन ऊंचाई और चौड़ाई

    छनन छवियों एक निरपेक्ष न्यूनतम ऊंचाई पर आधारित है और चौड़ाई है कि दोनों आयामों में थोड़ी बड़ी मूल्य है कि कम से कम एक आयाम में मदद मिली गुजरना होगा और साथ ही गुजरना होगा कुछ जंक फ़िल्टर करें।

    // min height and width in pixels both dimensions must meet 
    $min_height_single = 50; 
    $min_width_single = 50; 
    if(
        $width < $min_width_single 
        OR $height < $min_height_single 
    ) 
        throw new Exception("height or width were smaller than absolute minimum"); 
    
    // min height and width in pixels at least one dimension must meet 
    $min_height = 75; 
    $min_width = 75; 
    if(
        $width < $min_width 
        && $height < $min_height 
    ) 
        throw new Exception("height and width were both smaller than minimum combo"); 
    

    छवि रंग Entropy छवि हिस्टोग्राम

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

    1. उच्च शैली ग्राफिक्स महान रंग गहराई और रंग भिन्नता की वजह से उच्च entropies हो जाते हैं: इस विधि के साथ तीन प्रमुख समस्याएं हैं।

    2. फोटोग्राफ जिन्हें ठोस पृष्ठभूमि और स्टूडियो पृष्ठभूमि के लिए फ़ोटोशॉप किया गया है, वे प्रभावी ठोस रंग की वजह से कम entropies होते हैं।

    3. यह मेरे सेट, छवियों, रंग गहराई इत्यादि में छवियों के बीच व्यापक भिन्नता के कारण एक पूर्ण फ़िल्टर के रूप में अच्छी तरह से काम नहीं करता है, हालांकि यह बेहद उपयोगी है, हालांकि, सबसे अच्छी छवि चुनने में है मेरे पूरे सेट के भीतर एक छोटा सबसेट। एक उदाहरण यह होगा कि कौन सी छवि एक वेबपृष्ठ पर मिली सभी छवियों में से प्राथमिक छवि के रूप में प्रदर्शित होगी।

    यहाँ समारोह मैं छवि एन्ट्रापी गणना करने के लिए उपयोग करते हैं:

    function set_image_entropy() 
    { 
    
        // create Imagick object and get image data 
        $Image = new Imagick($this->path); 
        $histogram = $Image->getImageHistogram();    
        $height = $Image->getImageHeight(); 
        $width = $Image->getImageWidth(); 
        $num_pixels = $height * $width; 
    
        // calculate entropy for each color in the image 
        foreach($histogram as $color) 
        { 
         $color_count = $color->getColorCount(); 
         $color_percentage = $color_count/$num_pixels; 
         $entropies[] = $color_percentage * log($color_percentage, 2); 
        } 
    
        // calculate total image color entropy 
        $entropy = (-1) * array_sum($entropies); 
    
        return $entropy; 
    
    } 
    
    7

    फ़ंक्शन exif_read_data उपयोग किए गए कैमरे के बारे में जानकारी प्रदान कर सकता है, यह प्रत्येक कैमरे के लिए काफी अलग है। यह एकदम सही समाधान नहीं होगा, लेकिन यह उस चीज़ को जोड़ना चाहिए जो आप पहले से उपयोग कर रहे हैं।

    +0

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

    1

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

    6

    Entropy कंप्यूटर ग्राफिक्स से "वास्तविक" फ़ोटो को अलग करने के लिए एक अच्छी मीट्रिक होगी। यह वास्तव में आपके हिस्टोग्राम विचार का एक और अधिक संरचित संस्करण है। Entropy

    H(X) = -sum(p[i] * log2(p[i])) 
    

    जहां पी [i] ith रंग की संभावना है द्वारा दिया जाता है। p[i] प्रत्येक रंग (प्रतिशत (0.0-> 1.0) पिक्सेल के रंग में हिस्टोग्राम मान बहुत अधिक है I)। अधिक वितरित रंग हैं, उच्च H(X) होगा। यदि पिक्सेल केवल कुछ रंगों में वितरित होते हैं, तो H(X) छोटा होगा।

    ध्यान दें कि संकुचित फाइलसाइज सीधे एन्ट्रॉपी (उच्च एन्ट्रॉपी, उच्च फाइलसाइज) से संबंधित है, इसलिए फाइलसाइज का उपयोग करने के लिए किसी अन्य उत्तर में सुझाव इस पर प्राप्त करने का एक अप्रत्यक्ष तरीका हो सकता है।

    +0

    पी [i] php के साथ गणना करने के तरीके पर कोई सुझाव? –

    +1

    पी [i] बस छवि हिस्टोग्राम है ताकि आप इसकी गणना करने के लिए कुछ PHP कोड ढूंढ सकें। बस सुनिश्चित करें कि हिस्टोग्राम प्रतिशत (0.0-> 1.0) में दिया गया है, न कि प्रत्येक रंग की कच्ची गणना। साथ ही, सुनिश्चित करें कि आप log2 (0) = 0 के विशेष मामले को परिभाषित करते हैं जो आमतौर पर अपरिभाषित होता है। –

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

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