이미지의 기하학적 변형은 (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)
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 이동
M = 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)
'IT 프로그래밍 관련 > OpenCV' 카테고리의 다른 글
OpenCV Persperctive 2 (마우스로 좌표 찍기) (0) | 2021.04.26 |
---|---|
OpenCV AffineTransform, homography(perspective)Transform (0) | 2021.04.23 |
OpenCV threshold, 이미지형태 변환(dilate,erode, opening, closing) (0) | 2021.04.22 |
OpenCV 비디오파일 열기, 내 캠으로 비디오파일 저장 (0) | 2021.04.21 |
OpenCV Image에 선 그리기 (ImageDraw) (0) | 2021.04.20 |
댓글