728x90
반응형
기존에 적은 게시물의 연장이라 보면 될 것 같다.
일전에 작성한대로 crop을 한 후, 해당 글자 이미지를 rotation한 후,뒷배경에 쓸데없는 배경값을 추가 크롭해 온전한 글자 영역만 남기는 코드를 설명한다. 아래는 전체 프로세스.
저 게시물에는 안적었지만, cv2관련 cropping코드는 아래와 같다.
# rotated_points Polygon 형태의 list라 가정.
# 해당 polygon에 가장 인접한 box를 (cv2.boundingRect)로 찾아주고, 원본 이미지에서 우선 크롭
x, y, w, h = cv2.boundingRect(np.array(rotated_points).reshape(-1, 2).astype(np.int32))#x,y, w,h
xmin, ymin, xmax, ymax = x, y, x+w, y+h
img = cv2.imread(img_path)
rect_crop = img[ymin:ymax, xmin:xmax].copy()
이때 생성되는 rect_crop은 아래과 같은 형태가 될 것이다.
# 이후, polygon 영역에 맞춰 masking image를 생성해준다.
pts = np.array(rotated_points, np.int32)
pts = pts - pts.min(axis=0)
mask = np.zeros(rect_crop.shape[:2], np.uint8)
cv2.drawContours(mask, [pts], -1, (255, 255, 255), -1, cv2.LINE_AA)
dst = cv2.bitwise_and(rect_crop, rect_crop, mask=mask)
이때 생성되는 dst 는 다음과 같은 형태가 될 것 이다.
# deskew package 내 determine_skew로 angle을 계산해도 되지만,
# 나같은 경우엔 annotation에 적혀있는 회전값(rot)을 직접 넣어 회전함.
gray = cv2.cvtColor(dst, cv2.COLOR_BGR2GRAY)
pred_angle = determine_skew(gray)
crop_img = rotate(dst, (rot), (0, 0, 0))
rotate 함수는 deskew에서 제공(README내 cv2 기반 함수)하는 함수를 사용.
이후 생성된 crop_img가 아래와 같다.
# 이 코드로 zero가 아닌 부분을 대상으로 crop해주면 원본 글자만 남는다.
y_nonzero, x_nonzero, _ = np.nonzero(crop_img)
crop_img = crop_img[np.min(y_nonzero):np.max(y_nonzero), np.min(x_nonzero):np.max(x_nonzero)]
완성.
728x90
반응형
'머신러닝 > Computer Vision' 카테고리의 다른 글
[cv2] image input 3-channel Grayscale (0) | 2023.09.14 |
---|---|
[torch, dataset] Image dataloader with path (0) | 2023.08.31 |
[Python/PIL] 텍스트에 취소선 넣기 (0) | 2023.05.04 |
PIL Image Font 속성 (0) | 2023.04.27 |
RuntimeError: Sizes of tensors must match except in dimension 1. Expected size 16 but got size 15 for tensor number 1 in the list. / CV모델 image input size 조정 (0) | 2023.04.18 |