OpenCV-Python을 사용한 간단한 숫자 인식 OCR
OpenCV-Python을 사용한 간단한 숫자 인식 OCR
이 코드는 OpenCV, NumPy 및 Python을 사용하여 이미지에서 숫자를 인식하는 간단한 OCR 프로그램입니다. 이미지를 여러 개의 구성 요소로 분할하고 각 구성 요소를 숫자로 매핑하여 작동합니다.
필수 라이브러리
이 코드를 실행하려면 다음 라이브러리가 설치되어 있어야 합니다.
- OpenCV
- NumPy
- Python
코드 설명
import cv2
import numpy as np
def segment_digits(image):
# 이미지를 회색조로 변환하고 블러 처리합니다.
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (5, 5), 0)
# 임계값 처리를 사용하여 이진 이미지를 만듭니다.
thresh = cv2.threshold(blurred, 0, 255, cv2.THRESH_BINARY)[1]
# 연결된 구성 요소를 찾습니다.
contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 각 윤곽선을 처리합니다.
for contour in contours:
# 윤곽선의 바운딩 박스를 계산합니다.
(x, y, w, h) = cv2.boundingRect(contour)
# ROI(관심 영역)를 추출하고 이진 이미지로 변환합니다.
roi = thresh[y:y+h, x:x+w]
ret, binary = cv2.threshold(roi, 127, 255, cv2.THRESH_BINARY_INV)
# 세로선을 찾습니다.
vertical_lines = cv2.verticalLines(binary.astype(np.uint8()))
# 세로선의 수를 기반으로 숫자를 식별합니다.
if vertical_lines is None:
digit = 0
elif len(vertical_lines) == 1:
digit = 1
elif len(vertical_lines) == 2:
digit = 2
elif len(vertical_lines) == 3:
digit = 3
elif len(vertical_lines) == 4:
digit = 4
else:
digit = -1
# 숫자를 이미지에 표시합니다.
cv2.putText(image, str(digit), (x, y), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2)
# 이미지를 읽고 처리합니다.
image = cv2.imread('digits.png')
segment_digits(image)
# 결과 이미지를 표시합니다.
cv2.imshow('Result', image)
cv2.waitKey(0)
코드 작동 방식
- 이미지 로드 및 전처리: 먼저 'digits.png' 이미지를 로드하고 회색조로 변환하고 블러 처리합니다. 이는 이미지에서 노이즈를 제거하고 숫자 윤곽선을 명확하게 만드는 데 도움이 됩니다.
- 이진화: 다음으로 임계값 처리를 사용하여 이미지를 이진 이미지로 변환합니다. 이는 픽셀을 흰색(배경) 또는 검정색(숫자)으로 변환합니다.
- 윤곽선 찾기: 연결된 구성 요소를 사용하여 이미지의 윤곽선을 찾습니다. 각 윤곽선은 숫자를 나타내는 가능성이 있는 개별 컴포넌트를 나타냅니다.
- 숫자 인식: 각 윤곽선에 대해 다음 단계를 수행합니다.
- 윤곽선의 바운딩 박스를 계산합니다.
- ROI(관심 영역)를 추출하고 이진 이미지로 변환합니다.
- 세로선을 찾습니다.
- 세로선의 수를 기반으로 숫자를 식별합니다.
- 결과 표시: 마지막으로 인식된 숫자를 이미지에 표시하고 결과 이미지를 표시합니다.
참고:
- 이 코드는 단순한 예시이며 실제 응용 프로그램
OpenCV-Python을 사용한 간단한 숫자 인식 OCR: 예제 코드
import cv2
import numpy as np
def segment_digits(image):
# 이미지를 회색조로 변환하고 블러 처리합니다.
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (5, 5), 0)
# 임계값 처리를 사용하여 이진 이미지를 만듭니다.
thresh = cv2.threshold(blurred, 0, 255, cv2.THRESH_BINARY)[1]
# 연결된 구성 요소를 찾습니다.
contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 각 윤곽선을 처리합니다.
for contour in contours:
# 윤곽선의 바운딩 박스를 계산합니다.
(x, y, w, h) = cv2.boundingRect(contour)
# ROI(관심 영역)를 추출하고 이진 이미지로 변환합니다.
roi = thresh[y:y+h, x:x+w]
ret, binary = cv2.threshold(roi, 127, 255, cv2.THRESH_BINARY_INV)
# 세로선을 찾습니다.
vertical_lines = cv2.verticalLines(binary.astype(np.uint8()))
# 세로선의 수를 기반으로 숫자를 식별합니다.
if vertical_lines is None:
digit = 0
elif len(vertical_lines) == 1:
digit = 1
elif len(vertical_lines) == 2:
digit = 2
elif len(vertical_lines) == 3:
digit = 3
elif len(vertical_lines) == 4:
digit = 4
else:
digit = -1
# 숫자를 이미지에 표시합니다.
cv2.putText(image, str(digit), (x, y), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2)
# 이미지를 읽고 처리합니다.
image = cv2.imread('digits.png')
segment_digits(image)
# 결과 이미지를 표시합니다.
cv2.imshow('Result', image)
cv2.waitKey(0)
- 라이브러리 가져오기: 먼저 OpenCV 및 NumPy 라이브러리를 가져옵니다.
segment_digits
함수 정의: 이 함수는 이미지를 입력으로 받아 이미지의 숫자를 분할하고 인식합니다.- 이미지 전처리: 이미지를 회색조로 변환하고 블러 처리하여 노이즈를 제거합니다.
- 이진화: 임계값 처리를 사용하여 이미지를 이진 이미지로 변환합니다.
- 윤곽선 찾기: 연결된 구성 요소를 사용하여 이미지의 윤곽선을 찾습니다.
- 숫자 인식: 각 윤곽선에 대해 ROI(관심 영역)를 추출하고 세로선을 찾아 숫자를 식별합니다.
- 결과 표시: 인식된 숫자를 이미지에 표시합니다.
- 이미지 로드 및 처리: 'digits.png' 이미지를 로드하고
segment_digits
함수를 사용하여 처리합니다. - 결과 표시: 처리된 이미지를 'Result' 창에 표시하고 사용자가 키를 누를 때까지 기다립니다.
주의 사항:
- 이 코드는 단순한 예시이며 실제 응용 프로그램에서는 더 복잡한 이미지 전처리 및 숫자 인식 알고리즘이 필요할 수 있습니다.
- 코드는 영상에서 하나의 숫자가 포함된 이미지만 처리하도록 설계되었습니다. 여러 숫자가 포함된 이미지를 처리하려면 코드를 수정해야 합니다.
- 코드는 특정 글꼴 및 크기의 숫자를 인식하도록 설계되었습니다. 다른 글꼴이나 크기를 인식하려면 코드를 수정해야 합니다.
OpenCV-Python을 사용한 숫자 인식 OCR: 대체 방법
K-최근접 이웃 (KNN) 알고리즘 사용:
이 방법은 사전 학습된 숫자 이미지 데이터 세트와 KNN 알고리즘을 사용하여 숫자를 인식합니다.
- 단계:
- 다양한 글꼴과 크기의 숫자를 포함하는 숫자 이미지 데이터 세트를 수집하고 레이블을 정합니다.
- 각 이미지를 특징 벡터로 변환합니다.
- KNN 알고리즘을 학습하여 특징 벡터와 해당 레이블 간의 매핑을 학습합니다.
- 입력 이미지를 특징 벡터로 변환하고 학습된 KNN 알고리즘을 사용하여 가장 유사한 데이터 세트 이미지의 레이블을 예측합니다.
장점:
- 간단하고 구현하기 쉬움
- 다양한 글꼴과 크기의 숫자를 인식할 수 있음
단점:
- 데이터 세트 수집 및 레이블링에 많은 시간이 필요할 수 있음
- 대규모 데이터 세트에 대해 계산 비용이 많이 들 수 있음
신경망 사용:
이 방법은 숫자 인식을 위한 전문 신경망 모델을 학습하는 데 딥 러닝을 사용합니다.
- 단계:
- 컨볼루션 신경망(CNN)과 같은 딥 러닝 모델을 설계합니다.
- 수집된 데이터 세트를 사용하여 신경망 모델을 학습합니다.
- 입력 이미지를 신경망 모델에 입력하고 모델이 예측한 클래스 레이블을 사용하여 숫자를 인식합니다.
- 높은 정확도를 달성할 수 있음
- 복잡한 배경과 변형된 숫자를 포함한 이미지를 처리할 수 있음
- 학습에 많은 데이터와 계산 리소스가 필요할 수 있음
- 학습된 모델이 특정 데이터 세트에 편향될 수 있음
어떤 방법을 선택해야 할까요?
선택한 방법은 특정 요구 사항에 따라 다릅니다. 간단하고 빠르게 구현할 수 있는 방법이 필요한 경우 KNN 알고리즘이 좋은 선택입니다. 높은 정확도가 필요하고 복잡한 이미지를 처리할 수 있는 방법이 필요한 경우 신경망 사용을 고려해야 합니다.
python opencv numpy