Skip to content

Instantly share code, notes, and snippets.

@mrioqueiroz
Last active September 17, 2020 01:18
Show Gist options
  • Save mrioqueiroz/381e55413fec9e3abaf64f43accf2cbf to your computer and use it in GitHub Desktop.
Save mrioqueiroz/381e55413fec9e3abaf64f43accf2cbf to your computer and use it in GitHub Desktop.
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