렌즈 왜곡

편집 역사 토론
컴퓨터 그래픽스 수치해석 마지막 수정: 2026-09-05 04:47:52

1. 개요[편집]

렌즈 왜곡
Lens Distortion
증상직선이 직선으로 찍히지 않는다 (배럴 · 핀쿠션 · 콧수염)
표준 모형브라운-콘래디 — 방사 $k_1,k_2,k_3$ + 접선 $p_1,p_2$
대안 모형나눗셈 모형(Fitzgibbon) · FOV 모형 · 칸날라-브란트(어안)
추정 방법체스보드 보정 · 직선성(plumb-line) 제약
역왜곡닫힌 형태 없음 — 고정점 반복 또는 뉴턴
적용 순서정규화 좌표에서 왜곡 → 그다음 $K$ 곱하기
실무 비용보정맵 1회 생성 + 프레임마다 리샘플링(대역폭 병목)

사진의 직선이 휘어 있다면 세상이 휜 게 아니라 렌즈가 휜 것이다. 그리고 그걸 다항식 두세 개로 되돌릴 수 있다는 게 이 분야가 굴러가는 이유다.

렌즈 왜곡(lens distortion)은 실제 렌즈계가 이상적인 원근투영에서 벗어나, 상점이 광축을 기준으로 반경 방향·접선 방향으로 밀려나는 기하학적 수차다. 초점이 흐려지거나 색이 번지는 다른 수차와 달리 왜곡은 선명도를 건드리지 않고 위치만 옮긴다. 그래서 사진으로는 멀쩡해 보이고, 핀홀 카메라 모형을 전제한 모든 기하 계산에서만 조용히 틀린다.

왜곡이 남아 있으면 무너지는 것들이 구체적이다. 호모그래피는 직선을 직선으로 보내는 사상이라 배럴 왜곡이 남은 두 영상은 원리적으로 맞출 수 없고, 에피폴라 기하의 에피폴라 선은 직선이라는 전제가 깨지며, 포토그래메트리에서는 조정이 왜곡을 지형 변형으로 흡수해 버린다. 그래서 파이프라인에서 왜곡 보정은 거의 언제나 맨 앞에 온다.

보정 절차 전체(어떤 판을 어떻게 찍고 무엇을 확인하는가)는 카메라 보정에 있다. 이 문서는 왜곡 그 자체의 모형·역변환·리샘플링을 다룬다.

2. 방사 왜곡과 접선 왜곡[편집]

방사 왜곡(radial distortion)은 상점이 광축으로부터의 거리 rr 에만 의존해 안팎으로 밀리는 것이다. 회전 대칭인 렌즈계에서는 왜곡이 rr짝수 함수여야 하므로 다항식에 짝수차만 남는다.

  • 배럴(barrel, 통형) — 바깥쪽이 안으로 당겨져 사각형이 술통처럼 부푼다. 광각·초광각의 국룰.
  • 핀쿠션(pincushion, 실패형) — 바깥쪽이 밖으로 밀려 변이 오목해진다. 망원에서 약하게 나타난다.
  • 콧수염(mustache, wave) — 안쪽은 배럴인데 바깥쪽에서 핀쿠션으로 뒤집히는 복합형. 광각 줌에서 흔하고, k1k_1k2k_2부호가 반대여야 표현되므로 k1k_1 하나짜리 모형으로는 절대 잡히지 않는다.

접선 왜곡(tangential distortion, decentering)은 렌즈 요소들의 광축이 서로 어긋나거나 센서면과 렌즈면이 평행하지 않을 때 생기며, 상이 한쪽으로 비스듬히 밀린다. 콘래디가 1919년에 편심 렌즈계의 수차로 정식화했고 브라운이 1960~70년대에 근접 사진측량용으로 다듬어, 지금 쓰는 형태가 브라운-콘래디 모형으로 불린다.1 요즘 조립 정밀도에서는 매우 작아서, 데이터가 넉넉하지 않으면 p1=p2=0p_1=p_2=0 으로 두는 편이 오히려 낫다.

