병원차트 OCR 전처리 코드 공유 (OpenCV)

2024. 5. 3. 00:41머신러닝&딥러닝/OCR

728x90

지난 번 pytesseract로 휴대폰으로 촬영한 병원차트 OCR을 시도해 본 결과, foundation model로는 인식 성능이 매우 나쁘게 나와서 fine tuning을 시도해 보았다. 그러나, 이미지 퀄리티가 너무 안 좋아서 bounding box도 못 잡길래, 병원 측에 이미지 촬영본 말고 캡처본으로 다시 데이터를 달라고 요청드렸다.

 

 

기존 데이터는 이렇게 생겼다. (개인정보는 모두 블러 처리했다.) 위아래, 양옆으로 잘린 글씨 및 불규칙한 촬영 각도로 인해 전처리도 까다로웠고 bbox 잡는 것도 어려웠다.

 

새로운 데이터는 위와 같이 차트 전체 모습이 캡쳐된 형태여서 훨씬 규칙적이었다. 이 이미지 332장, 총 8,567명의 환자 데이터를 OCR하는 task를 수행하기 위해 전처리를 아래와 같이 진행하였다.

 

bbox 표시

첫 번째 이미지에서 unique 한 색깔로 점을 찍어서, numpy로 불러 온 이미지에 해당 컬러의 점이 어디에 위치해 있는지를 반환해 bbox로 사용할 두 점의 좌표를 반환하는 코드를 먼저 작성했다.

from PIL import Image
import cv2
import numpy as np

img_path = #이미지 경로
target_color = np.array([81, 0, 193])
img = cv2.imread(img_path)
print(img.shape)
matches = np.where(np.all(img == target_color, axis=-1))
matching_pixels = list(zip(matches[1], matches[0]))

print(matching_pixels)

 

이때 점 하나에도 여러 픽셀이 들어가므로, 출력된 결과를 보고 대략적인 값을 선택하면 된다.

 

이미지 자르기 & 콘트라스트 증가

인식 성능을 높이기 위해 OpenCV의 메소드인 cv2.convertScaleAbs를 이용하여 콘트라스트를 높였다.

import cv2
import numpy as np
import os

pth = #경로

for title in os.listdir(pth):
    img_path = os.path.join(pth, title)
    print(img_path)
    image = cv2.imread(img_path)
    print(image.shape)
    x1, y1 = 415, 120
    x2, y2 = 1610, 920
    cropped_image = image[y1:y2, x1:x2]
    adjusted_image = cv2.convertScaleAbs(cropped_image, alpha=1.5, beta=0)
    cv2.imwrite(title.replace('.png', '_cropped.png'), adjusted_image)

 

이때 새로운 이미지가 원하는 폴더에 저장되도록 하기 위해서는, cmd 에서 경로를 destined folder로 변경하고 실행해야 한다.

반응형