본문 바로가기
업무자동화 with Python

[업무자동화 with Python] OCR (Optical Character Recognition)

by CodeCrafter 2024. 11. 6.
반응형

 

이번에는 OCR을 파이썬으로 수행하는 방법에 대해서 알아보겠습니다.

 

재현성을 위해 코드는 코랩에서 실행하였습니다.

 

1. 파이썬을 활용한 OCR

- 이번 실습을 위해 사용할 라이브러리는 pytesseract입니다.

 

- 다양하고 보다 심도 있는 사용법을 위해서는 아래 github를 참조하시면 되겠습니다.

https://github.com/madmaze/pytesseract

 

GitHub - madmaze/pytesseract: A Python wrapper for Google Tesseract

A Python wrapper for Google Tesseract. Contribute to madmaze/pytesseract development by creating an account on GitHub.

github.com

 

- 이번에 활용할 데이터는 인터넷에 공개된 영수증 중 하나입니다. 모습은 아래와 같습니다.

 

 

- 먼저 다음과 같은 라이브러리들을 설치해줍니다.

 

!pip install pytesseract
!apt-get update
!apt-get install -y tesseract-ocr

 

- 설치가 완료되면 이제 이미지를 열어주고 OCR을 진행해주면 됩니다.

 

- OCR을 위해서는 보다 선명한 이미지가 더 유리하고, 이를 위해서 간단한 Image 전처리를 해주겠습니다.

 

from PIL import Image, ImageEnhance, ImageFilter
import pytesseract
import matplotlib.pyplot as plt

# 이미지 열기
img_path = "/content/drive/MyDrive/receipt.jpg"
img = Image.open(img_path)

# 1. 이미지 전처리: 그레이스케일 변환 및 대비 강화
img = img.convert("L")  # 그레이스케일로 변환
img = ImageEnhance.Contrast(img).enhance(2)  # 대비 강화

# 2. 이미지 필터링: 더 선명하게 하기 위해 샤프닝 필터 적용
img = img.filter(ImageFilter.SHARPEN)

# 전처리된 이미지 확인
plt.imshow(img, cmap="gray")
plt.axis("off")
plt.show()

 

 

해당 이미지를 Gray scale로 바꿔준 뒤 대비 강화를 해주니 조금 더 선명해 보입니다.

 

 

- 이제 OCR을 진행해줍니다.

 

# 3. OCR 실행
text = pytesseract.image_to_string(img, lang='eng')
print("추출된 텍스트:\n", text)

 

 

결과는 아래와 같습니다. 글자는 잘 추출된 것 같고 특수 기호 같은 것들은 이상하게 출력된 것을 알 수 있습니다.

 

 

 

 

- 이제 도출된 결과를 기반으로, 표로 깔끔하게 정리해보겠습니다. 정규표현식을 사용해서 문자와 공백으로 이루어진 Description 부분과 그 뒤에오는 숫자를 Price로 인식하게 하였습니다. 그리고 Description이라는 항목과 Price라는 항목으로 데이터의 열을 만든 뒤 이에 맞게 데이터를 정렬하여 넣어보겠습니다.

 

# 4. OCR 결과를 데이터 프레임으로 변환 (유연한 패턴 매칭 적용)
lines = text.splitlines()
data = []
pattern = re.compile(r"([A-Za-z\s]+)\s+(\d+\.\d+|\d+)")  # 문자 + 공백 + 숫자의 패턴

for line in lines:
    match = pattern.search(line)
    if match:
        description = match.group(1).strip()
        price = float(match.group(2))
        data.append([description, price])

# 데이터 프레임 생성
df = pd.DataFrame(data, columns=["Description", "Price"])
print("\n데이터 프레임:\n", df)

 

- 다음과 같이 괜찮은 결과를 얻어 낼 수 있습니다.

반응형

댓글