3. 브라운-콘래디 모형[편집]

정규화 좌표 (x,y)(x,y) (즉 KK 를 곱하기 의 좌표)에서 r2=x2+y2r^2 = x^2+y^2 로 두면

xd=x(1+k1r2+k2r4+k3r6)+2p1xy+p2(r2+2x2)x_d = x\bigl(1 + k_1 r^2 + k_2 r^4 + k_3 r^6\bigr) + 2p_1 xy + p_2\bigl(r^2 + 2x^2\bigr) yd=y(1+k1r2+k2r4+k3r6)+p1(r2+2y2)+2p2xyy_d = y\bigl(1 + k_1 r^2 + k_2 r^4 + k_3 r^6\bigr) + p_1\bigl(r^2 + 2y^2\bigr) + 2p_2 xy

이고, 왜곡된 정규화 좌표에 KK 를 곱해야 화소가 나온다. k1<0k_1<0 이면 배럴, k1>0k_1>0 이면 핀쿠션이다.2

적용 순서와 좌표계가 이 모형의 최대 사고 지점이다. 왜곡은 정규화 좌표에서 정의되지만 일부 라이브러리·논문은 화소 좌표나 rr 을 영상 반경으로 정규화한 좌표에서 정의한다. 이 경우 같은 물리적 왜곡이라도 k1k_1크기가 수 자릿수 달라진다 — 정규화 좌표에서 k10.3k_1 \approx -0.3 인 렌즈가 화소 좌표계에서는 10710^{-7} 대의 값을 갖는다. 계수 다섯 개만 적힌 보정 파일을 다른 코드로 읽어 조용히 틀리는 사고의 대부분이 여기서 나온다.

차수 선택은 화각이 정한다. 화각 90° 이하면 k1,k2k_1,k_2 로 충분하고, 120°대면 k3k_3 를 넣고, 그 이상은 아래의 어안 모형으로 갈아타야 한다. 화각이 좁은데 계수를 여섯 개 풀어 놓으면 과적합이 되어 영상 가장자리에서 보정 결과가 폭발한다. 계수 사이의 상관도 심해서 k1k_1k2k_2 는 거의 언제나 강하게 상관되고, p1,p2p_1,p_2 는 주점 (cx,cy)(c_x,c_y) 와 결합한다 — 접선항을 풀어 놓으면 주점이 영상 밖으로 도망가는 흔한 증상의 정체가 이 결합이다.

4. 나눗셈 모형 — 계수 하나로 되는 마법[편집]

Fitzgibbon(2001)이 제안한 나눗셈 모형(division model)은 다항식을 곱하는 대신 나눈다. 왜곡된 좌표 xd\mathbf x_d 에서 왜곡 없는 좌표 xu\mathbf x_u 로 가는 방향으로

xu  =  xd1+λ1rd2+λ2rd4+,rd=xd\mathbf x_u \;=\; \frac{\mathbf x_d}{1 + \lambda_1 r_d^2 + \lambda_2 r_d^4 + \cdots}, \qquad r_d = \lVert \mathbf x_d\rVert

이며, 실무에서는 λ1\lambda_1 하나만 쓰는 경우가 많다. 장점이 세 가지다.

  1. 표현력 대비 계수가 적다. 계수 하나로 브라운 모형의 k1,k2k_1,k_2 두세 개에 해당하는 강한 왜곡까지 근사한다. 광각 렌즈에서 특히 잘 맞는다.
  2. 역변환이 닫힌 형태다. 한 계수 모형에서 ru=rd/(1+λrd2)r_u = r_d/(1+\lambda r_d^2)rdr_d 에 대해 풀면 λrurd2rd+ru=0\lambda r_u r_d^2 - r_d + r_u = 0 이라는 이차방정식이라 근의 공식으로 끝난다. 다음 절에서 볼 다항식 모형의 골칫거리가 여기서는 아예 없다.
  3. 기하 추정과 함께 선형화된다. 왜곡을 미지수로 둔 채 기초행렬을 세우면 λ\lambda 에 대해 다항식인 연립계가 되어, 이차 고유값 문제로 왜곡과 에피폴라 기하를 동시에 풀 수 있다. “보정 먼저, 기하 나중”이라는 순서를 깨뜨린 것이 이 논문의 기여였다.

