diff options
author | RaNaN <Mast3rRaNaN@hotmail.de> | 2009-08-10 10:45:58 +0200 |
---|---|---|
committer | RaNaN <Mast3rRaNaN@hotmail.de> | 2009-08-10 10:45:58 +0200 |
commit | ce0e9fa939a3c6d9e22f28561f86282a96ddb9c5 (patch) | |
tree | e5540745033a746ffbd19d934c6f6fe8df270f19 | |
parent | plugin fixes, core config functions (diff) | |
download | pyload-ce0e9fa939a3c6d9e22f28561f86282a96ddb9c5.tar.xz |
captcha fix
-rw-r--r-- | captcha/captcha.py | 364 |
1 files changed, 182 insertions, 182 deletions
diff --git a/captcha/captcha.py b/captcha/captcha.py index fbbf20fee..a21963c6b 100644 --- a/captcha/captcha.py +++ b/captcha/captcha.py @@ -64,215 +64,215 @@ class OCR(object): def run(self, command, inputdata=None): """Run a command and return standard output""" -# OLD METHOD -# pipe = subprocess.PIPE -# popen = subprocess.Popen(command, stdout=pipe, stderr=pipe) -# outputdata, errdata = popen.communicate(inputdata) -# assert (popen.returncode == 0), \ -# "Error running: %s\n\n%s" % (command, errdata) -# return outputdata - - thread = RunThread() - result = thread.e(command, inputdata) - return result - -def run_gocr(self): - tmp = tempfile.NamedTemporaryFile(suffix=".jpg") - self.image.save(tmp) - self.result_captcha = self.run(['gocr', tmp.name]).replace("\n", "") - -def run_tesser(self): - tmp = tempfile.NamedTemporaryFile(suffix=".tif") - tmpTxt = tempfile.NamedTemporaryFile(suffix=".txt") - - self.image.save(tmp.name, 'TIFF') - self.run(['tesseract', tmp.name, tmpTxt.name.replace(".txt", "")]) - - self.result_captcha = self.run(['cat', tmpTxt.name]).replace("\n", "") - -def get_captcha(self): - raise NotImplementedError - -def to_greyscale(self): - if self.image.mode != 'L': - self.image = self.image.convert('L') - - self.pixels = self.image.load() - -def eval_black_white(self, limit): - self.pixels = self.image.load() - w, h = self.image.size - for x in xrange(w): - for y in xrange(h): - if self.pixels[x, y] > limit: - self.pixels[x, y] = 255 - else: - self.pixels[x, y] = 0 + # OLD METHOD + # pipe = subprocess.PIPE + # popen = subprocess.Popen(command, stdout=pipe, stderr=pipe) + # outputdata, errdata = popen.communicate(inputdata) + # assert (popen.returncode == 0), \ + # "Error running: %s\n\n%s" % (command, errdata) + # return outputdata + + thread = RunThread() + result = thread.e(command, inputdata) + return result -def clean(self, allowed): - pixels = self.pixels + def run_gocr(self): + tmp = tempfile.NamedTemporaryFile(suffix=".jpg") + self.image.save(tmp) + self.result_captcha = self.run(['gocr', tmp.name]).replace("\n", "") - w, h = self.image.size + def run_tesser(self): + tmp = tempfile.NamedTemporaryFile(suffix=".tif") + tmpTxt = tempfile.NamedTemporaryFile(suffix=".txt") - for x in xrange(w): - for y in xrange(h): - if pixels[x, y] == 255: continue - # no point in processing white pixels since we only want to remove black pixel - count = 0 + self.image.save(tmp.name, 'TIFF') + self.run(['tesseract', tmp.name, tmpTxt.name.replace(".txt", "")]) - try: - if pixels[x-1, y-1] != 255: count += 1 - if pixels[x-1, y] != 255: count += 1 - if pixels[x-1, y + 1] != 255: count += 1 - if pixels[x, y + 1] != 255: count += 1 - if pixels[x + 1, y + 1] != 255: count += 1 - if pixels[x + 1, y] != 255: count += 1 - if pixels[x + 1, y-1] != 255: count += 1 - if pixels[x, y-1] != 255: count += 1 - except: - pass + self.result_captcha = self.run(['cat', tmpTxt.name]).replace("\n", "") - # not enough neighbors are dark pixels so mark this pixel - # to be changed to white - if count < allowed: - pixels[x, y] = 1 + def get_captcha(self): + raise NotImplementedError - # second pass: this time set all 1's to 255 (white) - for x in xrange(w): - for y in xrange(h): - if pixels[x, y] == 1: pixels[x, y] = 255 + def to_greyscale(self): + if self.image.mode != 'L': + self.image = self.image.convert('L') - self.pixels = pixels + self.pixels = self.image.load() -def derotate_by_average(self): - """rotate by checking each angle and guess most suitable""" + def eval_black_white(self, limit): + self.pixels = self.image.load() + w, h = self.image.size + for x in xrange(w): + for y in xrange(h): + if self.pixels[x, y] > limit: + self.pixels[x, y] = 255 + else: + self.pixels[x, y] = 0 - w, h = self.image.size - pixels = self.pixels + def clean(self, allowed): + pixels = self.pixels - for x in xrange(w): - for y in xrange(h): - if pixels[x, y] == 0: - pixels[x, y] = 155 + w, h = self.image.size - highest = {} - counts = {} + for x in xrange(w): + for y in xrange(h): + if pixels[x, y] == 255: continue + # no point in processing white pixels since we only want to remove black pixel + count = 0 + + try: + if pixels[x-1, y-1] != 255: count += 1 + if pixels[x-1, y] != 255: count += 1 + if pixels[x-1, y + 1] != 255: count += 1 + if pixels[x, y + 1] != 255: count += 1 + if pixels[x + 1, y + 1] != 255: count += 1 + if pixels[x + 1, y] != 255: count += 1 + if pixels[x + 1, y-1] != 255: count += 1 + if pixels[x, y-1] != 255: count += 1 + except: + pass + + # not enough neighbors are dark pixels so mark this pixel + # to be changed to white + if count < allowed: + pixels[x, y] = 1 + + # second pass: this time set all 1's to 255 (white) + for x in xrange(w): + for y in xrange(h): + if pixels[x, y] == 1: pixels[x, y] = 255 - for angle in range(-45, 45): + self.pixels = pixels - tmpimage = self.image.rotate(angle) - - pixels = tmpimage.load() + def derotate_by_average(self): + """rotate by checking each angle and guess most suitable""" w, h = self.image.size + pixels = self.pixels for x in xrange(w): for y in xrange(h): if pixels[x, y] == 0: - pixels[x, y] = 255 + pixels[x, y] = 155 + + highest = {} + counts = {} + + for angle in range(-45, 45): + + tmpimage = self.image.rotate(angle) + + pixels = tmpimage.load() + + w, h = self.image.size + + for x in xrange(w): + for y in xrange(h): + if pixels[x, y] == 0: + pixels[x, y] = 255 + + + count = {} + + for x in xrange(w): + count[x] = 0 + for y in xrange(h): + if pixels[x, y] == 155: + count[x] += 1 + + sum = 0 + cnt = 0 + for x in count.values(): + if x != 0: + sum += x + cnt += 1 - count = {} + avg = sum / cnt + counts[angle] = cnt + highest[angle] = 0 + for x in count.values(): + if x > highest[angle]: + highest[angle] = x + + highest[angle] = highest[angle] - avg + + hkey = 0 + hvalue = 0 + + for key, value in highest.iteritems(): + if value > hvalue: + hkey = key + hvalue = value + + self.image = self.image.rotate(hkey) + pixels = self.image.load() for x in xrange(w): - count[x] = 0 for y in xrange(h): + if pixels[x, y] == 0: + pixels[x, y] = 255 + if pixels[x, y] == 155: - count[x] += 1 - - sum = 0 - cnt = 0 - - for x in count.values(): - if x != 0: - sum += x - cnt += 1 - - avg = sum / cnt - counts[angle] = cnt - highest[angle] = 0 - for x in count.values(): - if x > highest[angle]: - highest[angle] = x - - highest[angle] = highest[angle] - avg - - hkey = 0 - hvalue = 0 - - for key, value in highest.iteritems(): - if value > hvalue: - hkey = key - hvalue = value - - self.image = self.image.rotate(hkey) - pixels = self.image.load() - - for x in xrange(w): - for y in xrange(h): - if pixels[x, y] == 0: - pixels[x, y] = 255 - - if pixels[x, y] == 155: - pixels[x, y] = 0 - - self.pixels = pixels - -def split_captcha_letters(self): - captcha = self.image - started = False - letters = [] - width, height = captcha.size - bottomY, topY = 0, height - pixels = captcha.load() - - for x in xrange(width): - black_pixel_in_col = False - for y in xrange(height): - if pixels[x, y] != 255: - if started == False: - started = True - firstX = x - lastX = x - - if y > bottomY: bottomY = y - if y < topY: topY = y - if x > lastX: lastX = x - - black_pixel_in_col = True - - if black_pixel_in_col == False and started == True: - rect = (firstX, topY, lastX, bottomY) - new_captcha = captcha.crop(rect) - - w, h = new_captcha.size - if w > 5 and h > 5: - letters.append(new_captcha) - - started = False - bottomY, topY = 0, height - - return letters - -def correct(self, values, var=None): - - if var: - result = var - else: - result = self.result_captcha - - for key, item in values.iteritems(): - - if key.__class__ == str: - result = result.replace(key, item) + pixels[x, y] = 0 + + self.pixels = pixels + + def split_captcha_letters(self): + captcha = self.image + started = False + letters = [] + width, height = captcha.size + bottomY, topY = 0, height + pixels = captcha.load() + + for x in xrange(width): + black_pixel_in_col = False + for y in xrange(height): + if pixels[x, y] != 255: + if started == False: + started = True + firstX = x + lastX = x + + if y > bottomY: bottomY = y + if y < topY: topY = y + if x > lastX: lastX = x + + black_pixel_in_col = True + + if black_pixel_in_col == False and started == True: + rect = (firstX, topY, lastX, bottomY) + new_captcha = captcha.crop(rect) + + w, h = new_captcha.size + if w > 5 and h > 5: + letters.append(new_captcha) + + started = False + bottomY, topY = 0, height + + return letters + + def correct(self, values, var=None): + + if var: + result = var else: - for expr in key: - result = result.replace(expr, item) + result = self.result_captcha - if var: - return result - else: - self.result_captcha = result + for key, item in values.iteritems(): + + if key.__class__ == str: + result = result.replace(key, item) + else: + for expr in key: + result = result.replace(expr, item) + + if var: + return result + else: + self.result_captcha = result if __name__ == '__main__': |