반응형
📌 개요
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 클래스 구성)
반응형
'개발' 카테고리의 다른 글
📃 Swagger로 REST API 문서 자동화하기 (0) | 2025.03.26 |
---|---|
🛠 실습으로 배우는 Express 기반 REST API 만들기 (0) | 2025.03.26 |
⚔️ REST vs GraphQL: 언제 무엇을 써야 할까? (1) | 2025.03.26 |
⚔️ Git 충돌(conflict) 해결 방법: 실전 가이드 (0) | 2025.03.26 |
🤝 실전 협업 시 Git 사용법 (1) | 2025.03.26 |