Radial 왜곡의 개념
카메라 렌즈로 인해 발생하는 가장 일반적인 왜곡 중 하나가 Radial 왜곡이다. 이는 렌즈의 중심에서 멀어질수록 빛이 굴절되는 특성으로 인해, 직선이 곡선처럼 보이게 되는 현상이다. 이 왜곡은 주로 두 가지 형태로 나타난다:
- 배럴 왜곡(Barrel Distortion): 이미지의 가장자리가 외부로 팽창하는 형태의 왜곡.
- 핀쿠션 왜곡(Pincushion Distortion): 이미지의 가장자리가 안쪽으로 움푹 들어가는 형태의 왜곡.
Radial 왜곡은 렌즈의 특성에 따라 다른 비율로 발생하며, 이러한 왜곡을 보정하기 위해 수학적 모델을 적용한다.
Radial 왜곡의 수학적 모델
Radial 왜곡을 보정하기 위해 왜곡된 이미지 좌표를 실제 이미지 좌표로 변환하는 수학적 관계식을 정의한다. 이를 위해 보통 몇 가지 주요 변수들을 도입한다:
- \mathbf{x}_{\text{ideal}} = (x_{\text{ideal}}, y_{\text{ideal}}): 보정된, 즉 이상적인 좌표
- \mathbf{x}_{\text{distorted}} = (x_{\text{distorted}}, y_{\text{distorted}}): 왜곡된 좌표
- k_1, k_2, k_3: Radial 왜곡 계수
Radial 왜곡은 보통 다음과 같은 비선형 방정식으로 표현된다:
여기서 r은 이미지 중심으로부터의 거리로 정의된다:
이 방정식은 Radial 왜곡을 반영한 것으로, k_1, k_2, k_3 계수들이 왜곡의 정도를 나타낸다. 배럴 왜곡과 핀쿠션 왜곡은 이 계수들의 부호와 크기에 따라 결정된다. 배럴 왜곡은 k_1 > 0일 때 발생하며, 핀쿠션 왜곡은 k_1 < 0일 때 발생한다.
보정 절차
Radial 왜곡 보정 절차는 왜곡된 좌표 \mathbf{x}_{\text{distorted}}를 보정된 좌표 \mathbf{x}_{\text{ideal}}로 변환하는 과정이다. 이를 위해 보정 알고리즘은 다음과 같은 방식으로 동작한다.
- 왜곡된 좌표 \mathbf{x}_{\text{distorted}}에서 r 값을 계산한다.
- 계산된 r 값을 이용해 왜곡 계수 k_1, k_2, k_3에 따라 보정할 정도를 결정한다.
- 보정된 좌표 \mathbf{x}_{\text{ideal}}을 계산한다.
이 과정은 반복적으로 이루어지며, 보정된 좌표가 원하는 수준의 정확성을 가질 때까지 최적화된다. 보정 알고리즘은 비선형 최적화 문제로 변환되며, 이를 해결하기 위해 여러 최적화 기법이 사용된다.
Radial 왜곡 보정 알고리즘
Radial 왜곡 보정은 수학적 모델을 바탕으로 실제 이미지에서 이상적인 좌표를 찾아내는 과정이다. 이를 구현하기 위해 비선형 최적화 방법을 적용하여 왜곡 계수를 추정하고 보정한다. 이 과정에서 일반적으로 사용되는 알고리즘은 다음과 같다.
1. 이미지 좌표 정규화
이미지 좌표는 일반적으로 픽셀 좌표계에서 표현되지만, 왜곡 보정을 위해 좌표를 카메라의 이미지 평면으로 변환하는 정규화(normalization) 과정이 필요하다. 이를 통해 보정 과정에서 스케일 문제를 해결할 수 있다. 정규화된 좌표 \mathbf{x}_{\text{norm}}는 다음과 같이 정의된다:
여기서 c_x, c_y는 카메라 중심(Principal point), f_x, f_y는 카메라의 초점 거리(Focal length)이다.
2. Radial 왜곡 방정식 적용
정규화된 좌표 \mathbf{x}_{\text{norm}}에 대해 Radial 왜곡 방정식을 적용하여 보정할 좌표를 계산한다. 이는 왜곡 방정식에서 정의한 r 값과 왜곡 계수 k_1, k_2, k_3를 이용하여 보정된 좌표 \mathbf{x}_{\text{ideal}}을 계산하는 방식이다.
보정된 좌표는 다음과 같이 계산된다:
이 과정은 실제로는 반복적으로 수행되며, 초기 추정값을 바탕으로 최적화가 이루어진다.
3. 비선형 최적화
Radial 왜곡 보정은 비선형 문제로, 이를 해결하기 위해 다양한 최적화 기법이 사용된다. 대표적으로 Levenberg-Marquardt 알고리즘이나 Gauss-Newton 방법 등이 사용되며, 이는 오류를 최소화하는 방식으로 동작한다. 최적화 과정은 다음과 같이 진행된다.
- 왜곡된 좌표와 보정된 좌표 간의 차이를 최소화하기 위한 목적함수를 정의한다.
- 목적함수의 값을 최소화하기 위해 Radial 왜곡 계수 k_1, k_2, k_3를 조정한다.
- 최적화가 완료되면 최종적으로 보정된 좌표를 얻는다.
4. 잔여 오차 계산
왜곡 보정이 완료된 후, 보정의 정확성을 평가하기 위해 잔여 오차(Residual Error)를 계산한다. 보정된 좌표와 실제 좌표 간의 차이를 기반으로 오차를 계산하며, 이 값이 작을수록 보정이 정확하게 이루어진 것이다.
잔여 오차는 다음과 같이 정의된다:
보정 과정에서 잔여 오차를 최소화하는 것이 핵심 목표이며, 이를 통해 보정 알고리즘의 성능을 평가할 수 있다.
코드 구현 예시
카메라의 Radial 왜곡을 보정하는 과정을 Python의 OpenCV 라이브러리를 이용해 구현할 수 있다. 다음은 Radial 왜곡 보정 알고리즘의 간단한 코드 예시이다.
import cv2
import numpy as np
image = cv2.imread('distorted_image.jpg')
camera_matrix = np.array([[fx, 0, cx], [0, fy, cy], [0, 0, 1]])
dist_coeffs = np.array([k1, k2, p1, p2, k3])
h, w = image.shape[:2]
new_camera_matrix, roi = cv2.getOptimalNewCameraMatrix(camera_matrix, dist_coeffs, (w,h), 1, (w,h))
undistorted_image = cv2.undistort(image, camera_matrix, dist_coeffs, None, new_camera_matrix)
cv2.imwrite('undistorted_image.jpg', undistorted_image)
이 코드는 왜곡된 이미지를 보정하는 과정으로, cv2.undistort()
함수를 통해 Radial 왜곡을 제거하고 보정된 이미지를 저장하는 기능을 수행한다.