14장. 영상 기하학 변환과 Affine, Perspective
뒤집기와 90도 돌리기
투명한 필름에 그린 그림을 뒤집어 보면 왼쪽과 오른쪽이 바뀝니다. 위아래로 뒤집으면 위와 아래가 바뀌고, 두 번 다 하면 거꾸로 선 그림이 됩니다. 필름을 책상 위에서 시계 방향으로 한 번 돌리면 90도 돌린 그림이 됩니다. 이런 변환은 칸을 버리지도 새로 만들지도 않고 자리만 바꿉니다.
그림의 네 상자는 cv2.flip 의 세 가지 번호(flipCode)와 cv2.rotate 입니다. 여기서 필름을 옆으로 뒤집는 것이 flipCode=1, 위아래로 뒤집는 것이 flipCode=0, 둘 다 하는 것이 flipCode=-1, 책상 위에서 돌리는 것이 cv2.rotate 입니다.
글자 F 를 보면 뒤집기가 잘 보입니다. 좌우로 뒤집으면 F 가 왼쪽을 보고, 위아래로 뒤집으면 가로줄이 아래로 갑니다. 둘 다 뒤집은 그림은 180도 돌린 것과 같습니다. 90도 돌린 그림은 가로와 세로가 바뀌어 240×320 이 되었습니다.
뒤집기와 돌리기 견주기
| 하는 일 | OpenCV | NumPy 로 같은 일 | 결과 크기 (320×240 그림) |
|---|---|---|---|
| 좌우 뒤집기 | cv2.flip(img, 1) | img[:, ::-1] | 320×240 |
| 위아래 뒤집기 | cv2.flip(img, 0) | img[::-1, :] | 320×240 |
| 둘 다(180도) | cv2.flip(img, -1) 또는 cv2.rotate(img, cv2.ROTATE_180) | img[::-1, ::-1] | 320×240 |
| 시계 방향 90도 | cv2.rotate(img, cv2.ROTATE_90_CLOCKWISE) | np.rot90(img, k=-1) | 240×320 |
| 반시계 방향 90도 | cv2.rotate(img, cv2.ROTATE_90_COUNTERCLOCKWISE) | np.rot90(img, k=1) | 240×320 |
[::-1] 은 슬라이싱의 걸음을 -1 로 주어 끝에서부터 거꾸로 읽는 꼴입니다. rot90 은 rotate 90(90도 돌리기)이고, k 는 반시계 방향으로 돌릴 횟수입니다. -1 이면 시계 방향으로 한 번입니다.
짧은 예시
import cv2
import numpy as np
img = cv2.imread("ch14_grid.png")
# flipCode: 1 은 좌우, 0 은 위아래, -1 은 둘 다
lr = cv2.flip(img, 1)
ud = cv2.flip(img, 0)
# NumPy 의 거꾸로 슬라이싱과 숫자가 똑같다
print(np.array_equal(lr, img[:, ::-1]), np.array_equal(ud, img[::-1])) # 결과: True True
# ROTATE_90_CLOCKWISE: 시계 방향(clockwise)으로 90도. 가로와 세로가 바뀐다
cw = cv2.rotate(img, cv2.ROTATE_90_CLOCKWISE)
print(img.shape, "→", cw.shape) # 결과: (240, 320, 3) → (320, 240, 3)
print(np.array_equal(cw, np.rot90(img, k=-1))) # 결과: True