안녕하세요! 오늘은 앞서 배운 변환 행렬만으로는 구현하기 어려운 비선형 변환, 즉 이미지 리매핑(Remapping)과 렌즈 왜곡(Lens Distortion) 효과에 대해 알아보겠습니다.
이미지의 픽셀을 규칙성 없이 자유롭게 옮기거나, 볼록 렌즈로 본 것처럼 뒤트는 기법들은 특수 효과뿐만 아니라 카메라의 렌즈 오차를 바로잡는 데에도 필수적으로 사용됩니다.
1. 리매핑(Remapping)이란?
리매핑은 이미지의 픽셀을 특정 규칙이나 수식에 따라 새로운 좌표로 재배치하는 과정입니다. OpenCV에서는 cv2.remap() 함수를 사용합니다.
🛠️ cv2.remap() 핵심 파라미터
- mapx, mapy: 각 픽셀이 이동할 X좌표와 Y좌표를 담은 행렬입니다. 입력 이미지와 크기가 같아야 하며 float32 타입이어야 합니다.
- interpolation: 픽셀을 옮긴 후 빈 공간을 채우는 보간법 알고리즘입니다.
Tip: 매핑 배열을 초기화할 때 for문을 돌리면 매우 느립니다. 대신 np.indices()를 사용하면 고속으로 초기화가 가능합니다.
📍 리매핑을 활용한 이미지 뒤집기 예제
import cv2
import numpy as np
img = cv2.imread('yeosu.jpg')
rows, cols = img.shape[:2]
# 매핑 배열 초기화 (np.indices 이용)
mapy, mapx = np.indices((rows, cols), dtype=np.float32)
# 좌표 뒤집기 연산 (상하좌우 반전)
mapx = cols - mapx - 1
mapy = rows - mapy - 1
# 리매핑 적용
dst = cv2.remap(img, mapx, mapy, cv2.INTER_LINEAR)
cv2.imshow('Remap Flip', dst)
cv2.waitKey(0)
2. 오목 렌즈와 볼록 렌즈 왜곡
렌즈 효과를 주기 위해서는 우리가 흔히 쓰는 **직교 좌표계(x, y)**를 **극좌표계(r, θ)**로 변환해야 합니다. 이미지의 중앙을 원점(0,0)으로 잡고, 중심으로부터의 거리($r$)를 조절하면 렌즈 효과가 나타납니다.
- 볼록 렌즈: 중심부의 거리($r$)를 지수 함수를 통해 확대합니다.
- 오목 렌즈: 중심부의 거리를 축소합니다.
📍 렌즈 왜곡 핵심 로직
# 1. 좌표 정규화 (-1 ~ 1 사이 값으로 변경)
mapx = 2 * mapx / (cols - 1) - 1
mapy = 2 * mapy / (rows - 1) - 1
# 2. 직교 좌표를 극좌표로 변환
r, theta = cv2.cartToPolar(mapx, mapy)
# 3. 왜곡 지수(exp) 적용 (exp > 1: 볼록, exp < 1: 오목)
r[r < 1] = r[r < 1] ** exp
# 4. 다시 직교 좌표로 변환 후 리매핑
mapx, mapy = cv2.polarToCart(r, theta)
3. 방사 왜곡 (Radial Distortion)
카메라 렌즈의 특성상 이미지 가장자리가 휘어지는 현상을 말합니다.
- 배럴 왜곡(Barrel Distortion): 가장자리가 볼록하게 튀어나오는 왜곡입니다. (광각 렌즈에서 주로 발생)
- 핀쿠션 왜곡(Pincushion Distortion): 가장자리가 안쪽으로 오목하게 들어가는 왜곡입니다. (망원 렌즈에서 주로 발생)
이를 보정하기 위해 사용하는 수식은 다음과 같습니다.

여기서 k1, k2, k3 계수값에 따라 왜곡의 종류와 강도가 결정됩니다.
🛠️ 핵심 요약 가이드
- 리매핑: cv2.remap은 변환 행렬로 표현할 수 없는 비선형적인 픽셀 이동을 가능하게 합니다.
- 좌표계 변환: 렌즈 왜곡을 구현할 때는 cv2.cartToPolar를 통해 원점 중심의 거리 기반 연산을 수행하는 것이 유리합니다.
- 왜곡 보정: 배럴/핀쿠션 왜곡 수식을 리매핑과 결합하면 카메라 렌즈로 인해 발생하는 이미지 왜곡을 정교하게 바로잡을 수 있습니다.
반응형
'컴퓨터 과학 > 👀 컴퓨터 비전' 카테고리의 다른 글
| 📸 [OpenCV 기초] 모자이크, 리퀴파이, 왜곡 거울 실습 완벽 정리 (0) | 2026.01.07 |
|---|---|
| 📸 [OpenCV 기초] 이미지 이동, 확대/축소, 회전 완벽 정리 (0) | 2026.01.07 |
| 📸 [OpenCV 기초] 이미지 유사도 비교부터 모션 감지 CCTV까지 실습 완벽 정리 (0) | 2026.01.07 |
| 📸 [OpenCV 기초] 2차원 히스토그램과 역투영(Back Projection) 완벽 정리 (0) | 2026.01.07 |
| 📊 [OpenCV 기초] 히스토그램과 화질 개선 (정규화, 평탄화, CLAHE) (0) | 2026.01.07 |