단점도 분명하다. 물리적 근거는 브라운 쪽이 낫고, 접선 왜곡이 따로 없으며, 기존 보정 파일·라이브러리가 대부분 브라운 형식이라 상호운용이 번거롭다. 그래서 현장 표준은 여전히 브라운이고 나눗셈 모형은 한 계수로 빠르게 밀어야 할 때의 강력한 선택지로 쓰인다.

5. 역왜곡 — 닫힌 형태가 없다[편집]

여기가 이 문서의 핵심이다. 브라운 모형은 “왜곡 없는 좌표 → 왜곡된 좌표” 방향으로 정의돼 있는데, 실제로 필요한 것은 대개 그 반대 방향이다. 관측된 화소가 어느 이상 광선에 대응하는지를 알아야 하기 때문이다.

그런데 방사 성분만 봐도 rd=r(1+k1r2+k2r4+k3r6)r_d = r(1 + k_1 r^2 + k_2 r^4 + k_3 r^6)rr 에 대해 7차 다항식이다. 5차 이상 일반 다항식은 근호로 풀리지 않으므로 역함수의 닫힌 형태가 존재하지 않고, 접선항까지 있으면 애초에 1차원 문제도 아니다. 그래서 역왜곡은 반복법으로 푼다.

고정점 반복. 가장 널리 쓰이는 방식이며, 원식을 xx 에 대해 정리해 그대로 대입한다.

x(n+1)  =  xd[2p1x(n)y(n)+p2(rn2+2(x(n))2)]1+k1rn2+k2rn4+k3rn6,rn=x(n)x^{(n+1)} \;=\; \frac{x_d - \bigl[2p_1 x^{(n)}y^{(n)} + p_2\bigl(r_n^2 + 2(x^{(n)})^2\bigr)\bigr]}{1 + k_1 r_n^2 + k_2 r_n^4 + k_3 r_n^6}, \qquad r_n = \lVert \mathbf x^{(n)}\rVert

초기값은 x(0)=xd\mathbf x^{(0)} = \mathbf x_d 이고, 왜곡이 온건하면 몇 번 만에 화소 이하로 수렴한다. OpenCV의 undistortPoints 가 기본 5회 반복을 도는 것이 이것이다. 문제는 수렴 보장이 없다는 점이다. 사상의 미분이 1보다 커지는 영역 — 즉 왜곡이 강한 영상 구석 — 에서는 반복이 발산하거나 엉뚱한 근으로 튄다. 어안이나 강한 광각에서 “화면 네 귀퉁이만 이상하게 보정된다”는 증상의 정체가 대개 이것이고, 그래서 반복 횟수와 수렴 판정을 사용자가 지정할 수 있는 API가 나중에 추가됐다.

뉴턴 반복. f(x)=xdistort(x)xd\mathbf f(\mathbf x) = \mathbf x_{\text{distort}}(\mathbf x) - \mathbf x_d 의 근을 뉴턴-랩슨법으로 찾는다. 2×2 야코비안을 해석적으로 쓸 수 있으므로 반복당 비용은 조금 더 들지만 수렴이 이차이고, 감쇠(line search)를 붙이면 강한 왜곡에서도 훨씬 견고하다. 화소 하나하나가 아니라 보정맵을 한 번 만들 때만 도는 계산이라 이 정도 비용은 대개 문제가 되지 않는다.

