안녕하세요! 오늘은 영상 처리의 기본 중의 기본인 기하학적 변환(Geometric Transformation), 즉 이미지를 옮기고(이동), 키우고(확대/축소), 돌리는(회전) 방법에 대해 알아보겠습니다.
이미지를 변형할 때는 변환 행렬(Transformation Matrix)이라는 개념이 사용되는데, OpenCV 함수를 활용하면 복잡한 수학식 없이도 간단하게 구현할 수 있습니다.
1. 이미지 이동 (Translation)
이미지 이동은 원래 있던 좌표에 이동시키려는 거리만큼 더해주는 작업입니다. 이를 위해 2 x 3 변환 행렬을 사용합니다.
OpenCV의 cv2.warpAffine() 함수를 사용하면 이 변환 행렬을 기반으로 이미지를 평행 이동시킬 수 있습니다.
📍 평행 이동 예제 코드
import cv2
import numpy as np
img = cv2.imread('fish.jpg')
rows, cols = img.shape[:2]
# 이동할 거리 (x축 100, y축 50)
dx, dy = 100, 50
# 2x3 변환 행렬 생성 (float32 타입 필수)
mtrx = np.float32([[1, 0, dx],
[0, 1, dy]])
# 이미지 변환 (이미지, 변환행렬, 결과이미지크기)
# 외곽 영역을 파란색(255, 0, 0)으로 보정하는 옵션 포함
dst = cv2.warpAffine(img, mtrx, (cols+dx, rows+dy), None,
cv2.INTER_LINEAR, cv2.BORDER_CONSTANT, (255, 0, 0))
cv2.imshow('Translation', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
2. 이미지 확대 및 축소 (Scaling)
이미지 크기를 변경할 때는 픽셀 사이의 값을 어떻게 채울지 결정하는 보간법(Interpolation)이 중요합니다.
OpenCV에서는 변환 행렬을 직접 만들 수도 있지만, cv2.resize() 함수를 쓰는 것이 훨씬 간편합니다.
- 축소 시: cv2.INTER_AREA 권장 (속도가 빠르고 부드러움)
- 확대 시: cv2.INTER_CUBIC 또는 cv2.INTER_LINEAR 권장 (화질 중심)
📍 확대 및 축소 예제 코드
import cv2
img = cv2.imread('fish.jpg')
height, width = img.shape[:2]
# 1. 크기를 직접 지정해서 축소 (0.5배)
dst1 = cv2.resize(img, (int(width*0.5), int(height*0.5)), interpolation=cv2.INTER_AREA)
# 2. 배율을 지정해서 확대 (2배)
dst2 = cv2.resize(img, None, None, fx=2, fy=2, interpolation=cv2.INTER_CUBIC)
cv2.imshow('Small', dst1)
cv2.imshow('Big', dst2)
cv2.waitKey(0)
3. 이미지 회전 (Rotation)
이미지 회전 행렬은 삼각함수가 들어가기 때문에 직접 계산하기 매우 까다롭습니다. 특히 회전 축이 이미지의 중앙이 아닐 경우 프레임 밖으로 이미지가 벗어나기도 합니다.
이를 해결하기 위해 OpenCV는 회전 중심과 각도, 배율만 입력하면 변환 행렬을 자동으로 구해주는 cv2.getRotationMatrix2D() 함수를 제공합니다.
📍 이미지 회전 예제 코드
import cv2
img = cv2.imread('fish.jpg')
rows, cols = img.shape[:2]
# 회전 변환 행렬 구하기
# 중심점: 이미지 중앙, 각도: 45도(반시계 방향), 배율: 1.0
mtrx = cv2.getRotationMatrix2D((cols/2, rows/2), 45, 1.0)
# 변환 행렬 적용
dst = cv2.warpAffine(img, mtrx, (cols, rows))
cv2.imshow('Rotation', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
🛠️ 핵심 요약 가이드
- 변환 행렬: 모든 기하학적 변환은 행렬 연산을 통해 이루어지며, 데이터 타입은 반드시 np.float32여야 합니다.
- 보간법(Interpolation): 이미지를 늘리거나 줄일 때 픽셀을 어떻게 채우느냐에 따라 화질이 달라집니다. 목적에 맞는 플래그를 선택하십시오.
- 편의 함수: 이동과 회전을 동시에 하거나 복잡한 축 계산이 필요할 때는 cv2.getRotationMatrix2D()를 활용하는 것이 가장 효율적입니다.
🚀 마치며
이미지 이동, 크기 조절, 회전은 영상 인식이나 정합(Registration) 작업에서 데이터를 정렬하기 위한 필수 전처리 단계입니다. 기초적인 행렬의 원리를 이해하면 나중에 배울 더 복잡한 변환들도 쉽게 익히실 수 있습니다.
궁금하신 점은 댓글로 남겨주시기 바랍니다. :)
'컴퓨터 과학 > 👀 컴퓨터 비전' 카테고리의 다른 글
| 📸 [OpenCV 기초] 모자이크, 리퀴파이, 왜곡 거울 실습 완벽 정리 (0) | 2026.01.07 |
|---|---|
| 📸 [OpenCV 기초] 리매핑(Remapping)과 렌즈 왜곡(Distortion) 완벽 정리 (0) | 2026.01.07 |
| 📸 [OpenCV 기초] 이미지 유사도 비교부터 모션 감지 CCTV까지 실습 완벽 정리 (0) | 2026.01.07 |
| 📸 [OpenCV 기초] 2차원 히스토그램과 역투영(Back Projection) 완벽 정리 (0) | 2026.01.07 |
| 📊 [OpenCV 기초] 히스토그램과 화질 개선 (정규화, 평탄화, CLAHE) (0) | 2026.01.07 |