python 인증 코드 인식 튜 토리 얼 의 그 레이스 케 일 처리,이치 화,소음 감소 및 tesserocr 인식
파충류 가 돌아 갈 수 없 는 문 제 는 바로 인증 코드 입 니 다.현재 인증 코드 분 류 는 약 4 가지 가 있 습 니 다.
이에 따라 인증 코드 인식 은 대체적으로 다음 과 같은 몇 가지 절차 로 나 눌 수 있다.
실제 환경 에서 데 이 터 를 얻어 야 할 때 각 대형 플랫폼 과 결합 하여 데이터 세트 를 만들어 훈련 할 수 있다.
인증 코드 생 성 여기 제 가 사용 할 게 요Claptcha ( 로 컬 다운로드이 라 이브 러 리 는 물론Captcha로 컬 다운로드이 라 이브 러 리 도 좋 은 선택 이다.
가장 간단 한 순수 숫자,방해 없 는 인증 코드 를 만 들 기 위해 서 는 먼저 claptcha.py 의 285 줄drawLine 에서 수정 을 했 습 니 다.이 함 수 를 None 으로 되 돌려 주 고 인증 코드 를 만 들 기 시 작 했 습 니 다.
from claptcha import Claptcha
c = Claptcha("8069","/usr/share/fonts/truetype/freefont/FreeMono.ttf")
t,_ = c.write('1.png')
ubuntu 의 글꼴 경 로 를 주의 하고 인터넷 에서 다른 글꼴 을 다운로드 해서 사용 할 수도 있 습 니 다.인증 코드 생 성 은 다음 과 같 습 니 다:인증번호 에 변형 이 있 음 을 알 수 있다.이런 가장 간단 한 인증 코드 는 구 글 이 오픈 한 tesserocr 를 직접 사용 하여 식별 할 수 있다.
우선 설치:
apt-get install tesseract-ocr libtesseract-dev libleptonica-dev
pip install tesserocr
그리고 식별 을 시작 합 니 다.
from PIL import Image
import tesserocr
p1 = Image.open('1.png')
tesserocr.image_to_text(p1)
'8069
'
이런 간단 한 인증 코드 에 대해 서 는 기본적으로 아무것도 하지 않 는 것 만으로 도 식별 율 이 높다 는 것 을 알 수 있다.관심 있 는 동료 들 은 더 많은 데이터 로 테스트 할 수 있 습 니 다.여 기 는 펼 치지 않 겠 습 니 다.다음은 인증 코드 배경 에 노 이 즈 를 추가 해 보 겠 습 니 다.
c = Claptcha("8069","/usr/share/fonts/truetype/freefont/FreeMono.ttf",noise=0.4)
t,_ = c.write('2.png')
인증 코드 생 성 은 다음 과 같 습 니 다:식별:
p2 = Image.open('2.png')
tesserocr.image_to_text(p2)
'8069
'
효 과 는 그런대로 괜찮다.다음 에 알파벳 숫자 조합 을 만 듭 니 다:
c2 = Claptcha("A4oO0zZ2","/usr/share/fonts/truetype/freefont/FreeMono.ttf")
t,_ = c2.write('3.png')
인증 코드 생 성 은 다음 과 같 습 니 다:세 번 째 는 소문 자 o,네 번 째 는 대문자 O,다섯 번 째 는 숫자 0,여섯 번 째 는 소문 자 z,일곱 번 째 는 대문자 Z,마지막 하 나 는 숫자 2 다.사람의 눈 은 이미 무릎 을 꿇 었 다.그러나 현재 일반 인증 코드 는 대소 문자 에 대해 엄격하게 구분 하지 않 고 자동 식별 이 어떤 지 봅 시다.
p3 = Image.open('3.png')
tesserocr.image_to_text(p3)
'AMOOZW
'
사람 이 무릎 꿇 은 컴퓨터 도 당연히 폐기 되 었 다.그러나 일부 간섭 이 작고 형태 변화 가 심각 하지 않 은 경우 tesserocr 를 사용 하 는 것 은 매우 간단 하고 편리 하 다.그리고 수 정 된 claptcha.py 의 285 줄drawLine 복원,방해 선 추가 상황 보기.
p4 = Image.open('4.png')
tesserocr.image_to_text(p4)
''
방해 선 을 넣 으 면 전혀 식별 할 수 없 는데,방해 선 을 제거 할 방법 이 없 을 까?그림 이 흑백 으로 보이 지만 그 레이스 케 일 처 리 를 해 야 합 니 다.그렇지 않 으 면 load()함수 로 단일 값 이 아 닌 픽 셀 점 의 RGB 원 조 를 얻 을 수 있 습 니 다.다음 처리:
def binarizing(img,threshold):
""" image 、 """
img = img.convert("L") #
pixdata = img.load()
w, h = img.size
# ,
for y in range(h):
for x in range(w):
if pixdata[x, y] < threshold:
pixdata[x, y] = 0
else:
pixdata[x, y] = 255
return img
처 리 된 그림 은 다음 과 같 습 니 다.이 를 통 해 알 수 있 듯 이 처리 한 후에 그림 이 많이 예화 되 었 고 그 다음 에 간섭 선 을 제거 하려 고 시도 했다.흔히 볼 수 있 는 4 인접 도 메 인,8 인접 도 메 인 알고리즘 이다.X 인접 도 메 인 알고리즘 이란 휴대 전화 구 궁 격 입력 법 을 참고 할 수 있다.버튼 5 는 판단 할 픽 셀 점 이 고 4 인접 도 메 인 은 상하 좌우,8 인접 도 메 인 은 주변 8 개의 픽 셀 점 을 판단 하 는 것 이다.만약 에 이 4 개 또는 8 개 점 중 255 의 개수 가 특정한 한도 값 보다 크 면 이 점 을 소음 으로 판단 하고 한도 값 은 실제 상황 에 따라 수정 할 수 있다.
def depoint(img):
""" """
pixdata = img.load()
w,h = img.size
for y in range(1,h-1):
for x in range(1,w-1):
count = 0
if pixdata[x,y-1] > 245:#
count = count + 1
if pixdata[x,y+1] > 245:#
count = count + 1
if pixdata[x-1,y] > 245:#
count = count + 1
if pixdata[x+1,y] > 245:#
count = count + 1
if pixdata[x-1,y-1] > 245:#
count = count + 1
if pixdata[x-1,y+1] > 245:#
count = count + 1
if pixdata[x+1,y-1] > 245:#
count = count + 1
if pixdata[x+1,y+1] > 245:#
count = count + 1
if count > 4:
pixdata[x,y] = 255
return img
처 리 된 그림 은 다음 과 같 습 니 다.뭔 가..알 이 없 는 것 같은 데?!확실히 그렇다.예 를 들 어 그림 간섭 선의 너비 와 숫자 가 같 기 때문이다.간섭 선과 데이터 픽 셀 이 다른 경우,예 를 들 어 Captcha 가 생 성 한 인증 코드:
왼쪽 에서 오른쪽으로 원 도,이치 화,간섭 선 을 제거 하 는 상황 은 전체적으로 소음 을 낮 추 는 효과 가 비교적 뚜렷 하 다.또한 소음 을 낮 추 는 것 은 여러 번 실행 할 수 있 습 니 다.예 를 들 어 제 가 위의 소음 을 낮 춘 후에 순서대로 소음 을 낮 추 면 아래 의 효 과 를 얻 을 수 있 습 니 다.
다시 식별 하여 결 과 를 얻 었 다.
p7 = Image.open('7.png')
tesserocr.image_to_text(p7)
'8069 ,,
'
또 사진 을 보면 실제 데이터 색상 은 노 이 즈 간섭 선과 확연히 다 르 기 때문에 이 점 에 따라 노 이 즈 를 직접 제거 할 수 있 으 므 로 여 기 는 말 하지 않 겠 다.첫 번 째 글 은 그림 을 그 레이스 케 일 처리,이치 화,소음 감소 방법 을 기록 하고 tesserocr 와 결합 하여 간단 한 인증 코드 를 식별 하 며 나머지 부분 은 다음 글 에서 여러분 과 함께 공유 합 니 다.
총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가치 가 있 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.