역계수 적합. 아예 “왜곡 → 무왜곡” 방향의 다항식 r=rd(1+k1rd2+k2rd4+)r = r_d(1 + k_1' r_d^2 + k_2' r_d^4 + \cdots) 을 별도로 최소자승법으로 적합해 두는 방법도 널리 쓰인다. 실행 시간에 반복이 사라지지만 근사 오차가 남고, 원본 계수와 역계수를 한 파일에 섞어 저장했다가 어느 쪽인지 헷갈리는 사고가 따라온다. OpenCV의 유리(rational) 모형 k4,k5,k6k_4,k_5,k_6 도 분모에 다항식을 두어 넓은 화각과 역방향 근사를 동시에 노리는 같은 계열의 발상이다.

브라운-코너디 계수로 체스보드 격자를 정왜곡하고, 닫힌 형태가 없는 역왜곡을 고정점 반복 x ← (x_d − 접선항)/D(r²) 로 푼다. k₁ = −0.32 에서 11회 만에 최대 잔차 4.3e−4 px 로 원본이 복원되지만, 폴드 임계 k₁* = −0.608 을 넘으면 반복이 참 근 대신 다른 근으로 «수렴»해 잔차가 72 px 로 뛴다.

실무 점검표는 짧다. 모형이 정의된 방향을 항상 명시하고, 역방향이 필요하면 반복법을 쓰되 수렴 실패를 잡아낼 것. 왜곡 계수를 저장할 때는 모형 이름·좌표계·방향을 같이 적는다. 이 세 줄을 안 지켜서 나오는 버그는 결과가 “대충 맞는데 미묘하게 틀린” 형태라 발견이 늦다.

6. 계수 추정 — 체스보드와 직선성[편집]

계수를 얻는 길은 크게 둘이다.

보정판 기반. 체스보드나 ChArUco 판을 여러 자세로 찍고, 모든 코너의 재투영 오차를 KK·왜곡계수·각 영상의 자세에 대해 함께 최소화한다(레벤버그-마쿼트 방법). 정확도가 가장 높고 KK 까지 같이 나오지만, 판이 필요하고 자세 다양성이 부족하면 계수가 다른 파라미터와 엉킨다. 절차와 실패 모드는 카메라 보정에 정리돼 있다.

직선성(plumb-line) 제약. 브라운(1971)이 제안한 방법으로, “세상의 직선은 영상에서도 직선이어야 한다” 는 사실만 쓴다.3 영상에서 직선이어야 할 에지를 여러 개 뽑아 각 에지에 직선을 적합하고, 보정 후 점들이 그 직선에서 벗어난 거리의 제곱합을 왜곡계수에 대해 최소화한다. 장점이 강력하다.

  • 3차원 좌표도, 판도, 대응 관계도 필요 없다. 벽돌담·건물 모서리·문틀 사진 몇 장이면 된다.
  • 왜곡만 분리해서 추정하므로 초점거리·자세와의 결합이 없다. 보정판 조정에서 계수가 다른 파라미터에 흡수되는 문제가 원천적으로 없다.
  • 이미 찍힌 영상, 렌즈를 만질 수 없는 상황, 아카이브 사진에도 쓸 수 있다.

한계는 KK 를 주지 못한다는 것과, 주점을 왜곡 중심으로 함께 추정하면 조건이 나빠진다는 것이다. 그래서 실무에서는 왜곡 중심을 영상 중심으로 고정하고 방사 계수만 푸는 경우가 많다. 이 방식으로 자동 검출된 에지에서 왜곡을 추정하는 계열은 Devernay와 Faugeras의 작업 이후 표준적인 도구가 됐고, 파노라마·건축 사진 소프트웨어의 “직선 자동 보정” 기능이 바로 이것이다.

7. 초광각과 어안 — 다항식이 죽는 지점[편집]

브라운 모형이 화각 150°를 못 넘는 이유는 명확하다. 핀홀 투영이 r=ftanθr = f\tan\theta 인데 θ90°\theta\to 90° 에서 이 값이 발산하기 때문이다. 어떤 유한 차수 다항식으로도 발산을 보정할 수 없다. 그래서 어안 렌즈는 애초에 다른 투영식으로 설계된다.

