Last active
September 17, 2020 01:18
-
-
Save mrioqueiroz/381e55413fec9e3abaf64f43accf2cbf to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from collections import Counter | |
from pprint import pprint | |
from string import ascii_letters, digits | |
from PIL import Image, ImageOps | |
from pytesseract import image_to_string | |
def obter_caracteres(imagem): | |
caracteres = [list() for _ in range(7)] | |
resultados = tentar_layouts(imagem) | |
for posicao in range(7): | |
for resultado in resultados: | |
for indice, caractere in enumerate(caracteres): | |
try: | |
caractere.append(resultado[indice]) | |
except IndexError: | |
pass | |
return caracteres | |
def tentar_layouts(imagem): | |
resultados = [] | |
layouts = [7, 8, 9, 10, 11, 13] | |
for layout in layouts: | |
resultados.append(reconhecer_caracteres(imagem, layout)) | |
return resultados | |
def reconhecer_caracteres(imagem, layout): | |
return image_to_string( | |
captcha, | |
config= | |
f"""--psm {layout} | |
-c tessedit_char_whitelist={ascii_letters + digits}""") | |
def remover_ruidos(imagem): | |
limite = 1 | |
largura, altura = imagem.size | |
pixels = imagem.load() | |
for linha in range(altura): | |
for coluna in range(largura): | |
if pixels[coluna, linha] > 128: | |
continue | |
escuros = 0 | |
for pixel in range(coluna, largura): | |
if pixels[pixel, linha] < 128: | |
escuros += 1 | |
else: | |
break | |
if escuros <= limite: | |
for pixel in range(escuros): | |
pixels[coluna + pixel, linha] = 255 | |
coluna += escuros | |
for coluna in range(largura): | |
for linha in range(altura): | |
if pixels[coluna, linha] > 128: | |
continue | |
escuros = 0 | |
for pixel in range(linha, altura): | |
if pixels[coluna, pixel] < 128: | |
escuros += 1 | |
else: | |
break | |
if escuros <= limite: | |
for pixel in range(escuros): | |
pixels[coluna, linha + pixel] = 255 | |
linha += escuros | |
return imagem | |
def reforcar_tracos(imagem): | |
limite = 1.3 | |
largura, altura = imagem.size | |
pixels = imagem.load() | |
for linha in range(altura): | |
for coluna in range(largura): | |
if pixels[coluna, linha] < 128: | |
continue | |
escuros = 0 | |
for pixel in range(coluna, largura): | |
if pixels[pixel, linha] > 128: | |
escuros += 1 | |
else: | |
break | |
if escuros <= limite + 1: # Reforço maior. | |
for pixel in range(escuros): | |
pixels[coluna + pixel, linha] = 0 | |
coluna += escuros | |
for coluna in range(largura): | |
for linha in range(altura): | |
if pixels[coluna, linha] < 128: | |
continue | |
escuros = 0 | |
for pixel in range(linha, altura): | |
if pixels[coluna, pixel] > 128: | |
escuros += 1 | |
else: | |
break | |
if escuros <= limite + 1: | |
for pixel in range(escuros): | |
pixels[coluna, linha + pixel] = 0 | |
linha += escuros | |
return imagem | |
def resultado(listas): | |
print("resultado: ", end="") | |
c = [list() for _ in range(7)] | |
for i, _ in enumerate(c): | |
for lista in listas: | |
c[i].append(lista[i].lower()) | |
for i, _ in enumerate(c): | |
for lista in listas: | |
c[i] = Counter(c[i]).most_common()[0][0] | |
for x in c: | |
print(f"{x}", end="") | |
def contar_caracteres(listas): | |
for lista in listas: | |
mais_comuns = [list() for _ in range(len(listas))] | |
for indice, _ in enumerate(mais_comuns): | |
try: | |
mais_comuns[indice] = Counter(listas[indice]).most_common()[0][0] | |
except IndexError: | |
pass | |
return mais_comuns | |
captcha = Image.open("captcha03.jpg") | |
captcha = ImageOps.invert(captcha) | |
captcha = captcha.convert("1") | |
parciais = [] | |
mais_frequentes = [] | |
parciais.append(obter_caracteres(captcha)) | |
for x in range(4): | |
parciais.append(obter_caracteres(remover_ruidos(captcha))) | |
if x % 2 == 0: | |
reforcar_tracos(captcha) | |
for i in parciais: | |
mais_frequentes.append(contar_caracteres(i)) | |
pprint(mais_frequentes) | |
resultado(mais_frequentes) | |
# captcha |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment