5

के स्कैन का पता लगाने के लिए पीआईएल का उपयोग करना, इसलिए मैं अक्सर एक अनजान कैनन मल्टीफंक्शन पर बड़ी डबल-पक्षीय स्कैन नौकरियां चलाता हूं, जो मुझे जेपीईजी के एक विशाल फ़ोल्डर के साथ छोड़ देता है। क्या मैं रिक्त पृष्ठों के स्कैन का पता लगाने और उन्हें हटाने के लिए ध्वजांकित करने के लिए छवियों के फ़ोल्डर का विश्लेषण करने के लिए पीआईएल का उपयोग करने पर विचार करने के लिए पागल हूं?रिक्त पृष्ठ

फ़ोल्डर-रेंगने छोड़कर और भागों बाहर पर चिह्नित करने, मैं कल्पना कुछ इस तरह दिखेगा:

  • जांच करें कि छवि, ग्रेस्केल है के रूप में इस अनिश्चित माना जाता है।
  • यदि ऐसा है, तो रंगों की पृष्ठभूमि (पृष्ठभूमि रंग) का पता लगाएं।
  • यदि नहीं, तो हल्के ग्रेज़ को प्रतिबंधित करने वाले रंगों की प्रमुख श्रृंखला का पता लगाएं।
  • निर्धारित करें कि पूरी छवि का प्रतिशत किस छायांकित रंगों से बना है।
  • एक थ्रेसहोल्ड खोजने का प्रयास करें जो प्रकार या लेखन या इमेजरी वाले पृष्ठों को पर्याप्त रूप से पहचानता है।
  • शायद थ्रेसहोल्ड की सटीकता बढ़ाने के लिए छवि के टुकड़ों का परीक्षण करें।

मुझे पता है कि यह एक बढ़त मामला है, लेकिन क्या पीआईएल अनुभव वाले किसी भी व्यक्ति को कुछ पॉइंटर्स उधार दे सकते हैं?

उत्तर

2

कुछ गैर जनहित याचिका-विशिष्ट सुझाव पर विचार करने के:

मुद्रित या लिखित सामग्री की

स्कैन उच्च विपरीत तेज किनारों के बहुत सारे होगा; एक औसत फिल्टर (शोर को कम करने के लिए) जैसे कुछ प्रकार के सरल किनारे का पता लगाने से रिक्त पृष्ठों से वास्तविक सामग्री को भेदभाव करने का अच्छा काम हो सकता है।

एक समय में परीक्षण टुकड़े उपयोगी नहीं हैं क्योंकि यह आपकी सटीकता को बढ़ा सकता है, लेकिन क्योंकि इससे आपको कई पृष्ठों को छोड़ने में मदद मिल सकती है। संभवतः आपके अधिकांश स्कैन खाली नहीं हैं, इसलिए आपको एक साधारण दिमागी चेक के साथ शुरू करना चाहिए जो आम तौर पर गैर-रिक्त पृष्ठों को गैर-खाली के रूप में पहचानता है; केवल अगर यह कहता है कि पृष्ठ रिक्त हो सकता है तो आपको अधिक बारीकी से देखने की आवश्यकता है।

यदि रोशनी या पृष्ठ स्वयं गैर-वर्दी है, तो आप image = image-filter(image) जैसे कुछ ऐसा करना शुरू कर सकते हैं जहां filter किसी प्रकार का बहुत व्यापक चिकनाई करता है। इससे प्रभावशाली रंगों की पहचान करने की आवश्यकता कम हो जाएगी, साथ ही साथ मुकाबला करने पर पेज पर प्रमुख छाया काफी समान नहीं होगी।

+0

+1 अच्छी सलाह। मुझे लगता है कि यहां तक ​​कि एक साधारण छवि एन्ट्रॉपी गणना भी एक पृष्ठ के "खालीपन" का एक अच्छा पर्याप्त भेदभाव होगा। http://brainacle.com/calculating-image-entropy-with-python-how-and-why.html – Paul

+0

ग्रेट प्वाइंट, पॉल। मैं हर दिन एक हिस्टोग्राम के साथ काम करता हूं फिर भी गणना एंट्रॉपी पर विचार नहीं करता। –

4

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

मुझे नहीं पता कि आप कितने पेज स्कैन कर रहे हैं, लेकिन यदि संख्या काफी कम है तो यह एक आसान त्वरित समाधान हो सकता है।

11

mahotas और milk का उपयोग करके यहां एक वैकल्पिक समाधान है।

  1. प्रारंभ दो निर्देशिका बनाने के द्वारा: positives/ और negatives/ आप मैन्युअल रूप से कुछ उदाहरण बाहर ले जाएगा जहां।
  2. मैं मान लेंगे कि डेटा के बाकी सकारात्मक में छवियों के सभी के लिए
  3. कंप्यूट सुविधाओं एक unlabeled/ निर्देशिका में है और नकारात्मक
  4. एक वर्गीकारक
  5. जानने लेबल हटाया गया चित्र पर कि वर्गीकारक का उपयोग

कोड में नीचे मैं jug इस्तेमाल किया आप एक से अधिक प्रोसेसर पर चलने की संभावना देने के लिए है, लेकिन कोड भी अगर आप हर पंक्ति जो उल्लेख TaskGenerator

को दूर काम करता है 210
from glob import glob 
import mahotas 
import mahotas.features 
import milk 
from jug import TaskGenerator 


@TaskGenerator 
def features_for(imname): 
    img = mahotas.imread(imname) 
    return mahotas.features.haralick(img).mean(0) 

@TaskGenerator 
def learn_model(features, labels): 
    learner = milk.defaultclassifier() 
    return learner.train(features, labels) 

@TaskGenerator 
def classify(model, features): 
    return model.apply(features) 

positives = glob('positives/*.jpg') 
negatives = glob('negatives/*.jpg') 
unlabeled = glob('unlabeled/*.jpg') 


features = map(features_for, negatives + positives) 
labels = [0] * len(negatives) + [1] * len(positives) 

model = learn_model(features, labels) 

labeled = [classify(model, features_for(u)) for u in unlabeled] 

यह बनावट सुविधाओं, जो शायद काफी अच्छा है का उपयोग करता है, लेकिन आप mahotas.features में अन्य सुविधाओं के साथ खेल सकते हैं यदि आप चाहें तो (या mahotas.surf कोशिश, लेकिन वह और अधिक जटिल हो जाता है)। आम तौर पर, मुझे कठोर परिश्रम के साथ वर्गीकरण करना मुश्किल लगता है जब तक कि स्कैनिंग बहुत नियंत्रित न हो जाए।

+1

आपके द्वारा लिखे गए प्रभावशाली पुस्तकालयों! –

+0

नाइट-पिक के लिए क्षमा मांगता है, लेकिन परिवर्तनीय विशेषताओं को फ़ंक्शन के रूप में दो बार और सूची के रूप में दो बार उपयोग किया जाता है। फिर एक समारोह के रूप में बुलाया। क्या फीचर्स सूची फीचर्स की तरह कुछ नहीं होनी चाहिए और मूल फ़ंक्शन को अनलिंक किए बिना सीखने वाले मॉडल पर लागू किया जाना चाहिए? एकमात्र तरीका है कि मैं स्निपेट लागू करने में सक्षम था। चारों ओर भयानक पुस्तकालयों के लिए धन्यवाद। वे महान काम करते हैं! धन्यवाद। – TelsaBoil

+0

धन्यवाद। मैंने कोड तय किया। – luispedro

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