이번 포스팅에서는 내가 직접 쓴 손 글씨를 인식하는 프로그램을 만들기 위해 먼저 인식할 이미지를 필터링을 통해 더 인식하기 쉽게 만들어 주는 과정에 대해 정리해 보겠다.
위 사진은 인식할 이미지이다.
먼저 필요한 모듈들을 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)
'Object Detection' 카테고리의 다른 글
자동차 번호판 인식 프로젝트 (0) | 2021.09.03 |
---|---|
직접 쓴 손 글씨(숫자) 인식하기 - 글씨 추출 및 검출 (0) | 2021.08.27 |
object detection project - keras를 사용한 detection(2) (0) | 2021.08.26 |
object detection project - keras를 사용한 detection(1) (0) | 2021.08.24 |
Custom YOLO project - custom data 학습 (0) | 2021.08.21 |