본문 바로가기
IT 프로그래밍 관련/OpenCV

OpenCV 이미지 Transformations ( rotation, translation )

by 지나는행인 2021. 4. 22.
728x90

이미지의 기하학적 변형은 (Transformations) 

사이즈 변경(Scaling), 위치변경(Translation), 회전(Rotaion) 등이 있다.

 

변환에 종류에는

  • 강체변환(Ridid-Body) : 크기 및 각도가 보존
  • 유사변환(Similarity) : 크기는 변하고 각도는 보존
  • 선형변환(Linear) : Vector 공간에서의 이동. 이동변환은 제외.
  • Affine : 선형변환과 이동변환까지 포함. 선의 수평성은 유지
  • Perspective : Affine변환에 수평성도 유지되지 않음. 원근변환

등이 있다.

 

크기가 보존되는 변환인 Rotation은 물체를 평면상의 한 점을 중심으로 𝜃 만큼 회전하는 변환이다.

회전은 시계 반대 방향으로 하며,  변환을 시킬 변환행렬이 필요하다.

변환행렬은 Rotation 에서도 사용되지만, 다른 이미지 변형에서도 사용된다.

변환행렬은 

cv2.getRotationMatrix2D() 함수로 만들 수 있다.

 

 

* cv2.getRotationMatrix2D(center, angle, scale) 

 

- center : 이미지의 중심 좌표

- angle : 회전할 각도

- scale factor : 확대 및 축소 (ex) 2는 두배확대 , 0.5는 1/2로 축소

 

 

 

Rotation 코드 예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import cv2
 
source = cv2.imread('data/images/sample.jpg'1)
 
# rotate는 이미지를 회전시킨다.
 
 
# 회원의 중심좌표 
center = ( source.shape[1/ 2, source.shape[0/ 2 ) # row은 y축, columns은 x축
 
rotationAngle = 50
 
#이미지 확대 및 축소
scaleFactor = 1
 
# 변환행렬 만들기                          
rotationMatrix = cv2.getRotationMatrix2D( center, rotationAngle, scaleFactor )  # 중심점, 각도, 확대축소파라미터(1이상은 확대)
 
 
 
# rotate 
result = cv2.warpAffine(source, rotationMatrix, (source.shape[1],source.shape[0]) )
 
cv2.imshow('original', source)
cv2.imshow('rotated', result)
 
cv2.waitKey()
cv2.destroyAllWindows()
cs

* cv2.warpAffine( src, M, dsize )

 

- src : 변환할 이미지

- M : 변환행렬

- dsize : output image size (ex; (width=columns, height=rows)

* 원본 , Rotation 후 변환된 이미지

 

 

 

 

 

Translation 은 이미지의 위치를 변경하는 변환이다.

translation 도 변환행렬을 필요로 하는데

여기서 쓰이는 변환행렬은 

2X3의 이차원로,  [ [ 1, 0 , x축이동 ], [ 0, 1, y축이동 ] ] 형태의 float32 type의 numpy array이다.

축이동 부분에 원하는 만큼만 입력하면, 이미지가 이동한다.

 

 

 

Translation 코드 예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import cv2
import numpy as np
 
img = cv2.imread('data/images/sample.jpg')
 
# img는 ( 512, 512, 3 ) 의 shape를 가짐
rows, cols = img.shape[:2]
 
# 변환 행렬, X축으로 10, Y축으로 20 이동
= np.float32([[1,0,10],[0,1,20]])
 
dst = cv2.warpAffine(img, M,(cols, rows))
 
cv2.imshow('Original', img)
cv2.imshow('Translation', dst)
 
cv2.waitKey(0)
cv2.destroyAllWindows()
 
 
cs

* cv2.warpAffine( src, M, dsize )

 

- src : 변환할 이미지

- M : 변환행렬

- dsize : output image size (ex; (width=columns, height=rows)

* 원본 , Translation 후 변환된 이미지

댓글