투영특징
핀홀(원근)r=ftanθr = f\tan\theta90°에서 발산
등거리(equidistant)r=fθr = f\theta어안의 기본. 각도가 반경에 비례
등입체각(equisolid)r=2fsin(θ/2)r = 2f\sin(\theta/2)면적비 보존. 광량 측정용
정사(orthographic)r=fsinθr = f\sin\theta180°가 유한 반경
입체사영(stereographic)r=2ftan(θ/2)r = 2f\tan(\theta/2)각을 보존. 시각적으로 자연스러움

실제 어안 렌즈는 이 이상식에서 또 벗어나므로, 입사각을 직접 다항식으로 사상하는 칸날라-브란트 모형 θd=θ(1+k1θ2+k2θ4+k3θ6+k4θ8)\theta_d = \theta(1 + k_1\theta^2 + k_2\theta^4 + k_3\theta^6 + k_4\theta^8) 이 표준으로 쓰인다. 이 형태 하나가 위 표의 고전 투영들을 전부 근사로 포괄한다. 그 밖에 시야각 ω\omega 하나로 표현하는 FOV 모형 rd=1ωarctan(2rutanω2)r_d = \frac{1}{\omega}\arctan\bigl(2r_u\tan\frac{\omega}{2}\bigr), 통일 구면 모형(MEI), 이중 구면 모형처럼 파라미터를 아낀 모형들도 널리 쓰인다.

어안을 핀홀로 펴는 것은 대개 나쁜 생각이다. 화각 180°를 평면에 투영하면 반경이 무한대가 되므로, 실제로는 화각을 크게 잘라내야 하고 남긴 주변부는 극단적으로 늘어나 흐려진다. 어안의 넓은 시야가 필요해서 어안을 달았는데 보정하면서 그 시야를 버리는 셈이다. 정석은 왜곡 보정 영상을 만들지 않고 모형을 들고 다니는 것, 또는 구면·원통면 같은 다른 투영면으로 리샘플링하는 것이다.

8. 리샘플링 — 보정은 공짜가 아니다[편집]

왜곡 보정 영상을 실제로 만들려면 목적지 화소마다 원본 좌표를 찾아 값을 가져와야 한다. 방향은 역방향 사상이다 — 출력 화소 u\mathbf u 에 대해 정규화 → 왜곡 적용 → KK 곱하기로 원본 좌표를 얻는다. 이 방향은 정방향 왜곡식만 있으면 되므로 반복이 필요 없다. 역왜곡의 반복 계산이 필요한 것은 점 몇 개를 옮길 때이지, 영상 전체를 펼 때가 아니라는 점이 자주 헷갈린다.

비용 구조는 이렇다.

  • 맵 생성은 한 번. 카메라가 고정이면 (mapx,mapy)(map_x, map_y) 를 한 번 만들어 캐시한다. 부동소수 두 장이 부담이면 고정소수점 맵 + 보간 계수 테이블로 절반 이하로 줄인다.
  • 프레임마다 드는 것은 gather. 화소당 산술 연산은 쌍선형 보간 몇 번뿐이고, 실제 병목은 메모리 접근 패턴이다. 왜곡이 크면 인접 출력 화소가 원본에서 멀리 떨어진 곳을 읽어 캐시 적중률이 무너진다. 강한 왜곡의 보정이 이론 연산량 대비 느린 이유가 이것이다.
  • 표본화 문제. 사상이 국소적으로 축소되는 영역(야코비안 행렬식이 1보다 작은 곳)에서는 쌍선형이 표본화 정리를 위반해 에일리어싱이 생긴다. 처방은 밉맵이나 이방성 필터링이며, 반대로 확대되는 영역에서는 에일리어싱 대신 보간 흐림이 생긴다. 즉 보정 영상은 화면 위치에 따라 실효 해상도가 다르다.
  • 두 번 리샘플링하지 않는다. 왜곡 보정 → 스테레오 정류 → 원근 워핑을 각각 리샘플링하면 선명도를 세 번 잃는다. 세 변환을 하나의 맵으로 합성해 한 번만 리샘플링하는 것이 원칙이다. 실무 코드에서 정류 맵을 만들 때 왜곡 계수를 함께 넘기는 이유가 이것이다.
  • 출력 화각을 정해야 한다. 보정 후 영상은 사각형이 아니므로 검은 여백을 남길지, 유효 영역만 잘라낼지 골라야 한다. 자르면 화각을 잃고 남기면 후속 처리가 여백을 물체로 오인한다.

