렌즈 왜곡(lens distortion)
렌즈 왜곡에 관해 알아보는 포스팅을 진행하겠습니다.
렌즈 왜곡이란?
3차원 세계의 한 점 혹은 물체를 2차원 이미지로 맵핑(mapping), 투영 시킬 때 주로 카메라 렌즈를 통해 빛을 투영시킴.
렌즈를 통해 빛을 투영시키는 과정에서 렌즈의 굴절률이나 렌즈와 카메라의 이미지 센서의 수평이 맞지 않을 경우 투영된 이미지에 왜곡이 발생할 수 있음.
또한 특정 렌즈를 이용해 시야각이 넓은(화각이 큰) 장면을 담게 되면 이미지에 왜곡이 심화되는 현상이 발생함.
해당 왜곡의 종류와 이를 수학적으로 어떻게 모델링 했는지에 대해 알아보겠음.
왜곡의 종류
렌즈 왜곡은 왜곡의 발생 원인에 따라 크게 두 가지로 분류가 가능하며 방사형 왜곡(radial distortion)과 접선형 왜곡(tangential distortion)으로 나뉨.
방사형 왜곡(Radial distortion)
사진과 같이 방사형 왜곡은 렌즈의 중앙부와 바깥 영역의 굴절률이 달라짐에 따라 왜곡이 발생함.
3차원 물체를 렌즈에 투영할 경우, 중심에서 먼 곳을 지나가는 빛은 중심과 가까운 곳을 지나는 빛에 비해 휘어져서 지나가게 됨.
만약 왜곡이 없다면, 정면으로 보았을 때 모든 직선이 직선으로 보임.
하지만 왜곡이 존재하는 경우, 직선이 휘어져 보임.
접선형 왜곡(Tangential distortion)
접선형 왜곡은 렌즈와 카메라 이미지 센서의 수평이 맞지 않을 경우에 발생하는 왜곡.
기술의 발전으로 인해 렌즈와 이미지 센서의 수평이 잘 맞는 경우가 많기에 그렇게 신경쓰지 않음.
수학적 표현
왜곡의 수학적 모델, 표현은 카메라 내부 파라미터의 영향이 제거된 normalized 평면에서 정의됨.
방사형 왜곡
xn_distorted=xn(1+k1r2+k2r4+k3r6)
yn_distorted=yn(1+k1r2+k2r4+k3r6)
r2=xn2+yn2
xn, yn : 왜곡 되지 않은 이미지의 normalized 평면에서의 좌표
xn_distorted,yn_distorted : 왜곡 이미지의 normalized 평면에서의 좌표
k1,k2,k3 : 방사형 왜곡 계수, 왜곡의 정도가 강하다면 k4와 같은 추가 왜곡 계수를 이용해 표현 가능.
접선형 왜곡
xn_distorted=xn+2p1xnyn+p2(r2+2xn2)
yn_distorted=yn+2p1xnyn+p2(r2+2yn2)
p1,p2 : 접선형 왜곡 계수
종합적인 표현
결국 방사형 왜곡과 접선형 왜곡을 한꺼번에 포함하는 수식을 작성하면
xn_distorted=(1+k1r2+k2r4+k3r6)xn+2p1xnyn+p2(r2+2xn2)
yn_distorted=(1+k1r2+k2r4+k3r6)yn+2p1xnyn+p2(r2+2yn2)
로 표현할 수 있으며 이를 행렬로 나타낼 경우
(xn_distortedyn_distorted) = (1+k1r2+k2r4+k3r6) (xnyn) +
(2p1xnyn+p2(r2+2xn2)2p1xnyn+p2(r2+2yn2))
와 같이 나타낼 수 있다.
다음 포스팅은 이미지에 왜곡을 직접 주는 과정을 코드로 구현해보는 시간을 가지겠습니다.
참고자료
[SLAM] Camera Models and distortion (Perspective, Fisheye, Omni)
카메라 왜곡보정 - 이론 및 실제
카메라 보정이란?
[OpenCV] 카메라 보정(#3 렌즈왜곡, 방사왜곡, 접선왜곡)