이후에서는 인식률을 높이기 위한 아래의 다양한 방법을 연습해보겠습니다.
'''
1. Gaussian Filter
2. Sharpening
'''
blur = cv2.GaussianBlur(img, (1, 1), 0) # kernel size 크게 잡지 않도록 주의
sharp = np.clip(2.0*img - blur, 0, 255).astype(np.uint8)
ret1, th1 = cv2.threshold(blur, 0,255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
ret2, th2 = cv2.threshold(sharp, 0,255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
images=[th1, th2]
titles=["blur > otsu", "blur > sharpening > otsu"]
plt.figure(figsize=(30,15))
for i in range(2):
plt.subplot(1,2,i+1), plt.imshow(images[i], "gray")
plt.title(titles[i]), plt.xticks([]), plt.yticks([])
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray_img, (1, 1), 0) # kernel size 크게 잡지 않도록 주의
sharp = np.clip(2.0*gray_img - blur, 0, 255).astype(np.uint8)
ret1, th1 = cv2.threshold(blur, 0,255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
ret2, th2 = cv2.threshold(sharp, 0,255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
########################### text detection algorithm adaption ######################################
config = r'--oem 3 --psm 6 outputbase digits' # 숫자만
boxes_num = pytesseract.pytesseract.image_to_data(th2, lang='kor+eng', config=config) # 숫자만
for idx, b in enumerate(boxes_num.splitlines()):
'''
숫자를 가리는 알고리즘
'''
if idx != 0: # head를 제외하고 split
b = b.split()
if len(b) == 12: # 객체가 있는것만 뽑아서
if ('.' not in b[11]) and (len(b[11])>=13):
x,y,w,h = int(b[6]),int(b[7]),int(b[8]),int(b[9])
cv2.rectangle(img, (x,y),(x+w,y+h),(255,0,0), -1) # 좌상단, 우하단
cv2.putText(img, b[11], (x,y+25), cv2.FONT_HERSHEY_COMPLEX, fontScale=0.5, color=(0,0,255), thickness=1)
cv2_imshow(img)
dx = cv2.Sobel(th1, -1, 1,0, delta=0) # x방향
dy = cv2.Sobel(th1, -1, 0,1, delta=255) # y방향
dx = cv2.Sobel(th1, cv2.CV_32F, 1,0) # x방향. delta default = 0
dy = cv2.Sobel(th1, cv2.CV_32F, 0,1) # y방향
# 방향상관없이 gradiant 크기 보기
mag = cv2.magnitude(dx, dy)
mag = np.clip(mag, 0, 255).astype(np.uint8)
cv2_imshow(mag)
(Canny detection 순서)
canny = cv2.Canny(th1, 50,150)
cv2_imshow(canny)
mp1 = cv2.dilate(th1, None)
se= cv2.getStructuringElement(cv2.MORPH_RECT, (1,1))
mp2 = cv2.erode(th1, se)
cv2_imshow(mp1)
cv2_imshow(mp2)
se= cv2.getStructuringElement(cv2.MORPH_RECT, (1,2))
mp2 = cv2.erode(th1, se)
cv2_imshow(mp2)
결국 최종후보로 아래의 이미지들이 뽑혔다. 성능이 가장 좋은 것을 테스트해볼 것이다. 시간이 나기를..
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray_img, (1, 1), 0) # kernel size 크게 잡지 않도록 주의
sharp = np.clip(2.0*gray_img - blur, 0, 255).astype(np.uint8)
ret1, th1 = cv2.threshold(blur, 0,255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
ret2, th2 = cv2.threshold(sharp, 0,255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
dx = cv2.Sobel(th1, cv2.CV_32F, 1,0) # x방향. delta default = 0
dy = cv2.Sobel(th1, cv2.CV_32F, 0,1) # y방향
mag = cv2.magnitude(dx, dy) # 방향상관없이
mag = np.clip(mag, 0, 255).astype(np.uint8)
canny = cv2.Canny(th1, 50, 150)
mp1 = cv2.dilate(th2, None)
se= cv2.getStructuringElement(cv2.MORPH_RECT, (1,1))
mp2 = cv2.erode(th1, se)