본문 바로가기
OpenCV

OpenCV - 어파인 변환 및 투상 변환

by winston1214 2020. 10. 10.
반응형

어파인 변환이란 영상을 구성하는 픽셀의 배치 구조를 변경함으로써 평행 이동, 확대 및 축소, 회전 등 전체 영상의 모양을 바꾸는 기하학적 변환이라고 정의한다.

affine matrix

왼쪽의 그림은 Affine Matrix이다. 이를 적용하기 위해선 이미지의 3가지의 점을 알아야한다.(a,b,c)

일단 코드로 설명을 하겠다.

img = cv2.imread('img/input.jpg')
rows,cols = img.shape[:2]
src_points = np.float32([[0,0],[cols-1,0],[0,rows-1]]) # source points
dst_points = np.float32([[0,0],[int(0.6*(cols-1)),0],[int(0.4*(cols-1)),rows-1]]) # destination points
affine_matrix = cv2.getAffineTransform(src_points,dst_points) # mapping
img_output = cv2.warpAffine(img,affine_matrix,(cols,rows))
cv2.imshow('input',img)
cv2.imshow('output',img_output)
cv2.waitKey()
cv2.destroyAllWindows()

affine Transformation

src -> des img로 넘어갈 때의 각 포인트들을 정해주고 이를 getAffineTransform 함수를 사용하여 mapping을 해준다.

그리고 wrapAffine으로 이동해준다.

output

또한 이를 통해서 미러 사진을 얻을 수 있는데

# mirror
fig,axes = plt.subplots(1,2,figsize=(8,8))
img = cv2.imread('img/input.jpg')
rows,cols = img.shape[:2]
src_points = np.float32([[0,0],[cols-1,0],[0,rows-1]])
dst_points = np.float32([[cols-1,0],[0,0],[cols-1,rows-1]])

affine_matrix = cv2.getAffineTransform(src_points,dst_points) # mapping
img_output = cv2.warpAffine(img,affine_matrix,(cols,rows))
axes[0].imshow(cv2.cvtColor(img,cv2.COLOR_BGR2RGB))
axes[0].set(title = 'input')
# cv2.imshow('input',img)
axes[1].imshow(cv2.cvtColor(img_output,cv2.COLOR_BGR2RGB))
# cv2.imshow('output',img_output)
axes[1].set(title = 'output')
plt.show()

src_points와 dst points를 조절하면 된다.

mirror

- 투상변환

투상변환은 쉽게 말하면 시점의 변화이다. 종이를 있는 그대로 본다면 사각형이지만 종이를 조금 기울여서 본다면 이는 부등사각형이 된다. 투상변환은 크기나 각도를 유지하진 않지만, Incidence와 cross-ration을 유지한다.

 

fig,axes = plt.subplots(1,2,figsize=(8,8))
img = cv2.imread('img/input.jpg')
rows,cols = img.shape[:2]
src_points = np.float32([[0,0],[cols-1,0],[0,rows-1],[cols-1,rows-1]])
dst_points = np.float32([[0,0],[cols-1,0],[int(0.33*cols),rows-1],[int(0.66*cols),rows-1]])

projective_matrix = cv2.getPerspectiveTransform(src_points,dst_points) # 제어점들을 변환 # 투상 변환
img_output = cv2.warpPerspective(img,projective_matrix,(cols,rows)) 

axes[0].imshow(cv2.cvtColor(img,cv2.COLOR_BGR2RGB))
axes[0].set(title = 'input')
axes[1].imshow(cv2.cvtColor(img_output,cv2.COLOR_BGR2RGB))
axes[1].set(title = 'output')
plt.show()

 

 Affine 변환과 비슷하게 point들을 지정해주고 getPerspectiveTransform을 통해 투상 변환 행렬화 시킨다. 그리고 이를 warpPerspective를 통해 적용시킨다.

output

fig,axes = plt.subplots(1,2,figsize=(8,8))
img = cv2.imread('img/input.jpg')
rows,cols = img.shape[:2]
src_points = np.float32([[0,0],[0,rows-1],[cols/2,0],[cols/2,rows-1]])
dst_points = np.float32([[0,100],[0,rows-101],[cols/2,0],[cols/2,rows-1]])

projective_matrix = cv2.getPerspectiveTransform(src_points,dst_points) # 제어점들을 변환 # 투상 변환
img_output = cv2.warpPerspective(img,projective_matrix,(cols,rows)) 

axes[0].imshow(cv2.cvtColor(img,cv2.COLOR_BGR2RGB))
axes[0].set(title = 'input')
axes[1].imshow(cv2.cvtColor(img_output,cv2.COLOR_BGR2RGB))
axes[1].set(title = 'output')
plt.show()

포인트들을 바꿔서 다음과 같은 결과도 얻어낼 수 있다.

 

반응형

'OpenCV' 카테고리의 다른 글

Ubuntu 18.04 OpenCV 3.2 설치  (0) 2020.10.24
OpenCV - Image Warpping  (0) 2020.10.11
OpenCV - 이미지 사이즈 변환 및 보간법  (0) 2020.10.10
OpenCV - 이미지의 이동 및 회전  (0) 2020.10.10
cv2.imshow를 matplotlib로 구현  (0) 2020.09.03

댓글