문자형 인증번호(14)

5564 단어
1. 인증 코드 소개
1. 인증코드란 무엇인가
파충류를 개발하는 과정에서 흔히 볼 수 있는 반기어 조치, 검증 코드를 만날 수 있다.인증코드(CAPTCHA)는'Completely Automated Public Turing test to tell Computers and Humans Apart'(컴퓨터와 인간을 자동으로 구분하는 튜링 테스트)의 약자로, 사용자가 컴퓨터인지 사람인지를 구분하는 공공 전자동 프로그램이다.
2. 인증코드 종류
인증코드는 출시된 이래 끊임없이 발전해 왔다. 도형 인증코드는 다음과 같은 몇 가지로 나눌 수 있다.
  • 문자형 검증 코드: 이런 검증 코드는 대부분 컴퓨터에서 무작위로 하나의 문자열을 만들어 문자열의 소음, 방해선, 변형, 중첩, 서로 다른 색깔, 비뚤어진 것을 하나의 그림으로 구성하여 식별의 난이도를 높인다.
  • 슬라이딩 검증 코드: 행위 검증 코드라고도 하는데 비교적 유행하는 검증 코드로 사용자의 조작 행위를 통해 검증을 완성하는데 그 중에서 가장 유명한 것이 바로 극검이다.슬라이딩 검증 코드의 원리는 기계 학습 중의 깊이 있는 학습 기술을 사용하여 일부 특징에 따라 정상적인 사용자인지 아닌지를 구분하는 것이다.사용자의 미끄럼 속도, 그리고 매 시간의 순간 속도, 사용자의 마우스 클릭 상황, 그리고 미끄럼 후의 일치 정도를 기록함으로써 식별한다.그리고 정확한 위치로 미끄러지는 것이 검증통과가 아니라 특징 식별에 따라 진짜 사용자인지 아닌지를 구분하고 정확한 위치로 미끄러지는 것은 필수 조건일 뿐이다.
  • 터치 인증코드: 클릭 클래스 인증코드는 모두 문자를 포함하는 그림을 보여주고 문자를 통해 사용자가 클릭한 그림에서 같은 글자의 위치를 알려주어 검증한다.

  • 2. 이미지 처리 라이브러리
    pillow(https://www.jianshu.com/p/cd6f4e138af6
    ) 공식 문서:https://pillow.readthedocs.io/en/latest/installation.html
    3. 단순 문자열 검증 코드의 처리
    1. 그레이스케일
    픽셀은 가장 작은 그림 단원으로 한 장의 그림은 많은 픽셀로 구성되고 한 픽셀의 색깔은 RGB 세 개의 값으로 표현되기 때문에 한 픽셀은 세 개의 색 벡터 행렬에 대응한다. 우리가 그림에 대한 처리는 바로 이 픽셀에 대한 조작이다.
    그림의 그레이스케일은 화소점 행렬의 모든 화소점이 R=G=B를 충족시키는 것이다. 이때 이 값을 그레이스케일이라고 하는데 흰색은 255이고 검은색은 0그레이스케일로 일반 공식은 다음과 같다.
    R=G=B = 사전 처리 RX0.3 + GX0.59 + B*0.11
    from PIL import Image
    image = Image.open('code.jpg')
    im = image.convert('L')
    

    2. 이치화
    이미지의 2치화란 이미지의 픽셀 매트릭스에 있는 각 픽셀의 그레이스케일 값을 0(검정) 또는 255(흰색)으로 설정하여 전체 이미지를 검정색과 흰색만 보이는 시각적 효과를 2치화하는 것이다.
    이치화 원리는 설정된 한도값을 이용하여 이미지 픽셀이 0인지 255인지 판단하는 것이다. 일반적으로 한도값보다 작은 픽셀은 0으로 변하고 큰 픽셀은 255로 변한다.
    이 임계 그레이스케일 값은 한도값이라고 하는데 한도값의 설정이 매우 중요하다. 한도값이 너무 크거나 작으면 그림에 손상을 입힐 수 있다.
    한도값을 선택하는 원칙은 가능한 한 그림 정보를 저장해야 할 뿐만 아니라 배경과 소음의 방해도 줄여야 한다는 것이다.
    이치화의 장점: 데이터의 양을 한층 더 줄이고 그림의 정보를 최대한 보존하며 배경의 소음 방해를 최대한 줄인다.
    상용 한도값 선택 방법은 다음과 같다. - 그레이스케일 평국값법: 127(0~255의 중수, (0+255)/2=127)의 평균값을 취한다. - - - - - - - 픽셀 매트릭스에 있는 모든 픽셀의 그레이스케일 값의 평균값을 계산하는 avg - - 교체법: 근사한 한도값을 추정값의 초기값으로 선택한 다음에 이미지를 분할하고 생성된 하위 이미지의 특징에 따라 새로운 한도값을 선택하여 새로운 한도값을 이용하여 이미지를 분할한다.여러 번의 순환을 거쳐 잘못 분할된 그림의 픽셀을 최소화합니다.
    from PIL import Image
    
    
    def to_value(img):
        #     
        w, h = img.size
        print('    %s,  %s' % (w, h))
        #     
        pixes = img.load()
        total = []
        for i in range(w):
            for j in range(h):
                total.append(pixes[i, j])
        print(total)
        #      
        avg = sum(total)//len(total)
        #       (            ,     )
        for i in range(w):
            for j in range(h):
                if pixes[i, j] < avg:
                    pixes[i, j] = 0
                else:
                    pixes[i, j] = 255
        # return img.point(lambda x: 0 if x < avg else 255)      img  
    
    
    img = Image.open('genimage.png')
    # #      
    img = img.point(lambda x: 1.2*x)
    #          
    img = img.convert('L')
    to_value(img)
    img.show()
    

    3. 소음을 낮춘다
    이치화 처리를 통해 전체 그림의 픽셀은 두 개의 값 0과 255로 나뉜다. 만약에 한 픽셀이 그림이나 방해 요소의 일부분이라면 그녀의 그레이스케일은 반드시 0(검은색)이고 만약에 한 점이 배경이라면 그 그레이스케일은 255(흰색)이어야 한다.
    그래서 고립된 소음에 대해 그의 주위는 모두 흰색이거나 대부분 수점이 흰색이어야 하기 때문에 판단할 때 조건을 넓혀야 한다. 한 점이 검은색이고 인접한 점이 흰색인 점의 개수가 고정된 값보다 크면 이 점이 소음이다.
    from PIL import Image
    
    def noise_reduction(img):
        w, h = img.size
        pixes = img.load()
        #    4  
        #   
        for i in range(w):
            if pixes[i,0] == 0:
                if pixes[i, 1] == 255:
                    pixes[i, 0] = 255
        #   
        for i in range(w):
            if pixes[i,h-1] == 0:
                if pixes[i, h-2] == 255:
                    pixes[i, h-1] = 255
    
        #   
        for i in range(h):
            if pixes[0, i] == 0:
                if [1, i] == 255:
                    pixes[0, i] = 255
    
        #   
        for i in range(h):
            if pixes[w-1, i] == 0:
                if [w-2, i] == 255:
                    pixes[w-1, i] = 255
    
        #       
        for i in range(1, w-1):
            for j in range(1, h-1):
                if pixes[i, j] == 0:
                    sum = pixes[i+1, j] + pixes[i, j+1] + pixes[i-1, j] + pixes[i, j-1] + pixes[i-1, j-1] + pixes[i+1, j-1] + pixes[i+1, j+1] + pixes[i-1, j+1]
                    if sum // 255 > 4:
                        pixes[i, j] = 255
    
        return img
    
    

    식별
    문자인식은 구글 오픈 소스 프로젝트------Tesseract OCR를 사용할 수 있다.
    1. 도구 설치
    1.1 Tesseract OCR 엔진 설치
    github 주소:https://github.com/tesseract-ocr/tesseract/wiki
  • 윈도우즈 다운로드 주소:https://github.com/UB-Mannheim/tesseract/wiki
  • ubuntu 설치
  • 1.2 Python Tesseract 설치
    파이썬-Tesseract는 파이썬을 위한 광학 문자인식(OCR) 도구다.즉, 이미지에 포함된 텍스트를 식별하고 읽습니다.파이톤-tesseract는 구글Tesseract OCR 엔진의python 봉인입니다.Pillow와 Leptonica 이미지 라이브러리에서 지원하는 모든 이미지 형식을 읽을 수 있기 때문에 Tesseract의 독립된 호출 스크립트로도 사용할 수 있습니다. jpeg, png,gif, bmp, tiff 등을 포함합니다.
    공식 문서:https://github.com/madmaze/pytesseract
    설치:
    pip install pytesseract
    

    간단한 사용:
    try:
        from PIL import Image
    except ImportError:
        import Image
    import pytesseract
    
    # If you don't have tesseract executable in your PATH, include the following:
    pytesseract.pytesseract.tesseract_cmd = r''
    # Example tesseract_cmd = r'C:\Program Files (x86)\Tesseract-OCR\tesseract'
    
    # Simple image to string
    print(pytesseract.image_to_string(Image.open('test.png')))
    
    # French text image to string
    print(pytesseract.image_to_string(Image.open('test-european.jpg'), lang='fra'))
    

    좋은 웹페이지 즐겨찾기