다음과 같이 문장이 있는 image가 존재할 때, 문장 안에 있는 space(띄어 쓰기)마다 단어를 잘라 저장하고 싶을 때.
차례대로 순서를 나열하자면,
1) 글자의 굵기를 늘린다.
2) 겹쳐진 글자를 하나의 단어 뭉치로 본다.
3) cv2의 Contour찾는 함수로 단어들을 찾아낸다.
4) boundingRect값으로 기존 이미지를 단어 단위로 잘라내기
+) cv2상 Contour 찾는거는 검은 배경에서 흰색 물건을 찾는거라 생각하면 간단 => 따라서, 찾고자 하는 글자를 흰색, 배경을 검게 해야 함 => 그렇기 때문에 배경이 없는 png는 곤란함
cv2만을 사용하지만 PIL은 내가 따로 사용하려고, plt는 jupyter notebook에서 확인하기 위해서 import했다.
import cv2
import numpy as np
from PIL import Image, ImageDraw
from matplotlib import pyplot as plt
이미지를 로드하고, cvtColor로 이미지의 컬러 타입을 변경하고, threshold로 바이너리 이미지로 전환한다.
여기까지 하고 이미지를 확인해보면 다음과 같다.
image = cv2.imread("./text.jpg", cv2.COLOR_BGR2GRAY)
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(gray,127,255,cv2.THRESH_BINARY_INV)
plt.imshow(thresh)
그 다음에 kernel size를 정해준 후, cv2로 글자를 확장해줘야 한다.
kernel 사이즈의 경우 임의대로 정해도 되지만, 나같은 경우엔 문장 image의 사이즈를 측정해서 width를 height로 나눈 후, 임의로 15를 더해주었다.
h, w, c = image.shape
kernel_size = w//h+15
kernel = np.ones((kernel_size, kernel_size), np.uint8)
img_dilation = cv2.dilate(thresh, kernel, iterations=1)
plt.imshow(img_dilation)
이렇게 진행하고 이미지를 찍어보면 다음과 같다.
글자들의 굵기가 굵어지면서 띄어쓰기를 제외하고 일반적인 단어들은 겹치게 된다.
그러면 이 겹쳐진 글자들을 하나의 단어로 보고 자르기 시작한다.
단어들을 탐지하는 함수는 cv2의 findContour를 사용한다.
#find contours
contours, hierarchy = cv2.findContours(img_dilation.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
#sort contours as coordinate "x"
sorted_ctrs = sorted(contours, key=lambda ctr: cv2.boundingRect(ctr)[0])
이후, for문으로 잘려나간 컨투어 값들을 확인해보면 다음과 같이 잘린 단어들을 확인할 수 있다.
for i, ctr in enumerate(sorted_ctrs):
# Get bounding box
x, y, w, h = cv2.boundingRect(ctr)
print(x, y, w, h)
# Getting ROI
roi = image[y:y+h, x:x+w]
# # show ROI
cv2.imwrite('./sample/segment_%d.jpg'%i, roi)
cv2.waitKey(0)
참고 : https://stackoverflow.com/questions/50713398/detecting-spaces-between-characters-in-ocr-opencv
'머신러닝 > Computer Vision' 카테고리의 다른 글
[OpenCV] 이미지 내 글자 탐지, 글자 삭제(배경 컬러로 합성) (0) | 2022.04.12 |
---|---|
[cv2/PIL] png 이미지 jpg로 변경 (0) | 2022.03.30 |
[OpenCV] 강좌 참고 사이트 (0) | 2022.03.30 |
[PIL] Image.open 이미지가 자동으로 돌아갈 때 / ImageOps.exif_transpose (0) | 2022.03.30 |
[PIL/python] 이미지 합성하기/ how to paste rotated image(with turn black background as transparent) by PIL (0) | 2022.03.18 |