OpenCV 비전 실무14장 · 영상 기하학 변환과 Affine, Perspective7 / 21← 이전목차다음 →MetaContents

14장. 영상 기하학 변환과 Affine, Perspective

뒤집기와 90도 돌리기

투명한 필름에 그린 그림을 뒤집어 보면 왼쪽과 오른쪽이 바뀝니다. 위아래로 뒤집으면 위와 아래가 바뀌고, 두 번 다 하면 거꾸로 선 그림이 됩니다. 필름을 책상 위에서 시계 방향으로 한 번 돌리면 90도 돌린 그림이 됩니다. 이런 변환은 칸을 버리지도 새로 만들지도 않고 자리만 바꿉니다.

flipCode 1, 0, -1 과 cv2.rotate 의 네 가지 결과를 견준 비교 그림

그림의 네 상자는 cv2.flip 의 세 가지 번호(flipCode)와 cv2.rotate 입니다. 여기서 필름을 옆으로 뒤집는 것이 flipCode=1, 위아래로 뒤집는 것이 flipCode=0, 둘 다 하는 것이 flipCode=-1, 책상 위에서 돌리는 것이 cv2.rotate 입니다.

모눈 그림의 원본, 좌우 뒤집기, 위아래 뒤집기, 둘 다 뒤집기, 시계 방향 90도 돌리기 결과

글자 F 를 보면 뒤집기가 잘 보입니다. 좌우로 뒤집으면 F 가 왼쪽을 보고, 위아래로 뒤집으면 가로줄이 아래로 갑니다. 둘 다 뒤집은 그림은 180도 돌린 것과 같습니다. 90도 돌린 그림은 가로와 세로가 바뀌어 240×320 이 되었습니다.

뒤집기와 돌리기 견주기

하는 일OpenCVNumPy 로 같은 일결과 크기 (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 이면 시계 방향으로 한 번입니다.

짧은 예시

Python
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

주의할 점

  • 글자가 있는 사진(표지판, 문서)을 좌우로 뒤집으면 글자가 거울 글씨가 됩니다. 16장의 데이터 증강에서 뒤집기를 쓸 때는 뒤집어도 뜻이 바뀌지 않는 사진인지 먼저 봅니다.
  • img[:, ::-1] 은 원본을 보는 창(4장의 뷰)이라 고치면 원본도 바뀝니다. 따로 쓰려면 .copy() 를 붙이거나 cv2.flip 을 씁니다.
  • 90도 돌린 그림은 가로와 세로가 바뀝니다. 다른 그림과 cv2.hconcat 으로 붙일 때 높이가 맞지 않을 수 있습니다.
← 이전 절14장 · 자르기와 크기 맞추기다음 절 →14장 · 옮기기와 아핀 변환의 짜임