본문 바로가기
개발

🧼 OCR 성능 향상을 위한 이미지 전처리 전략

by 비트-바이트 2025. 3. 26.
반응형

📌 개요

OCR 성능이 생각보다 낮게 나와서 실망한 적 있으신가요?
OCR은 단순히 라이브러리만 좋다고 성능이 올라가지 않습니다.
**"좋은 입력이 좋은 결과를 만든다"**는 말처럼, 이미지 자체의 품질이 인식 성능에 가장 큰 영향을 미칩니다.

이번 글에서는 OCR 성능을 눈에 띄게 향상시킬 수 있는 전처리 전략들을 정리해드립니다.
OpenCV, PIL 기반으로 바로 적용할 수 있는 실습 팁도 포함되어 있어요.


🧠 핵심 개념

왜 전처리가 중요한가?

  • OCR은 기본적으로 픽셀 단위로 패턴을 인식하는 구조
  • 배경 노이즈, 그림자, 왜곡, 저해상도 등은 큰 방해 요소
  • 사람이 보기에는 잘 보이는 글자도, 머신은 알아보지 못함

OCR 정확도에 영향을 주는 요인들

  • 해상도 (dpi)
  • 명암 대비
  • 기울기/왜곡
  • 텍스트 배치 방향
  • 배경의 복잡도
  • 압축/노이즈

💡 실전 팁 또는 실습

1️⃣ 그레이스케일 변환

컬러 이미지에서 불필요한 색상을 제거하고 명암만 남기는 작업

import cv2
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

2️⃣ 블러 → 이진화(Thresholding)

배경의 작은 노이즈를 제거하고 텍스트를 더 또렷하게 만듦

blur = cv2.GaussianBlur(gray, (5, 5), 0)
_, thresh = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

3️⃣ 경계선 정리 (Morphology)

문자가 붙어있거나, 지저분한 외곽을 다듬어주는 과정

kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (2,2))
opened = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel)

4️⃣ 경사 보정 (Skew Correction)

문서나 표지판이 기울어졌을 때 각도를 자동으로 보정

coords = cv2.findNonZero(thresh)
angle = cv2.minAreaRect(coords)[-1]
# 회전 처리 생략: 각도 계산 후 affine transform 적용 가능

5️⃣ 노이즈 제거 + 대비 향상

노이즈 제거와 동시에 대비를 높이면 OCR 정확도가 향상됨

import numpy as np
denoised = cv2.fastNlMeansDenoising(thresh, None, 30, 7, 21)
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
enhanced = clahe.apply(denoised)

6️⃣ 이미지 확대 (특히 저해상도 텍스트에 효과적)

resized = cv2.resize(enhanced, None, fx=2, fy=2, interpolation=cv2.INTER_CUBIC)

✅ 마무리

OCR의 성능은 단순히 “어떤 OCR 엔진을 쓰느냐”보다
**"얼마나 잘 정리된 이미지로 입력하느냐"**에 따라 크게 달라집니다.

  • 빠른 시제품 → EasyOCR + 간단한 이진화
  • 정밀한 OCR → PaddleOCR + 모든 전처리 단계 적용

전처리는 처음엔 귀찮지만, 한 번 함수로 만들어두면
다음 프로젝트에 복붙으로 바로 적용 가능하니 꼭 챙겨두세요!


📎 다음 글 예고

  • OCR + Flask로 웹 OCR 서비스 만들기
  • Tesseract OCR 성능 튜닝 방법
  • 전처리 자동화 파이프라인 만들기 (Python 클래스 구성)

반응형