OCR 성능 끌어올리기 2nd step: Binarization-1

류창훈·2025년 2월 4일
0

CV (Computer Vision)

목록 보기
6/9

OCR 성능 끌어올리기 위한 이미지 전처리 작업 중, 이진화(Binarization) 내용입니다.


먼저, 이진화(Binarization)란

이미지의 각 픽셀 값을 0(검은색) 또는 255(흰색)로 변환하는 과정

로 정리할 수 있습니다.

글씨만 검은색으로 나타내면 OCR에 분명 도움이 되기 때문에
매우 적합한 과정 입니다.



처음,

전 포스팅에 봤던 동일 이미지를 봐보면,
영수증 가장자리 부분에 노란색 부분, 그리고 연한 갈색의 배경 부분이 보입니다.


이는 이미지가 컬러 스페이스(3채널)를 갖고 있음을 뜻합니다.



이진화를 위해서
흑백으로 변환한 결과물 입니다.

아직까진 부족해 보입니다.



그래서 몇가지 기법을 적용해보려 합니다.





1. Global Thresholding(전역 이진화)


- Manual Thresholding(수동 임계값)


먼저 전역 이진화는 이미지 전체에 단일 임계값을 적용하는 것이고,

여기서의 한 카테고리인 수동 임계값은,

사용자가 특정 임계값을 설정하여 모든 픽셀을 0 또는 255로 변환

하는 기법 입니다.

즉, 노가다 해서 최적 임계값을 찾는 것이라 볼 수 있습니다.



아래는 수동 임계값 방식을 적용한 코드이고,

_, simple_binary = cv2.threshold(image, 160, 255, cv2.THRESH_BINARY)

combined_image = np.hstack((image, simple_binary))

cv2.namedWindow("Manual Thresholding", cv2.WINDOW_NORMAL)
cv2.imshow('Manual Thresholding', combined_image)

이는 적용 결과물입니다.


임계값은 가장자리의 회색(원본의 노란색 부분), 그리고 배경을 고려해서 160으로 뒀습니다.

글씨는 상대적 검은색,
회색 부분은 흰색값이 어느정도 묻어나온 값이기 때문에 160 이상은 전부 흰색(255값).



- Otsu's Thresholding


Otsu 는,

히스토그램 분석을 통해 픽셀값의 분포를 기준으로 최적 임계값 결정

하는 방식입니다.


먼저 기존 흑백 이미지의 히스토그램 분포를 살펴보면,

40정도(검은색에 가까운)의 값과 220정도(흰색에 가까운)에 많이 분포하고 있습니다.

흰색 배경이 주된 색이기 때문에 밝은 색에 좀 더 많이 분포하고 있는 것을 알 수 있습니다.


_, otsu_binary = cv2.threshold(image, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

이건 Otsu 알고리즘 적용하는 코드,

적용 후의 결과물 입니다.

분명 자동화로 해준다고 했는데...

수동으로 했을 때 보다 결과가 더 안 나왔습니다.


이는,
히스토그램을 봐봤을 때,
40과 220에 많이 분포되어 있으나,
다른 부분의 빈도를 봐보면, 무시 못할 정도의 수치입니다.

Otsu는 분산을 최소화 하는 임계값을 자동으로 찾아주는 것인데,

애초에 분포 자체가 뚜렷한 경계를 만들어내지 못하고 있습니다.


그래서 효과가 미비하다고 볼 수 있습니다.


또한 전역 방식의 공통적인 문제는,
이진화를 거친 후 이미지의 오른쪽 부분이 검은색으로 나오는 것을 볼 수 있습니다.


이유를 생각해보면,
흑백 사진을 봤을 때,
오른쪽 부분에 그림자가 있는 것을 알 수 있습니다.


조명의 위치 때문에 이런 문제가 발생할 수 있으나,
사실상 실제 서비스에서는 이런 새새한 것 까지 사용자에게 요구하기는 좀 무리가 있습니다.



그래서 결론적으로는 전역 이진화 방식은 이런 문제에서 크게 도움이 되지 않습니다.



다음에는 지역 이진화 방식을 적용해보려 합니다.




감사합니당 ~ 🦾





참고자료
https://github.com/Ryuchanghoon/Improve-OCR-Quality/blob/main/binari_global_thresholding.py
https://medium.com/@tharindad7/image-binarization-in-a-nutshell-b40b63c0228e
profile
Linear AI Developer입니다.

0개의 댓글

관련 채용 정보