Section 1. 이동 변환과 전단 변환
1. 기하학적 변환 (Geometrice Transformation)
영상을 구성하는 픽셀의 배치 구조를 변경함으로써 전체 영상의 모양을 바꾸는 작업
![](https://velog.velcdn.com/images%2Fcodren%2Fpost%2F3e1aab63-a233-4ca5-a1d7-c3c59c13dd74%2Fimage.png)
2. 이동 변환 (Translation Transformation)
- 가로 또는 세로 방향으로 영상을 특정 크기만큼 이동시키는 변환
- x축과 y축 방향으로의 이동 변위를 지정
- 어파인 변환 행렬 - 영상이 어떻게 변환될 지에 대한 정보를 담고 있는 행렬
![](https://velog.velcdn.com/images%2Fcodren%2Fpost%2F5d240eb1-9d5c-4d8b-9e28-f112fab76a84%2Fimage.png)
3. 영상의 어파인 변환 함수
- warpAffine() 함수
- warpAffine() 함수 하나로 이동, 전단, 확대, 축소, 회전 변환 모두 수행
![](https://velog.velcdn.com/images%2Fcodren%2Fpost%2Fe9676902-8bf5-473c-8660-9f40f891bc26%2Fimage.png)
- src - 입력 영상
- M - 2x3 어파인 변환 행렬 또는 실수형
- desize - 결과 영상 크기 (w,h) 튜플 (0,0)이면 src와 같은 크기로 설정
- dst - 출력 영상
- flags - 보간법, 기본 값은 cv2.INTER_LINEAR
- borderMode - 가장자리 픽셀 확장 방식, 기본 값은 cv2.BORDER_CONSTRANT
- borderValue - cv2.BORDER_CONSTRANT 일 때 사용할 상수 값, 기본 값은 0
4. 이동 변환 코드 및 결과
![](https://velog.velcdn.com/images%2Fcodren%2Fpost%2F3394e2ae-d828-4a45-9fb3-7a736f027b83%2Fimage.png)
![](https://velog.velcdn.com/images%2Fcodren%2Fpost%2F929394aa-d7a2-432b-927d-998dd4055198%2Fimage.png)
5. 전단 변환 (Shear transformation)
- 층 밀림 변환, x축과 y축 방향에 대해 따로 정의
![](https://velog.velcdn.com/images%2Fcodren%2Fpost%2Fd127daf4-7950-4782-a28b-3345345f3b3e%2Fimage.png)
6. 전단 변환 코드 및 결과
![](https://velog.velcdn.com/images%2Fcodren%2Fpost%2F429b9c7a-618c-472a-9256-2da0b7db3cf3%2Fimage.png)
dst = cv2.warpAffine(src, aff, (w + int(h * 0.5), h)) # 전단 변환 시 짤리는 부분까지 보기위한 코드
# 전단 변환 비율 0.5를 세로크기에 곱한 결과 값을 가로크기에 더함
![](https://velog.velcdn.com/images%2Fcodren%2Fpost%2F1acaf935-4d72-49c5-b70e-f284d8a22ad5%2F%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-05-21%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%204.43.35.png)
Section 2. 크기 변환
1. 크기 변환 (Scale transformation)
- 영상의 크기를 원본 영상보다 크게 (확대) 또는 작게 (축소) 만드는 변환
- x축과 y축 방향으로의 스케일 비율(scale factor) 를 지정
![](https://velog.velcdn.com/images%2Fcodren%2Fpost%2Fff929277-0f72-470d-9dbd-0cce2065cdf4%2Fimage.png)
2. 크기 변환 함수
- warpAffine 함수가 아닌 resize() 함수
![](https://velog.velcdn.com/images%2Fcodren%2Fpost%2F2c9684dc-d80d-4cb6-8f59-8e9c76723512%2Fimage.png)
- src - 입력 영상
- dsize - 결과 영상 크기.(w,h) 튜플 (0,0)이면 fx와 fy 값을 이용하여 결정
- dst - 출력 영상
- fx,fy - x와 y방향 스케일 비율, (dsize 값이 0일 때 유효)
- interpolation - 보간법 지정, 기본값은 cv2.INTER_LINEAR
![](https://velog.velcdn.com/images%2Fcodren%2Fpost%2Faca4eb4a-f044-4825-8476-4ed517d70b04%2Fimage.png)
3. 크기 변환 코드 및 결과
- 480x320 크기의 rose.bmp 영상파일을 1920x1280 크기의 영상파일로 확대 변환
- LINEAR 방식과 LANCZOS4 방식을 비교
![](https://velog.velcdn.com/images%2Fcodren%2Fpost%2F6e900ec3-bfb2-4ec3-9bd1-21d7f4251a50%2Fimage.png)
![](https://velog.velcdn.com/images%2Fcodren%2Fpost%2F66dbe2e3-8f93-4929-bbf7-3c0e6da6c766%2Fimage.png)
Section 3. 이미지 피라미드
1. 이미지 피라미드 (Image pyramid)
- 하나의 영상에 대해 다양한 해상도의 영상 세트를 구성한 것
- 100x100 크기의 고양이를 인식한다고 가정할 때 입력 영상 파일은 다양한 크기로 고양이를 표현할 수도 있으므로 여러 해상도 구간에서 고양이를 인식할 수 있도록 이미지 피라미드 생성함
![](https://velog.velcdn.com/images%2Fcodren%2Fpost%2F81ad3d99-d9bd-48a4-8305-6a2780658048%2Fimage.png)
Section 4. 회전 변환
1. 회전 변환 (Roation Transformation)
- 영상을 특정 각도만큼 회전시키는 변환 (반시계 방향)
![](https://velog.velcdn.com/images%2Fcodren%2Fpost%2Fe13a419e-02c1-4314-a61a-ac2d51c84571%2Fimage.png)
2. 회전 변환 코드 및 결과
![](https://velog.velcdn.com/images%2Fcodren%2Fpost%2Fd8659f9e-fd12-4863-9de6-9479145d3935%2Fimage.png)
- 하지만 영상 파일의 중앙을 기준으로 회전하는 것이 아닌 왼쪽 상단 (0,0)을 기준으로 회전함
![](https://velog.velcdn.com/images%2Fcodren%2Fpost%2Fb1201377-e42c-4afb-925e-9a414f4c5931%2Fimage.png)
3. 회전 변환 행렬 구하는 함수
- getRotationMatrix2D() 함수
- 변환하는 함수가 아닌 어떻게 변환 시킬 지에 대한 정보 (어파인 변환 행렬)를 반환하는 함수
![](https://velog.velcdn.com/images%2Fcodren%2Fpost%2F791752c7-2b23-48bc-a0f8-35e0be4f21a2%2Fimage.png)
- center - 회전 중심 좌표, (x, y) 튜플
- angle - (반시계 방향) 회전 각도(degree), 음수는 시계 방향
- scale - 추가적인 확대 비율
- retval - 2x3 어파인 변환 행렬 또는 실수형
![](https://velog.velcdn.com/images%2Fcodren%2Fpost%2Fd3a91677-2d0e-4bd3-8865-71d2646bbffe%2Fimage.png)
4. 영상 파일 중심 회전 변환 코드 및 결과
- getRotationMatrix2D() 함수의 scale 인자 값에 0.5를 지정하여 0.5배 축소
![](https://velog.velcdn.com/images%2Fcodren%2Fpost%2F6c4adb61-4f84-4636-9137-18c1c95ca091%2F%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-05-21%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%205.14.33.png)
cp = (src.shape[1] / 2, src.shape[0] / 2) # 영상 파일의 중심 좌표를 구하는 코드
![](https://velog.velcdn.com/images%2Fcodren%2Fpost%2F8b7ee4f2-ac83-4739-80f9-5c39f2ecdfc1%2F%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-05-21%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%205.14.14.png)
- 아래의 어파인 행렬로 인한 변환 과정
![](https://velog.velcdn.com/images%2Fcodren%2Fpost%2Fd3a91677-2d0e-4bd3-8865-71d2646bbffe%2Fimage.png)
![](https://velog.velcdn.com/images%2Fcodren%2Fpost%2F3fdc2f55-1472-49e3-bcd0-d0a998868fac%2Fimage.png)