이전 포스팅에서, 이미지 변환(회전)에 대해서 알아보았는데요, 영상처리에서 가장 중요한 부분이기도 하기 때문에 따로 포스팅을 해두었습니다.
이미지 회전에서는 어파인(Affine) 변환과 투시(Perspective) 변환을 사용합니다.
어파인 변환은 원본 모양 및 비율을 유지하거나 사각형의 모양(사다리꼴 형태가 아닌)으로 변환을 뜻합니다.
어파인 변환은 행렬 값으로 변환 시킬 수 있는데 이 때, 변환된 수치를 나타내주는 행렬(변환 행렬)은 2x3 형태로 나타날 수 있습니다.
(일반 사각형 모양을 유지해주기 때문에, 우리는 점 3개의 변화량만 알면 되기 때문)
투시 변환은 다음과 같이 변환을 하면서 평행사변형이나 사다리꼴 형태로 변환이 되는 것을 뜻합니다.
투시 변환은 행렬 값으로 변환 시킬 때, 3x3 행렬의 형태로 나타날 수 있습니다.
(일반 사각형 모양이 아니기 때문에, 우리는 점 4개의 변화량을 다 알아야 함. 8개의 값을 알아야 하기 때문에, 변환 행렬은 3x3행렬 사용)
사실, 우리는 정확한 이론은 몰라도 됩니다. 행렬이 어떻게 구성되고 어떻게 표현되는지 모르셔도 상관 없습니다. (open cv에서 제공 되는 함수를 사용할 것이기 때문)
그냥 어파인 변환은 언제 쓰이고, 투시 변환은 언제 쓰이는지만 알면 됩니다.
그럼 혹시라도, 원본 이미지를 특정한 모양으로 변환 시켜주거나, 변환된 이미지를 원본으로 되돌리고 싶을 때 변환행렬 값을 알아야 되는데요...
어파인 변환이 일어났다면, cv2.getAffineTransform 으로 변환행렬을 구하면 되고,
투시 변환이 일어났다면, cv2.getPerspectiveTransform 으로 변환행렬을 구하면 됩니다.
cv2.getAffineTransform 함수를 사용하여 변환행렬을 알기 위해서는, 3개의 원본 좌표(3x2행렬)과 3개의 변화될 좌표(3x2행렬)를 알면 됩니다.
cv2.getAffineTransform(원본 좌표(3x2행렬), 변화될 좌표(3x2행렬))
cv2.getPerspectiveTransform 함수도 마찬가지로 변환행렬을 알기 위해서는, 4개의 원본 좌표(3x3행렬)과 4개의 변화될 좌표(3x3행렬)를 알면 됩니다.
cv2.getPerspectiveTransform (원본 좌표(3x3행렬), 변화될 좌표(3x3행렬))
변환 행렬을 알았다면, 우리는 변환행렬에 맞게 영상을 회전시킬 수가 있는데요.. 이 때 사용할 수 있는 함수는
wrapAffine 함수와, wrapPerspective 함수입니다.
wrapAffine 함수는 이전 포스팅에서 말씀 드렸다시피, cv2.warpAffine(원본 이미지, 변환 행렬(2x3), (width, height))) 로 나타내면 됩니다.
그러면 원본 이미지가 변환행렬에 나와있는 행렬값에 따라서 지정된 너비와 높이갚으로 이미지를 변환 시켜줍니다.
wrapPerspective 도 마찬가지로 cv2.wrapPerspective(원본 이미지, 변환 행렬(3x3), (width, height))) 을 사용해주면 됩니다.
마찬가지로, 원본 이미지가 변환행렬에 나와있는 행렬값에 따라서 지정된 너비와 높이갚으로 이미지를 변환 시켜줍니다.
코드 예제를 통해서 확인해보도록 하겠습니다.
실습에 사용할 이미지는 다음과 같습니다. 이미지를 다운 받으셔서 실습 환경에 저장 시켜두면 됩니다.
설명한 내용 토대로, 사진에서 실전 딥러닝 책만 추출하여 반듯한 이미지로 나타내보도록 하겠습니다.
import cv2
import numpy as np
img = cv2.imread('text_book.jpg')
w = 300
h = 400
location = np.array([[723, 477], [976, 374], [1177, 722], [908, 855]], np.float32)
location2 = np.array([[0, 0], [w, 0], [w, h], [0, h]], np.float32)
pers = cv2.getPerspectiveTransform(location, location2)
dst = cv2.warpPerspective(img, pers, (w,h))
cv2.imshow('origin', img)
cv2.imshow('result', dst)
cv2.waitKey()
결과 값은 다음과 같습니다.
'AI > OpenCV-실습' 카테고리의 다른 글
OpenCV - 실습 (이미지 스캐너 만들기) (0) | 2020.09.04 |
---|---|
OpenCV - 실습 (0) | 2020.09.03 |
OpenCV - 영상(이미지) 다루기(8)_(이미지 변환) (0) | 2020.09.03 |
OpenCV - 영상(이미지) 다루기(7)_(트랙바 사용) (0) | 2020.09.03 |
OpenCV - 영상(이미지) 다루기(6)_(마우스 함수) (1) | 2020.09.02 |