Object Detection

직접 쓴 손 글씨(숫자) 인식하기 - 필터링을 통한 인식률 향상시키는 방법

jwjwvison 2021. 8. 26. 22:31

 이번 포스팅에서는 내가 직접 쓴 손 글씨를 인식하는 프로그램을 만들기 위해 먼저 인식할 이미지를 필터링을 통해 더 인식하기 쉽게 만들어 주는 과정에 대해 정리해 보겠다.

 위 사진은 인식할 이미지이다.

 

 먼저 필요한 모듈들을 import 하고 사진 정보를 불러오겠다.

import cv2
import numpy as np
import matplotlib.pyplot as plt

frame='digits_357.jpg'

img=cv2.imread(frame)
plt.imshow(img)

print('width:{} pixels'.format(img.shape[1]))
print('height:{} pixels'.format(img.shape[0]))
print('{} channels'.format(img.shape[2]))

 

 그다음 이 이미지의 명도차이를 더 뚜렷하게 보기 위해 HSV중 V(value,명도)만 가져와 보겠다.

hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
hue,saturation,value=cv2.split(hsv)
plt.imshow(value)  #명도의 차이를 명확하게 하기 위해

 

 이번에는 이미지들의 외곽선 값들을 찾아내겠다.

# kernel to use for morphological operations
kernel=cv2.getStructuringElement(cv2.MORPH_RECT,(3,3)) # 이미지의 바운더리를 찾는다

#applying tioflat operation
topHat=cv2.morphologyEx(value,cv2.MORPH_TOPHAT,kernel)
plt.imshow(topHat)   #이미지에서 외곽선 값들을 찾아낸다

#applying blackHat operations
blackHat=cv2.morphologyEx(value,cv2.MORPH_BLACKHAT,kernel)
plt.imshow(blackHat)

 

 여기서 topHat은 원본 이미지와 opening결과의 차이를 보여준다. blackHat은 원본 이미지와 closing결과의 차이를 보여준다.

 opening: 이미지에 침식 적용 후 팽창 적용하는 것으로 영역이 점점 둥글게 된다. 따라서 점 잡음 이나 작은 물체, 돌기 등을 제거하는데 적합하다.

 closing 이미지에 팽창 적용후 침식 적용하는 것으로 영역과 영역이 서로 붙기 때문에 이미지의 전체적인 윤곽을 파악하기에 적합하다.

 

 다음에는 외곽선을 더 선명하게 해주는 작업을 해준다.

#add and substract between morphological operations 외곽선을 좀 더 선명하게 만들어주는 작업
add=cv2.add(value,topHat)
subtract=cv2.subtract(add,blackHat)
plt.imshow(subtract)

 좀 더 뿌옇게 만들어더 차별성을 더 준다.

#applying gaussian blur on substract image 좀 더 뿌옇게 만들어서 차별성을 준다
blur=cv2.GaussianBlur(subtract,(5,5),0)
plt.imshow(blur)

 마지막으로 thresholding을 통해 글씨와 배경의 차이를 더 극명하게 나타내준다.

# thresholding
thresh=cv2.adaptiveThreshold(blur,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY_INV,19,9)
plt.imshow(thresh)