Skip to content

To find text portion and recognize the text in the image. (이미지에서 글자 찾기)

Notifications You must be signed in to change notification settings

nicewoong/pyTextGotcha

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

85 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

PyTextGotcha

pre_process.py

Introduction

이미지에서 글자 부분을 추출하기 위해 이미지 처리(Image precessing)를 합니다.

  • 이미지에서 글자로 추정되는 부분을 찾아 표시하거나 해당 영역을 잘라낼 수 있습니다.

  • 글자로 추정되는 부분을 더 잘 찾기 위해 이미지 처리(Image precessing)를 거칩니다.

  • 이미지 처리(Image precessing)는 5단계로 구성됩니다. process_image() 에서 순서를 변경하여 적용할 수 있습니다.

      1. Gray-scale 적용
      1. Morph Gradient 적용
      1. Long Line Removal 적용
      1. Threshold 적용
      1. Close 적용
  • 위 이미지 처리(Image precessing) 단계를 거친 후 Contour(경계영역)를 추출하면 글자로 추정되는 영역을 발견할 수 있습니다.

  • 각 단계의 함수 내부에서 사용되는 상수 값들은 configs.yml 파일에서 설정가능합니다.

  • 아래 import 목록에 해당하는 파이썬 패키지가 개발환경에 설치되어야 합니다.특히 OCR(문자 인식)을 위한 pytesseract 를 사용하기 위해서는 각 언어팩을 함께 설치해야함에 주의하세요. 이미지처리에는 주로 OpenCV 라이브러리를 활용합니다.

todo : 각 단게의 개념을 좀 더 자세히 소개하자. todo : 각 단계를 거쳤을 때 어떤 결과를 얻을 수 있는지 이미지로 표시하자.

1) Gray-scale 적용
def get_gray(image_origin):
  • image 객체를 인자로 받아서 Gray-scale 을 적용한 2차원 이미지 객체로 반환합니다. 이 때 인자로 입력되는 이미지는 BGR 컬러 이미지여야 합니다.

    :param image_origin: OpenCV 의 BGR image 객체 (3 dimension)

    :return: gray-scale 이 적용된 image 객체 (2 dimension)

2) Morph Gradient 적용

def get_gradient(image_gray):
  • 이미지에 Dilation 과 Erosion 을 적용하여 그 차이를 이용해 윤곽선을 추출합니다. 이 때 인자로 입력되는 이미지는 Gray scale 이 적용된 2차원 이미지여야 합니다.

  • configs.yaml 파일에서 kernel size (kernel_size_row, kernel_size_col)를 설정하여 이미지처리 효과 정도를 조절할 수 있습니다.

    :param image_gray: Gray-scale 이 적용된 OpenCV image (2 dimension)

    :return: 윤곽선을 추출한 결과 이미지 (OpenCV image)

3) Threshold 적용

def get_threshold(image_gray):
  • 이미지에 Threshold 를 적용해서 흑백(Binary) 이미지객체를 반환합니다. 이 때 인자로 입력되는 이미지는 Gray-scale 이 적용된 2차원 이미지여야 합니다.

  • configs.yaml 파일에서 변수값(mode, block_size, subtract_val)를 설정하여 이미지처리 효과 정도를 조절할 수 있습니다.

    :param image_gray: Gray-scale 이 적용된 OpenCV image (2 dimension)

    :return: Threshold 를 적용한 흑백(Binary) 이미지

  • configs 에 적용된 threshold mode 에 따라 아래와 같이 Threshold 를 적용할 수 있습니다.

    • global threshold
    • mean adaptive threshold
    • gaussian adaptive threshold
4) Long Line Removal 적용

def remove_long_line(image_binary):
  • 이미지에서 직선을 찾아서 삭제합니다. 글자 경계를 찾을 때 방해가 되는 직선을 찾아서 삭제합니다. 이 때 인자로 입력되는 이미지 2 차원(2 dimension) 흑백(Binary) 이미지여야 합니다.

  • 직선을 삭제할 때는 해당 라인을 검정색으로 그려 덮어 씌웁니다.

  • configs.yaml 파일에서 변수값(threshold, min_line_length, max_line_gap)를 설정하여 이미지처리 효과 정도를 조절할 수 있습니다.

    :param image_binary: 흑백(Binary) OpenCV image (2 dimension)

    :return: 라인이 삭제된 이미지 (OpenCV image)

5) Morph Close 적용

def get_closing(image_gray):
  • 이미지에 Morph Close 를 적용한 이미지객체를 반환합니다. 이미지에 Dilation 수행을 한 후 Erosion 을 수행한 것입니다. 이 때 인자로 입력되는 이미지는 Gray-scale 이 적용된 2차원 이미지여야 합니다.

  • configs 에 의해 kernel size 값을 설정할 수 있습니다.

  • 커널은 Image Transformation 을 결정하는 구조화된 요소이며 커널의 크기가 크거나, 반복횟수가 많아지면 과하게 적용되어 경계가 없어질 수도 있습니다.

  • configs.yaml 파일에서 변수값(kernel_size_row, kernel_size_col)를 설정하여 이미지처리 효과 정도를 조절할 수 있습니다.

    :param image_gray: Gray-scale 이 적용된 OpenCV image (2 dimension)

    :return: Morph Close 를 적용한 흑백(Binary) 이미지

6) Contour 추출