그리고 원칙 하나. 기하 계산은 원본 화소 + 왜곡 모형으로 한다. 보정 영상을 만들어 저장하면 보간으로 정보를 잃고 화각도 잘리며, 무엇보다 왜곡 모형이 사라져 나중에 되돌릴 수 없다. 보정 영상은 사람이 보거나 딥러닝 모델에 먹일 때 만드는 것이고, 번들 조정이나 삼각측량 같은 계산은 원본 관측을 쓰는 것이 정석이다.

9. 함정 모음[편집]

  1. 왜곡 중심은 영상 중심이 아니다. 원리적으로는 광축과 센서의 교점, 즉 주점 근처다. 다만 이를 자유롭게 풀면 접선 계수와 결합해 조건이 나빠지므로, 데이터가 부족하면 고정하는 편이 낫다.
  2. 카메라 내장 보정을 확인한다. 최근 스마트폰과 미러리스는 JPEG 단계에서 이미 왜곡을 펴서 저장한다. 그 영상에 또 계수를 적용하면 두 번 편다.
  3. 줌·오토포커스를 고정한다. 초점거리가 변하면 왜곡 계수도 변한다. 줌 렌즈의 보정값은 초점거리별로 따로 잡거나 화각을 고정해야 한다.
  4. 부화소 정확도를 요구하는 곳에서 반복 횟수를 기본값으로 두지 않는다. 5회 고정점 반복은 영상 중심부에서는 충분하지만 구석에서는 아니다.
  5. 어안에 다항식 모형을 억지로 맞추지 않는다. RMS는 그럭저럭 나오지만 주변부에서 통째로 틀린다. 화각이 모형을 정한다.
  6. 왜곡을 보정하지 않은 채 호모그래피나 기초행렬을 추정하지 않는다. RANSAC의 내점 비율이 어중간하게 나오고 잔차가 영상 가장자리로 몰리면 십중팔구 이 문제다.

10. 관련 문서[편집]

11. Footnotes[편집]

  1. 「브라운-콘래디」라는 이름은 콘래디(1919)의 편심 수차 해석과 브라운(1966·1971)의 근접 사진측량용 정식화를 합쳐 부르는 관용어다. 브라운의 1971년 논문 제목이 Close-Range Camera Calibration 인데, 반세기가 지난 지금도 OpenCV 문서에서 같은 다항식을 보고 있다는 점이 이 모형의 수명을 말해 준다. 렌즈는 눈부시게 발전했지만 왜곡을 적는 방식은 그대로다.

  2. 왜곡 계수의 부호 규약은 문헌마다 갈린다. ”k1<0k_1<0 이 배럴”은 여기 쓴 정의(무왜곡 → 왜곡 방향으로 곱하는 다항식)에서 그렇다는 뜻이고, 나눗셈 모형처럼 반대 방향으로 정의하면 부호가 뒤집힌다. 보정 결과가 왜곡을 없애기는커녕 두 배로 만들었다면 알고리즘이 아니라 부호를 먼저 보자. 이 실수는 누구나 정확히 한 번씩 한다.

  3. plumb-line, 즉 다림줄이라는 이름은 브라운이 실제로 실험실에 추 달린 줄을 여러 개 늘어뜨려 놓고 사진을 찍은 데서 왔다. 중력이 공짜로 제공하는 완벽한 직선을 기준으로 삼은 것인데, 요즘은 그냥 벽돌담을 찍는다. 원리는 같고 준비물만 저렴해졌다.