from captcha import OCR import Image from os import sep from os.path import dirname from os.path import abspath from glob import glob class LinksaveIn(OCR): __name__ = "LinksaveIn" def __init__(self): OCR.__init__(self) self.data_dir = dirname(abspath(__file__)) + sep + "LinksaveIn" + sep def load_image(self, image): im = Image.open(image) frame_nr = 0 lut = im.resize((256, 1)) lut.putdata(range(256)) lut = list(lut.convert("RGB").getdata()) new = Image.new("RGB", im.size) npix = new.load() while True: try: im.seek(frame_nr) except EOFError: break frame = im.copy() pix = frame.load() for x in range(frame.size[0]): for y in range(frame.size[1]): if lut[pix[x, y]] != (0,0,0): npix[x, y] = lut[pix[x, y]] frame_nr += 1 new.save(self.data_dir+"unblacked.png") self.image = new.copy() self.pixels = self.image.load() self.result_captcha = '' def get_bg(self): stat = {} cstat = {} img = self.image.convert("P") for bgpath in glob(self.data_dir+"bg/*.gif"): stat[bgpath] = 0 bg = Image.open(bgpath) bglut = bg.resize((256, 1)) bglut.putdata(range(256)) bglut = list(bglut.convert("RGB").getdata()) lut = img.resize((256, 1)) lut.putdata(range(256)) lut = list(lut.convert("RGB").getdata()) bgpix = bg.load() pix = img.load() for x in range(bg.size[0]): for y in range(bg.size[1]): rgb_bg = bglut[bgpix[x, y]] rgb_c = lut[pix[x, y]] try: cstat[rgb_c] += 1 except: cstat[rgb_c] = 1 if rgb_bg == rgb_c: stat[bgpath] += 1 max_p = 0 bg = "" for bgpath, value in stat.items(): if max_p < value: bg = bgpath max_p = value return bg def substract_bg(self, bgpath): bg = Image.open(bgpath) img = self.image.convert("P") bglut = bg.resize((256, 1)) bglut.putdata(range(256)) bglut = list(bglut.convert("RGB").getdata()) lut = img.resize((256, 1)) lut.putdata(range(256)) lut = list(lut.convert("RGB").getdata()) bgpix = bg.load() pix = img.load() orgpix = self.image.load() for x in range(bg.size[0]): for y in range(bg.size[1]): rgb_bg = bglut[bgpix[x, y]] rgb_c = lut[pix[x, y]] if rgb_c == rgb_bg: orgpix[x, y] = (255,255,255) def eval_black_white(self): new = Image.new("RGB", (140, 75)) pix = new.load() orgpix = self.image.load() thresh = 4 for x in range(new.size[0]): for y in range(new.size[1]): rgb = orgpix[x, y] r, g, b = rgb pix[x, y] = (255,255,255) if r > max(b, g)+thresh: pix[x, y] = (0,0,0) if g < min(r, b): pix[x, y] = (0,0,0) if g > max(r, b)+thresh: pix[x, y] = (0,0,0) if b > max(r, g)+thresh: pix[x, y] = (0,0,0) self.image = new self.pixels = self.image.load() def get_captcha(self, image): self.load_image(image) bg = self.get_bg() self.substract_bg(bg) self.eval_black_white() self.to_greyscale() self.image.save(self.data_dir+"cleaned_pass1.png") self.clean(4) self.clean(4) self.image.save(self.data_dir+"cleaned_pass2.png") letters = self.split_captcha_letters() final = "" for n, letter in enumerate(letters): self.image = letter self.image.save(ocr.data_dir+"letter%d.png" % n) self.run_tesser(True, True, False, False) final += self.result_captcha return final if __name__ == '__main__': import urllib ocr = LinksaveIn() testurl = "http://linksave.in/captcha/cap.php?hsh=2229185&code=ZzHdhl3UffV3lXTH5U4b7nShXj%2Bwma1vyoNBcbc6lcc%3D" urllib.urlretrieve(testurl, ocr.data_dir+"captcha.gif") print ocr.get_captcha(ocr.data_dir+'captcha.gif')