728x90
영상에서 글자 인식을 위한 OCR 프로젝트를 하면서 전처리 과정에서 가장 잘 썼던 두 변환에 대해 정리하고자 한다.
1. Affine Transform
: 영상의 이동, 전단, 확대, 회전을 조합할 때 직사각형이 평행사변형으로 변환이다. 쉽게 말하면 회전, 평행 이동, 스케일링, 반전까지 모두 포함한 변환이다. affine transform은 선의 평행성이 유지 되면서 변환된다.
Affine 변환을 하기 위해 매칭되는 3개의 점(pts1, pts2)이 있어야만 변환 행렬을 구할 수 있다. 이 점 3개의 이동 정보를 통해 마지막 점의 위치를 유추할 수 있게 된다.
cv2.getAffineTransform을 통해 변환 행렬을 구한 후 cv2.warpAffine으로 변환 행렬을 img에 적용 시켜주면 된다.
이는 반대의 변환도 가능하다.
import cv2
import numpy as np
img = cv2.imread('sample_image.jpg')
row, col, ch = img.shape
pts1 = np.float32([[100,100],[400,100],[200,200]])
pts2 = np.float32([[100,300],[400,200],[200,400]])
M = cv2.getAffineTransform(pts1, pts2)
dst = cv2.warpAffine(img, M, (col,row))
위 코드를 실행시키면 아래와 같이 원본 이미지에서 평행 이동 된 결과를 확인할 수 있다.
2. Perspective Transform
perspective 변환은 원근 변환으로 선의 성질은 유지가 되지만 선의 평행성은 유지되지 않는 변환이다. 원근 변환은 점 4개의 이동으로 perspective 행렬을 구할 수 있다.
이 4개의 매칭점으로 cv2.getPerspectiveTransform을 통해 변환 행렬을 구한 후 cv2.warpPerspective으로 변환 행렬을 img에 적용 해 주면 된다.
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('images/perspective.jpg')
# 4개의 좌표는 좌상단->좌하단->우상단->우하단 순서
pts1 = np.float32([[500,1000],[200,1500],[1000,1000],[1200,1500]])
pts2 = np.float32([[10,10],[10,1000],[1000,10],[1000,1000]])
M = cv2.getPerspectiveTransform(pts1, pts2)
dst = cv2.warpPerspective(img, M, (1100,1100))
위 코드를 실행 시키면 아래와 같은 변환 된 이미지의 결과를 얻을 수 있다.
728x90