def get_contours(image):
  • 이미지에서 Contour 를 추출하여 반환합니다.찾은 contour 리스트를 dictionary 형태로 반환합니다.이미지 처리(Image processing) 단계를 거친 후 contour 를 잘 추출할 수 있습니다.

  • configs.yaml 파일에서 변수값(min_width, min_height, retrieve_mode, approx_method)를 설정하여 이미지처리 효과 정도를 조절할 수 있습니다.

    :param image: OpenCV의 image 객체 (2 dimension)

    :return: 이미지에서 추출한 contours


preprocess_test.py

Introduction

pre_precess.py 에서 정의된 이미지 처리(Image precessing)의 각 단계별 결과 및 최종 결과물에 대하여 테스트하고 분석할 수 있습니다.

  • 윈도우를 띄어서 진행단계의 이미지를 확인할 수 있습니다.
  • 이미지들을 양옆 및 위아래로 병합해여 비교할 수 있습니다.
이미지 윈도우 열기
def show_window(image, title='untitled', max_height=700):
  • 이미지 윈도우를 열어서 보여줍니다.
    • :param image: 보여줄 이미지 (OpenCV image 객체)
    • :param title: 윈도우 제목
    • :param max_height: 이미지 윈도우 사이즈의 최대 높이

이미지 합치기

def merge_horizontal(image_gray, image_bgr):
  • Height 사이즈가 같은 두 이미지를 옆으로(Horizontally) 병합 합니다.이미지 처리(Image processing) 단계를 원본과 비교하기위한 목적으로, 2차원(2 dimension) 흑백 이미지와 3차원(3 dimension) BGR 컬리 이미지를 인자로 받아 병합합니다.

    • :param image_gray: 2차원(2 dimension) 흑백 이미지
    • :param image_bgr: 3차원(3 dimension) BGR 컬리 이미지
    • :return: 옆으로(Horizontally) 병합된 이미지

def merge_vertical(image_gray, image_bgr):
  • Width 사이즈가 같은 두 이미지를 위아래로(Vertically) 병합 합니다. 이미지 처리(Image processing) 단계를 원본과 비교하기위한 목적으로, 2차원(2 dimension) 흑백 이미지와 3차원(3 dimension) BGR 컬리 이미지를 인자로 받아 병합합니다.
  • :param image_gray: 2차원(2 dimension) 흑백 이미지
  • :param image_bgr: 3차원(3 dimension) BGR 컬리 이미지
  • :return: 위아래로(Vertically) 병합된 이미지

전체 단계별 이미지처리 결과 한 눈에 확인하기

def get_step_compare_image(path_of_image):
  • 이미지 프로세싱 전 단계의 중간 결과물을 하나로 병합하여 반환합니다.

    • :param path_of_image: 이미지 처리(Image precessing)를 적용할 이미지 파일
    • __ :return:__ 이미지 처리 단계별 결과를 한 눈에 확인할 수 있도록 모두 병합한 이미지를 반환

config.yml

threshold:
    block_size: 9 # Threshold (Odd number !!)
    subtract_val: 12  # Threshold
  • block_size 는 Odd number(홀수)여야 합니다.

gradient:
    kernel_size_row: 2  # Gradient Kernel Size
    kernel_size_col: 2  # Gradient Kernel Size

close:
    kernel_size_row: 2  # Closing Kernel Size
    kernel_size_col: 2  # Closing Kernel Size

remove_line:
    threshold: 100  # Long Line Remove Precision
    min_line_length: 100  # Long Line Remove  Minimum     Line Length
    max_line_gap: 5  # Long Line Remove Maximum Line Gap

contour:
    min_width: 4  # Minimum Contour Rectangle Size
    min_height: 10  # Minimum Contour Rectangle Size
    retrieve_mode: 0  # RETR_EXTERNAL = 0. RETR_LIST = 1, RETR_CCOMP = 2, RETR_TREE = 3, RETR_FLOODFILL = 4
    approx_method: 2  # CHAIN_APPROX_NONE = 1, CHAIN_APPROX_SIMPLE = 2, CHAIN_APPROX_TC89_KCOS = 4, CHAIN_APPROX_TC89_L1 = 3
  • retrieve_mode

  • cv2.RETR_EXTERNAL : contours line중 가장 바같쪽 Line만 찾음.

  • cv2.RETR_LIST : 모든 contours line을 찾지만, hierachy 관계를 구성하지 않음.

  • cv2.RETR_CCOMP : 모든 contours line을 찾으며, hieracy관계는 2-level로 구성함.

  • cv2.RETR_TREE : 모든 contours line을 찾으며, 모든 hieracy관계를 구성함.

  • approx_method

    • cv2.CHAIN_APPROX_NONE : 모든 contours point를 저장.
    • cv2.CHAIN_APPROX_SIMPLE : contours line을 그릴 수 있는 point 만 저장. (ex; 사각형이면 4개 point)
    • cv2.CHAIN_APPROX_TC89_L1 : contours point를 찾는 algorithm
    • cv2.CHAIN_APPROX_TC89_KCOS : contours point를 찾는 algorithm


judge_text.py

Introduction

Inception v3 모델을 가지고 Transfer Learning 을 통해 새로운 모델을 만들었습니다. 모델을 활용해서 input 이미지가 Text인지 Text가 아닌지 두 종류의 이미지분류 결과를 알려줍니다.

Useage

 >python judge_text.py some_directory_path/test_image.jpg
  • 결과는 아래와 같이 출력됩니다.

text (score = 0.96235)
not text (score = 0.03765)

References

Naver D2 blog post

StackOverflow

About

To find text portion and recognize the text in the image. (이미지에서 글자 찾기)

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages