이 글은 Python 검증 코드 인식 튜토리얼의 그레이스케일 처리, 이진화, 노이즈 감소 및 테서로크 식별을 주로 소개합니다. 이제는 필요한 친구들이 참고할 수 있도록 공유합니다.
크롤러를 작성할 때 피할 수 없는 문제는 인증 코드입니다. 현재 인증 코드 카테고리는 4가지 정도 있습니다.
이미지 카테고리
슬라이딩 카테고리
카테고리 클릭
음성 type
오늘은 이미지 유형에 대해 살펴보겠습니다. 대부분의 인증코드는 숫자와 문자의 조합으로 이루어져 있으며, 중국에서도 한자를 사용합니다. 이를 바탕으로 노이즈, 간섭선, 변형, 겹침, 글꼴 색상 차이 등의 방법이 추가되어 인식 난이도가 높아집니다.
회색 처리
대비 증가(선택 사항)
이진화
노이즈 감소
기울기 보정 문자 분할
훈련 라이브러리 구축
인식
실험적 특성으로 인해 기사에 사용된 인증 코드는 실제 웹사이트 인증 코드를 일괄 다운로드하는 것이 아니라 모두 프로그램에서 생성된 것이므로 장점은 명확한 결과를 가진 많은 수의 데이터 세트를 가질 수 있다는 것입니다.
from claptcha import Claptcha c = Claptcha("8069","/usr/share/fonts/truetype/freefont/FreeMono.ttf") t,_ = c.write('1.png')
여기에서 우분투의 글꼴 경로에 주의해야 합니다. 온라인에서 다른 글꼴을 다운로드하여 사용할 수도 있습니다. 인증코드는 다음과 같이 생성됩니다.
인증코드가 변형된 것을 확인할 수 있습니다. 이러한 유형의 가장 간단한 인증 코드의 경우 Google의 오픈소스 tserocr을 직접 사용하여 식별할 수 있습니다.
첫 번째 설치:
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\n\n'
기본적으로 아무것도 없습니다. 인식된다. 이미 비율은 매우 높습니다. 관심 있는 친구들은 더 많은 데이터를 사용하여 테스트할 수 있지만 여기서는 자세히 설명하지 않겠습니다.
다음으로 확인 코드 배경에 노이즈를 추가하여 확인하세요.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\n\n'
효과 괜찮아. 다음으로 영숫자 조합이 생성됩니다:
c2 = Claptcha("A4oO0zZ2","/usr/share/fonts/truetype/freefont/FreeMono.ttf") t,_ = c2.write('3.png')
인증코드는 다음과 같이 생성됩니다:
p3 = Image.open('3.png') tesserocr.image_to_text(p3) 'AMOOZW\n\n'
물론 사람을 무릎꿇게 할 수 있는 컴퓨터는 쓸모가 없습니다. 그러나 간섭이 적고 변형이 심하지 않은 경우에는 tserocr을 사용하는 것이 매우 간단하고 편리합니다. 그런 다음 수정된 claptcha.py _drawLine의 라인 285를 복원하여 간섭 선이 추가되었는지 확인합니다.
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
처리된 이미지는 다음과 같습니다.
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 ,,\n\n'
另外,从图片来看,实际数据颜色明显和噪点干扰线不同,根据这一点可以直接把噪点全部去除,这里就不展开说了。
第一篇文章,先记录如何将图片进行灰度处理、二值化、降噪,并结合tesserocr来识别简单的验证码,剩下的部分在下一篇文章中和大家一起分享。
相关推荐:
위 내용은 Python 검증 코드 인식 튜토리얼: 그레이스케일 처리, 이진화, 노이즈 감소 및 테서로크 인식의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!