>  기사  >  백엔드 개발  >  Python 검증 코드 인식 튜토리얼: 그레이스케일 처리, 이진화, 노이즈 감소 및 테서로크 인식

Python 검증 코드 인식 튜토리얼: 그레이스케일 처리, 이진화, 노이즈 감소 및 테서로크 인식

不言
不言원래의
2018-06-04 11:30:015986검색

이 글은 Python 검증 코드 인식 튜토리얼의 그레이스케일 처리, 이진화, 노이즈 감소 및 테서로크 식별을 주로 소개합니다. 이제는 필요한 친구들이 참고할 수 있도록 공유합니다.

크롤러를 작성할 때 피할 수 없는 문제는 인증 코드입니다. 현재 인증 코드 카테고리는 4가지 정도 있습니다.


이미지 카테고리

  1. 슬라이딩 카테고리

  2. 카테고리 클릭

  3. 음성 type

  4. 오늘은 이미지 유형에 대해 살펴보겠습니다. 대부분의 인증코드는 숫자와 문자의 조합으로 이루어져 있으며, 중국에서도 한자를 사용합니다. 이를 바탕으로 노이즈, 간섭선, 변형, 겹침, 글꼴 색상 차이 등의 방법이 추가되어 인식 난이도가 높아집니다.

에 따라 인증 코드 인식은 대략 다음 단계로 나눌 수 있습니다.



회색 처리

  1. 대비 증가(선택 사항)

  2. 이진화

  3. 노이즈 감소

  4. 기울기 보정 문자 분할

  5. 훈련 라이브러리 구축

  6. 인식

  7. 실험적 특성으로 인해 기사에 사용된 인증 코드는 실제 웹사이트 인증 코드를 일괄 다운로드하는 것이 아니라 모두 프로그램에서 생성된 것이므로 장점은 명확한 결과를 가진 많은 수의 데이터 세트를 가질 수 있다는 것입니다.

실제 환경에서 데이터를 얻어야 하는 경우 다양한 대규모 코드 플랫폼을 사용하여 학습용 데이터 세트를 구축할 수 있습니다.


인증 코드를 생성하려면 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')

여기에서 우분투의 글꼴 경로에 주의해야 합니다. 온라인에서 다른 글꼴을 다운로드하여 사용할 수도 있습니다. 인증코드는 다음과 같이 생성됩니다.


인증코드가 변형된 것을 확인할 수 있습니다. 이러한 유형의 가장 간단한 인증 코드의 경우 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')

인증코드는 다음과 같이 생성됩니다:


세 번째는 소문자 o, 네 번째는 대문자 O, 다섯 번째는 하나는 숫자 0입니다. 여섯 번째는 소문자 z, 일곱 번째는 대문자 Z, 마지막은 숫자 2입니다. 인간의 눈은 이미 무릎을 꿇었다는 것이 사실인가! 하지만 이제 일반 인증코드는 대문자와 소문자를 엄격히 구분하지 않습니다. 자동 인식이 어떻게 되는지 살펴보겠습니다.

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

처리된 이미지는 다음과 같습니다.


처리 후 이미지가 많이 선명해진 것을 볼 수 있습니다. 다음으로 간섭선을 제거해 보세요. 일반적인 4-이웃 및 8-이웃 알고리즘. 소위 X 이웃 알고리즘은 휴대폰의 9제곱 그리드 입력 방식을 의미할 수 있습니다. 버튼 5는 판단할 픽셀이고, 이웃 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(&#39;7.png&#39;)
tesserocr.image_to_text(p7)
&#39;8069 ,,\n\n&#39;

另外,从图片来看,实际数据颜色明显和噪点干扰线不同,根据这一点可以直接把噪点全部去除,这里就不展开说了。
第一篇文章,先记录如何将图片进行灰度处理、二值化、降噪,并结合tesserocr来识别简单的验证码,剩下的部分在下一篇文章中和大家一起分享。

相关推荐:

Python验证码识别处理实例

위 내용은 Python 검증 코드 인식 튜토리얼: 그레이스케일 처리, 이진화, 노이즈 감소 및 테서로크 인식의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.