Data science/Image data

[Tesseract & OpenCV]를 이용한 OCR-2-1 전처리(pre-processing)

ggoboogi_house 2020. 8. 18. 23:33
반응형

Tesseract & OpenCV

  지난번에 이어 오늘은 테서랙트와 OpenCV를 이용한 OCR에서 OCR 정확도를 높이기 위해 이미지 전처리에 대해 알아보겠습니다. 

  OpenCV는 Open source computer vision library의 약자로 이미지/영상 처리를 효과적으로 도와주는 강력한 API입니다. 처음에는 Intel에서 개발되었고 이후 BSD license로 무료로 사용할 수 있게 되었다고 합니다. OpenCV tutorial 사이트에 방문하시면 더 많은 정보를 확인하실 수 있습니다. 그리고 "gramman"님께서 OpenCV tutorial 사이트를 참고해서 번역 및 정리해놓은 사이트를 방문하시면 잘 정리된 한글 자료를 확인하실 수도 있습니다. 

 

0) 이미지 불러오기

  본 포스팅에서는 OpenCV를 이용한 몇 가지 이미지 전처리에 대해 다뤄보겠습니다. 먼저 구글에서 자동차 번호판 이미지를 검색해서 불러와보겠습니다. OpenCV에서 cv2.imread() 명령어를 이용하여 cv2.IMREAD_COLOR 옵션으로 이미지를 불러왔습니다. 컬러 이미지를 불러왔기때문에 image_car.shape이 3개의 채널(Blue, Green, Red)로 불러와졌습니다. 옵션들의 추가적인 부분은 아래와 같습니다.

  - cv2.IMREAD_COLOR: 이미지를 color로 불러오기, 기본값

  - cv2.IMREAD_GRAYSCALE: 이미지를 grayscale로 불러오기

  - cv2.IMREAD_UNCHANGED: 이미지를 alpha channel까지 불러오기

이미지 출처 : https://pxhere.com/en/photo/1607225

1)  Color -> Grayscale

  이미지를 grayscale로 변환하는 함수를 작성해보겠습니다. OpenCV에서 이미지의 색상특성을 변환하고자 할때는 cv2.cvtColor() 함수를 사용하면 됩니다. Grayscale로 바꾸려면 함수의 파라미터를 cv2.COLOR_BGR2GRAY를 입력하면 됩니다. 색상 변환과 관련되 더 자세한 사항은 링크를 참조해주세요.

  아래 그림에서 볼 수 있는 것처럼 grayscale로 변환하니 1채널의 값이 되었습니다. Grayscale로 변환하긴 하였지만 노트북 환경 때문에 노랗게 보이는군요. 함수를 만들어서 이미지를 변환하였지만 이는 예시를 보여드리기 위해 작성한 내용이고, 사실 이미지를 불러올때 cv2.imread()함수에서 파라미터 값을 cv2.IMREAD_GRAYSCALE로 설정하면 바로 grayscale로 불러올 수 있습니다.

 

2) Grayscale -> Binary

  다음으로는 grayscale로 변환한 이미지를 흑과백, 이진화(binary) 이미지로 변환해보겠습니다. Grayscale 이미지를 이진화하기 위해서는 cv2.threshold() 함수를 사용하면 됩니다. 이때 입력하는 파라미터로는 cv2.THRESH_BINARYcv2.THRESH_OTSU의 이진화 옵션을 사용하였습니다. 각 파라미터에 대한 자세한 설명은 링크를 참고하시면 좋을 것 같습니다. 

이진화이미지는 grayscale과는 다르게 아래와 같이 값이 0과 255로만 구성되도록 변환되었습니다.

 

3)  Remove noise(노이즈 제거)

  이미지에서 노이즈를 제거하기 위해서는 cv2.medianBlur() 함수를 사용하면 됩니다. Blur의 사전적 뜻은 '흐리게 하다'라는 뜻인데요, 커널이라는 일종의 창함수를 이용하여 커널을 커널내의 중앙값으로 채우는 방식입니다. 커널은 전체 이미지를 훑으면서 이 작업을 반복수행하게 되는데요, 이때 커널 사이즈는 홀수로 입력하여야 합니다. 자세한 사항은 링크를 참조해주세요.

  아래 결과를 보면... 육안상 크게 티는 나지 않는 것 같지만, 오른쪽의 노이즈 제거된 이미지에 잡티?가 더 적은 것을 볼 수 있습니다.

  커널 사이즈에 따라 결과가 어떻게 변하게 되는지 살펴보겠습니다.

  위 그림에서 볼 수 있는 것처럼 커널사이즈가 커질수록 이미지가 더 많이 뭉개지는 것을 볼 수 있습니다. cv2.medianBlur() 함수에서 커널사이즈는 이미지 특성에 맞게 적절하게 사용하는 것이 필요합니다.

 

<Reference>

- https://nanonets.com/blog/ocr-with-tesseract/

- https://tesseract-ocr.github.io/tessdoc/ImproveQuality

- https://github.com/tesseract-ocr/tesseract/blob/master/doc/tesseract.1.asc#config-files-and-augmenting-with-user-data

- https://www.freelancer.com/u/ihormasan519/portfolio/Get-Text-from-image-pdf-invoice-4495209?w=f&ngsw-bypass=

- https://pxhere.com/en/photo/1607225

- https://opencv-python.readthedocs.io/en/latest/index.html

- https://github.com/gramman75/opencv/blob/master/index.rst

- https://opencv-python-tutroals.readthedocs.io/en/latest/

 

 

 

반응형