8

की काट फिल्टर नकल द्वारा मैं एक कैप्चा छवि है कि इस तरह दिखता है:एक कैप्चा छवि की पृष्ठभूमि शोर निकाल रहा है TesserCap

एक उपयोगिता McAfee से TesserCap कहा जाता है का उपयोग करना, मैं एक आवेदन कर सकता है " चिपकाना "छवि को फ़िल्टर करें। (इसे चलाने से पहले, मैंने सुनिश्चित किया कि छवि, सफेद और काले रंग में केवल दो रंग थे।) मैं उस फ़िल्टर का उपयोग टेक्स्ट बॉक्स में 2 के मान के साथ करने के परिणामों से बहुत प्रभावित था। यह सही ढंग से शोर के सबसे निकाल दिया, लेकिन मुख्य पाठ इस में जिसके परिणामस्वरूप रखा,:

मैं अपने ही लिपियों में से एक पर कुछ इस तरह लागू करने के लिए चाहता था, इसलिए मैं क्या छवि प्रसंस्करण पुस्तकालय जानने की कोशिश टेस्सर कैप इस्तेमाल किया। मुझे कुछ नहीं मिला; यह पता चला है कि यह छवि को संसाधित करने के लिए अपने कोड का उपयोग करता है। मैं फिर this whitepaper पढ़ता हूं जो बताता है कि प्रोग्राम कैसे काम करता है।

दिया ग्रेस्केल मूल्यों के लिए पिक्सल के सन्निहित संख्या कम सांख्यिक दिए गए बॉक्स में संख्या की तुलना में कर रहे हैं, काटना फिल्टर 0 के साथ इन दृश्यों की जगह: यह मुझे इस काट फिल्टर क्या करता है के निम्नलिखित विवरण दिया (काला) या 255 (सफेद) उपयोगकर्ता पसंद के अनुसार। कैप्चा का क्षैतिज और लंबवत दिशाओं में विश्लेषण किया जाता है और संबंधित परिवर्तन किए जाते हैं।

मुझे यकीन नहीं है कि मैं समझता हूं कि यह क्या कर रहा है। मेरी स्क्रिप्ट पाइथन में है, इसलिए मैंने वर्णित उद्धरण की तरह पिक्सेल प्रकारों में हेरफेर करने के लिए पीआईएल का उपयोग करने की कोशिश की। यह सरल की तरह लगता है, लेकिन मैं विफल रहा है, शायद इसलिए क्योंकि मैं वास्तव में नहीं पता था कि फिल्टर वास्तव में क्या कर रहा था:

(यह एक अलग कैप्चा एक परिपत्र पैटर्न का उपयोग करता है से बनाया गया है।)

मैंने यह भी देखने की कोशिश की कि क्या यह आसानी से ImageMagick's convert.exe के साथ किया जा सकता है। उनका -चॉप विकल्प कुछ अलग है। कुछ-मॉर्फोलॉजी कमांड के साथ -मेडियन का उपयोग करके कुछ शोर को कम करने में मदद मिली, लेकिन गंदे बिंदु दिखाई दिए और पत्र बहुत विकृत हो गए। यह टेस्सर कैप के साथ चॉपिंग फ़िल्टर करने के रूप में लगभग उतना आसान नहीं था।

तो, मेरा प्रश्न इस प्रकार है: मैं पाइथन में टेस्सर कैप के चॉपिंग फ़िल्टर को कैसे कार्यान्वित कर सकता हूं, क्या यह पीआईएल या इमेजमैजिक का उपयोग कर रहा है? वह चॉपिंग फ़िल्टर मैंने कोशिश किए गए विकल्पों में से किसी भी से बेहतर काम करता है, लेकिन मैं इसे दोहराने के लिए प्रतीत नहीं कर सकता। मैं इस पर घंटों तक काम कर रहा हूं और अभी तक कुछ भी नहीं पाया है। इस (स्यूडोकोड) की तरह

+0

http://dsp.stackexchange.com/ – scord

+0

एक पक्ष नोट के रूप में, आप आंकड़े का उपयोग कर कोशिश कर सकते हैं: यहाँ अजगर कोड सिद्ध है कि है। आउटलायर्स (2 एसडी) या एक्स्ट्रेमेन आउटलाइजर्स (3.5 एसडी) ने मुझे छवि गुणवत्ता –

उत्तर

10

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

उदाहरण के लिए, पिक्सल का एक नमूना पंक्ति में, # काला है जहां और - सफेद है, 2 की काट कारक ------###-------#####------- में --#--###-##---#####---#-# परिणत हो गया लागू करने। ऐसा इसलिए है क्योंकि काले पिक्सल के अनुक्रम जो 2 पिक्सल से छोटे या बराबर होते हैं, और इन अनुक्रमों को सफेद से बदल दिया जाता है। 2 पिक्सेल से अधिक के निरंतर अनुक्रम बने रहते हैं।

यह काट एल्गोरिथ्म का परिणाम अपनी पोस्ट पर मूल छवि पर अपने अजगर कोड (नीचे) में लागू किया है:

'Chopped' image

आदेश में पूरी छवि को यह लागू करने के लिए, तो आप बस प्रत्येक पंक्ति पर और प्रत्येक कॉलम पर इस एल्गोरिदम प्रदर्शन करें।

import PIL.Image 
import sys 

# python chop.py [chop-factor] [in-file] [out-file] 

chop = int(sys.argv[1]) 
image = PIL.Image.open(sys.argv[2]).convert('1') 
width, height = image.size 
data = image.load() 

# Iterate through the rows. 
for y in range(height): 
    for x in range(width): 

     # Make sure we're on a dark pixel. 
     if data[x, y] > 128: 
      continue 

     # Keep a total of non-white contiguous pixels. 
     total = 0 

     # Check a sequence ranging from x to image.width. 
     for c in range(x, width): 

      # If the pixel is dark, add it to the total. 
      if data[c, y] < 128: 
       total += 1 

      # If the pixel is light, stop the sequence. 
      else: 
       break 

     # If the total is less than the chop, replace everything with white. 
     if total <= chop: 
      for c in range(total): 
       data[x + c, y] = 255 

     # Skip this sequence we just altered. 
     x += total 


# Iterate through the columns. 
for x in range(width): 
    for y in range(height): 

     # Make sure we're on a dark pixel. 
     if data[x, y] > 128: 
      continue 

     # Keep a total of non-white contiguous pixels. 
     total = 0 

     # Check a sequence ranging from y to image.height. 
     for c in range(y, height): 

      # If the pixel is dark, add it to the total. 
      if data[x, c] < 128: 
       total += 1 

      # If the pixel is light, stop the sequence. 
      else: 
       break 

     # If the total is less than the chop, replace everything with white. 
     if total <= chop: 
      for c in range(total): 
       data[x, y + c] = 255 

     # Skip this sequence we just altered. 
     y += total 

image.save(sys.argv[3]) 
+0

खोने के बिना कैप्चा छवियों (कानूनी उद्देश्यों के लिए) को पट्टी करने की अनुमति दी है इसके लिए धन्यवाद! दूसरी समस्या का सामना करना यह है कि प्रत्येक चरित्र के अलग कोण होते हैं, क्या इसके लिए कोई समाधान है? – Kostanos

+1

@kbhomes एक छोटी सी बग है। क्या आप देख सकते हैं कि पत्र पतले हो जाते हैं? ऐसा इसलिए है क्योंकि "x + = कुल" लूप के लिए काम नहीं करता है, आपको इसे थोड़ी देर लूप बनाने की आवश्यकता है। –

+0

@AndreMiras मैं थोड़ी देर में 'x + = total' काम कैसे कर सकता हूं? –

3

कोशिश कुछ:

for each row of pixels: 
    if there is a group of about 3 or more pixels in a row, leave them 
    else remove the pixels 

तब बस अपने कॉलम के लिए एक ही बात दोहरा रहे हैं। ऐसा लगता है कि यह कम से कम थोड़ा काम कर सकता है। इस तरह क्षैतिज और लंबवत दोनों पर जाकर क्षैतिज/ऊर्ध्वाधर रेखाओं को भी हटा दिया जाएगा।

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