컴퓨테이셔널 포토그래피
스마트폰 센서는 대부분 풀프레임 센서 면적의 십분의 일도 되지 않는다. 그런데도 밤거리 사진이 그럴듯하게 나오는 것은 셔터 한 번에 한 장이 아니라 열 장 넘게 찍기 때문이다. 이 장에서는 여러 장의 RAW 프레임을 정렬하고 합쳐서 노이즈, 해상도, 심도라는 물리적 한계를 계산으로 넘는 방법과, 그 계산이 넘지 못하는 선이 어디인지를 본다.
- 긴 노출 한 장과 짧은 노출 \(N\)장의 SNR을 읽기 노이즈 페널티까지 포함해 계산한다.
- 손떨림으로 어긋난 프레임을 계층적 타일 정렬로 맞추는 원리와 계산량을 설명한다.
- 강건 병합이 움직이는 영역의 가중치를 낮춰 고스트를 막는 방식과 그 대가를 이해한다.
- 서브픽셀 시프트로 에일리어싱을 푸는 멀티프레임 초해상도의 원리와 광학적 한계를 설명한다.
- 시차에서 깊이를, 깊이에서 착란원을 계산하는 합성 심도의 흐름과 가장자리 아티팩트의 원인을 안다.
작은 센서의 광량 한계
10장의 마지막 절에서 여러 장을 찍어 합치는 흐름을 한 장의 그림으로 훑어보았다. 이 장은 그 그림의 블록 하나하나를 연다. 먼저 왜 여러 장이 필요한지를 숫자로 확인하자.
7장에서 보았듯이 밝은 영역의 SNR은 모은 전자 수의 제곱근이다. 화질은 결국 광자를 몇 개 모았는가로 정해진다. 같은 장면을 같은 화각으로 찍을 때 영상 전체에 모이는 광전자 수는 다음에 비례한다.
스마트폰 렌즈는 이미 F1.5~F2.0으로 밝다. 더 밝게 만들기는 어렵다. 장면 휘도는 바꿀 수 없다. 남는 변수는 센서 면적과 노출 시간인데, 면적은 기기 두께가 정한다.
1/1.3형 센서는 풀프레임보다 면적이 약 12배 작다. 샷 노이즈가 지배하는 조건에서 SNR 차이는 \(\sqrt{12}\approx 3.5\)배, 약 11 dB다. 이 차이를 메우려면 노출 시간을 12배로 늘려야 한다. 문제는 손이다.
카메라를 손에 들면 몸의 미세한 떨림 때문에 카메라가 초당 0.2~1° 정도로 회전한다. 각속도 \(\omega\)로 회전하는 동안 상이 센서 위에서 흐르는 거리를 픽셀 수로 쓰면 다음과 같다.
광학식 손떨림 보정(OIS)은 이 흐름을 수분의 일로 줄여 주지만 없애지는 못한다. 그리고 손떨림을 다 잡아도 피사체가 움직이면 소용이 없다. 긴 노출 한 장으로는 광자를 더 모을 수 없다. 그래서 흔들리지 않을 만큼 짧은 노출을 여러 장 찍고 계산으로 합친다. 이것이 컴퓨테이셔널 포토그래피(Computational Photography)의 출발점이다.
| 기법 | 여러 장에서 얻는 것 | 넘으려는 한계 | 이 장의 절 |
|---|---|---|---|
| 버스트 병합 | 광자 수(시간축 평균) | 샷 노이즈, 읽기 노이즈 | 2~4절 |
| 야간 모드 | 수 초에 걸친 총 노출 | 손떨림과 피사체 움직임 | 5절 |
| 멀티프레임 초해상도 | 서로 다른 서브픽셀 표본 위치 | 픽셀 피치와 CFA의 표본화 한계 | 6절 |
| 합성 심도 | 시점이 다른 두 영상(시차) | 작은 조리개 지름에서 오는 깊은 심도 | 7절 |
| 다중 노출 HDR | 노출이 다른 프레임 | 풀웰과 노이즈 바닥 사이의 다이내믹 레인지 | 9장 |
버스트 촬영: 긴 한 장 대 짧은 N장
스마트폰 카메라 앱을 열면 센서는 셔터를 누르기 전부터 초당 30장 안팎으로 계속 동작한다. 화면의 프리뷰를 그리기 위해서다. 이 프레임들의 RAW를 버리지 않고 최근 몇 장을 메모리에 돌려 가며 담아 두는 구조가 ZSL 링 버퍼(Zero Shutter Lag Ring Buffer)다. 새 프레임이 오면 가장 오래된 프레임을 덮어쓴다.
이제 핵심 질문이다. 총 노출 시간 \(T\)를 한 장에 다 쓰는 것과 \(N\)장으로 나누어 쓰는 것은 SNR이 같은가? 광자는 어느 쪽이든 똑같이 모인다. 총 신호 전자 수를 \(S\)라 하면 샷 노이즈 분산도 양쪽 모두 \(S\)다. 다른 것은 읽기 노이즈다. 읽을 때마다 \(\sigma_r\)이 한 번씩 더해지므로 \(N\)번 읽으면 분산 \(\sigma_r^2\)이 \(N\)번 쌓인다(7장).
버스트 쪽의 손해, 곧 읽기 노이즈 페널티는 두 식의 비다. \(\sigma_r\) = 2 e⁻, \(N\) = 8일 때 계산해 보면 다음과 같다.
| 총 신호 \(S\) | 프레임당 신호 \(s\) | 긴 노출 1장 | 짧은 노출 8장 병합 | 페널티 |
|---|---|---|---|---|
| 16 e⁻ | 2 e⁻ | 11.1 dB | 7.3 dB | 3.8 dB |
| 100 e⁻ | 12.5 e⁻ | 19.8 dB | 18.8 dB | 1.0 dB |
| 400 e⁻ | 50 e⁻ | 26.0 dB | 25.7 dB | 0.3 dB |
| 4,000 e⁻ | 500 e⁻ | 36.0 dB | 36.0 dB | 0.03 dB |
규칙은 단순하다. 프레임 한 장의 신호 \(s\)가 \(\sigma_r^2\)보다 충분히 크면 나누어 찍어도 잃는 것이 거의 없다. \(s \ge 10\,\sigma_r^2\)이면 페널티는 0.5 dB 미만이다. 반대로 프레임당 전자 몇 개밖에 못 받는 극저조도에서는 나눌수록 손해가 커진다. 읽기 노이즈를 1 e⁻ 아래로 낮추려는 픽셀 기술이 야간 사진에 직접 기여하는 이유가 여기 있다. \(\sigma_r\)이 2 e⁻에서 1 e⁻로 내려가면 손해 없이 나눌 수 있는 조도가 4배 어두워진다.
비교 기준을 바꾸면 버스트의 이득이 보인다. 흔들리지 않으려면 어차피 짧은 노출 한 장밖에 쓸 수 없다고 하자. 그 한 장과 견주면 \(N\)장 병합의 SNR은 조도와 읽기 노이즈에 관계없이 정확히 \(\sqrt{N}\)배다.
버스트 병합: 긴 노출 1장 대 짧은 노출 N장
프레임 정렬: 손떨림을 되돌리기
버스트의 프레임들은 서로 조금씩 어긋나 있다. 그대로 평균하면 긴 노출 한 장과 똑같이 흐려진다. 합치기 전에 각 프레임을 기준 프레임(Reference Frame)에 맞춰야 한다. 기준 프레임은 보통 셔터 시점에 가까운 몇 장 가운데 가장 선명한 것을 고른다. 손떨림은 불규칙해서 어떤 프레임은 우연히 거의 흔들리지 않은 채 찍힌다.
어긋남의 원인은 세 가지다.
- 카메라 회전: 손떨림의 대부분이다. 먼 장면에서는 영상 전체가 거의 같은 방향으로 평행 이동한다.
- 카메라 병진과 시차: 카메라 위치가 움직이면 가까운 물체가 먼 물체보다 많이 움직인다. 영역마다 이동량이 다르다.
- 피사체 움직임과 롤링 셔터: 사람, 나뭇잎, 차는 따로 움직인다. 롤링 셔터(9장) 때문에 한 프레임 안에서도 행마다 떨림의 위상이 다르다.
영상 전체에 변환 하나를 적용하는 방식으로는 뒤의 두 가지를 맞출 수 없다. 그래서 영상을 작은 타일(Tile)로 나누고 타일마다 변위를 따로 구한다. 기준 프레임의 타일 하나를 다른 프레임 위에서 이리저리 옮겨 보며 차이가 가장 작은 위치를 찾는 방법이 블록 매칭(Block Matching)이다.
문제는 계산량이다. 손떨림과 시차를 합치면 변위가 수십 픽셀에 이른다. ±60픽셀을 전부 뒤지면 후보가 \(121^2\) = 14,641개다. 1200만 화소 영상의 모든 타일에서, 버스트의 모든 프레임에 대해 이 계산을 할 수는 없다. 해법은 계층적 정렬(Coarse-to-Fine Alignment)이다. 영상을 반복해서 축소한 피라미드를 만들고 가장 작은 영상에서부터 찾는다.
축소 비율이 2이고 레벨마다 ±4픽셀을 탐색하면, 4개 레벨로 덮는 범위는 \(4\times(1+2+4+8)\) = ±60픽셀이다. 후보 수는 레벨당 81개씩 모두 324개로, 전부 뒤질 때의 14,641개에 비해 45분의 1이다. 게다가 위 레벨은 화소 수 자체가 적다. 실제 구현은 축소 비율을 2~4로, 타일 크기를 8~32픽셀로 조절해 정확도와 속도를 맞춘다.
정렬은 보통 컬러 영상이 아니라 RAW에서 만든 흑백 축소 영상으로 한다. 베이어 2×2 묶음 하나를 평균해 한 화소로 만들면 디모자이킹 없이 휘도에 가까운 영상이 나온다. 이렇게 구한 변위를 RAW에 적용할 때는 2픽셀 단위로 옮긴다. 홀수 픽셀만큼 옮기면 R 화소 위에 G 화소가 겹쳐 CFA 위상이 깨지기 때문이다.
정수 픽셀보다 정밀한 변위가 필요하면 비용 함수의 최솟값 주변에 포물선을 맞춘다. 최소 위치의 비용 \(D_0\)와 양옆의 비용 \(D_{-1}\), \(D_{+1}\)로부터 서브픽셀 변위를 구한다.
블록 매칭은 타일 안에 무늬가 있어야 동작한다. 맑은 하늘이나 흰 벽처럼 무늬가 없는 타일에서는 모든 후보의 비용이 비슷해 노이즈가 결과를 정한다. 수평선이나 전깃줄처럼 한 방향의 가장자리만 있는 타일은 그 방향을 따라 미끄러져도 비용이 변하지 않는다(개구 문제, Aperture Problem). 반복 무늬는 한 주기 어긋난 곳에서도 잘 맞는다. 어두울수록 노이즈가 무늬를 덮어 실패가 늘어난다. 정렬은 틀릴 수 있다는 전제에서, 틀린 결과를 걸러 내는 일을 다음 단계인 병합이 맡는다.
강건 병합: 평균하되 의심하기
정렬이 완벽하고 장면이 멈춰 있다면 병합은 평균이면 된다. \(N\)장을 평균하면 노이즈 표준편차가 \(1/\sqrt{N}\)이 된다. 그런데 장면은 멈춰 있지 않다. 걷는 사람이 프레임마다 다른 위치에 있으면 평균한 결과에는 반투명한 사람이 여럿 겹쳐 보인다. 9장의 HDR 합성에서 본 고스트(Ghost)와 같은 현상이다.
강건 병합(Robust Merge)의 생각은 이렇다. 정렬한 프레임의 값이 기준 프레임과 노이즈로 설명되는 만큼만 다르면 같은 장면으로 보고 평균에 넣는다. 노이즈로 설명할 수 없을 만큼 다르면 다른 장면으로 보고 뺀다. 이를 부드러운 가중치로 쓴 것이 위너 필터 꼴의 병합이다.
이 식의 요점은 \(\sigma^2\)을 센서의 노이즈 모델에서 가져온다는 것이다. 전자 단위로 \(\sigma^2 = x + \sigma_r^2\), 곧 샷 노이즈와 읽기 노이즈의 합이다(7장). 밝은 영역은 샷 노이즈가 크므로 문턱이 높고, 어두운 영역은 문턱이 낮다. 감마나 톤 매핑을 거친 영상에서는 이 관계가 깨지므로 병합은 선형 RAW에서 한다. 센서의 변환 이득과 읽기 노이즈를 미리 정확히 재 두어야 하는 이유이기도 하다(8장).
가중치가 균일하지 않으면 노이즈가 덜 줄어든다. 각 프레임에 실제로 걸린 가중치를 \(w_i\)(합이 1)라 하면 병합 결과의 노이즈 분산과 유효 프레임 수는 다음과 같다.
그래서 병합한 사진은 화소마다 노이즈가 다르다. 멈춘 배경은 깨끗하고, 움직인 사람의 윤곽은 한 장짜리 노이즈를 그대로 가진다. 뒤따르는 공간 노이즈 저감은 이 유효 프레임 수 지도를 받아 움직인 영역을 더 세게 처리한다.
타일 정렬과 고스트
위 식은 화소 하나에 대해 썼지만, 실제 구현은 타일을 2차원 푸리에 변환한 뒤 공간 주파수 성분마다 같은 식을 적용하는 경우가 많다. 정렬이 조금 어긋나면 높은 주파수 성분만 크게 달라지고 낮은 주파수 성분은 비슷하다. 주파수별로 판단하면 어긋난 프레임에서도 낮은 주파수의 노이즈 저감은 건질 수 있다. 타일은 절반씩 겹치게 놓고 부드러운 창 함수를 곱해 더하므로 타일 경계가 보이지 않는다.
야간 모드: 얼마나 길게, 몇 장을
야간 모드는 버스트 병합을 수 초 길이로 늘린 것이다. 원리는 같고, 달라지는 것은 촬영 계획이다. 프레임 한 장의 노출을 길게 잡으면 읽기 노이즈 페널티가 줄지만 블러가 늘어난다. 짧게 잡으면 선명하지만 프레임이 많아져 페널티와 처리량이 늘고, 프레임당 신호가 작아 정렬도 어려워진다. 이 균형점을 장면마다 정하는 과정이 모션 미터링(Motion Metering)이다. 밝기를 재는 측광에 견주어 붙인 이름이다.
상이 센서 위에서 흐르는 속도를 \(v\)(픽셀/초), 허용할 블러를 \(b_{\max}\)(픽셀)라 하면 프레임 노출의 상한은 다음과 같다.
| 상황 (예시 계산) | 상의 속도 \(v\) | 프레임 노출 (\(b_{\max}\) = 1 px) | 2초 동안의 프레임 수 |
|---|---|---|---|
| 손에 듦, 손떨림 보정 없음 (0.5°/s) | 52 px/s | 약 19 ms | 버퍼 한도까지 (예: 15장, 0.3초) |
| 손에 듦, OIS로 떨림이 1/8로 줄어듦 | 6.5 px/s | 약 150 ms | 13장 |
| 삼각대 (잔여 떨림 거의 없음) | 1 px/s 미만 | 1초 이상 | 1~2장, 총 시간을 수십 초로 늘림 |
| 삼각대, 사람이 화면 안에서 걸음 | 사람 영역만 수십 px/s | 사람에 맞춰 짧게 | 많은 프레임 + 사람 영역은 강건 병합 |
표의 \(f/p\)는 6000으로 두었다. 세 번째 줄이 삼각대 감지다. 자이로 신호가 사실상 0이면 기기가 고정되어 있다고 판단하고 프레임 노출을 초 단위로 늘린다. 총 시간이 길어지면 어두운 별까지 찍을 수 있다. 다만 노출이 길어지면 7장에서 본 암전류와 핫 픽셀이 다시 문제가 된다. 긴 노출 프레임에서는 미리 재 둔 암전류 지도를 빼거나, 프레임 사이에 값이 변하지 않는 밝은 점을 결함으로 판단해 지운다. 수십 초가 넘으면 지구 자전으로 별이 흐르므로 하늘과 땅을 따로 정렬하기도 한다.
야간 모드에는 노이즈 말고도 풀어야 할 문제가 있다.
- 자동 화이트 밸런스: 어두우면 색 통계가 노이즈에 묻히고, 나트륨등이나 LED 조명처럼 스펙트럼이 좁은 광원이 섞인다. 10장의 그레이 월드 같은 가정이 잘 맞지 않아 학습 기반 추정을 쓰는 경우가 많다.
- 자동 초점: 위상차 신호도 광자가 부족하면 노이즈가 커진다(12장). 프레임을 여러 장 모아 위상차를 구하거나 초점을 무한대 근처에 고정한다.
- 톤 매핑: 병합으로 암부를 살린 뒤 전부 밝게 끌어올리면 밤이 낮처럼 보인다. 어두운 곳은 어둡게 두면서 디테일만 보이게 하는 곡선을 쓴다. 톤 매핑의 원리는 9장을 참고하자.
같은 총 시간이라면 프레임 수를 늘리는 것보다 프레임 노출을 늘리는 편이 SNR에 유리하다. 2절의 식에서 페널티는 \(N\sigma_r^2\)으로 들어오기 때문이다. 총 신호 \(S\) = 32 e⁻, \(\sigma_r\) = 2 e⁻일 때 16장으로 나누면 SNR은 \(32/\sqrt{32+64}\) = 3.3, 4장으로 나누면 \(32/\sqrt{32+16}\) = 4.6이다. 3 dB 차이다. 그래서 OIS의 성능과 삼각대 감지는 야간 화질에 직접 반영된다.
멀티프레임 초해상도: 손떨림을 이용하기
지금까지 손떨림은 없애야 할 방해였다. 이 절에서는 손떨림이 정보의 원천이 된다. 4장과 5장에서 보았듯이 피치 \(p\)로 표본화하는 센서는 나이퀴스트 주파수 \(1/(2p)\)보다 촘촘한 무늬를 제대로 담지 못하고, 그 무늬는 더 성긴 가짜 무늬로 접혀 들어온다(에일리어싱). 베이어 센서에서는 사정이 더 나쁘다. R과 B 화소는 2픽셀에 하나씩이므로 나이퀴스트 주파수가 \(1/(4p)\)다. 빈자리는 디모자이킹이 주변 값으로 추정해 채운다.
한 장으로는 접힌 성분과 진짜 성분을 구별할 수 없다. 그런데 표본 위치를 반 픽셀 옮겨 한 장을 더 찍으면, 진짜 무늬는 그대로 있고 접혀 들어온 성분만 위상이 다르게 나타난다. 표본 위치가 서로 다른 프레임이 여러 장 있으면 더 촘촘한 격자로 표본화한 것과 같다. 손에 든 카메라는 프레임마다 무작위로 서브픽셀만큼 어긋나므로 이 조건이 저절로 만들어진다.
이 방식은 디모자이킹과도 연결된다. 각 프레임의 R, G, B 표본을 색별로 따로 출력 격자에 쌓으면, 프레임이 충분할 때 모든 출력 화소 근처에 실제로 측정한 R, G, B 표본이 놓인다. 이웃 색에서 추정할 필요가 없어진다. 디모자이킹을 병합이 대신하는 셈이고, 4장에서 본 지퍼나 위색 아티팩트가 원리적으로 줄어든다. 표본을 쌓을 때는 4절과 같은 강건성 가중치를 써서 움직인 영역의 표본을 뺀다. 그런 영역은 기준 프레임 한 장의 디모자이킹 결과로 되돌아간다.
그러면 프레임을 많이 모을수록 해상도가 끝없이 올라가는가? 그렇지 않다. 표본화 전에 이미 사라진 정보는 표본을 아무리 촘촘히 모아도 돌아오지 않는다. 두 가지가 한계를 정한다.
- 픽셀 개구: 픽셀은 점이 아니라 폭 \(a\)의 창으로 빛을 적분한다. \(a = p\)일 때 MTF는 나이퀴스트(\(\nu = 0.5/p\))에서 0.64, \(\nu = 0.75/p\)에서 0.30, \(\nu = 1/p\)에서 0이 된다. 표본 간격을 아무리 줄여도 \(1/p\) 근처의 무늬는 되살릴 수 없다.
- 렌즈: 파장 0.55 µm, F1.8이면 \(\nu_c\) ≈ 1010 주기/mm다. 1.0 µm 픽셀의 나이퀴스트는 500 주기/mm이므로 그 위로 정보가 조금 남아 있다. 수차가 없는 이상적인 렌즈라도 회절 MTF는 나이퀴스트에서 0.40, 나이퀴스트의 1.5배에서 0.15다. 여기에 픽셀 개구의 0.30을 곱하면 나이퀴스트의 1.5배에서 시스템 MTF는 약 4~5 %에 그친다. 0.7 µm 픽셀이라면 나이퀴스트(714 주기/mm)가 차단 주파수에 더 가까워 되살릴 것이 거의 없다.
그러므로 스마트폰에서 멀티프레임 초해상도의 실질 이득은 "화소 수의 몇 배"가 아니다. 베이어 표본화와 디모자이킹으로 잃었던 해상도를 되찾고, 에일리어싱으로 생긴 가짜 무늬를 지우고, 디지털 줌으로 잘라 낸 영상의 선명도를 1.5~2배 범위에서 지키는 정도다. 남은 4~5 % 수준의 대비를 샤프닝으로 끌어올리면 노이즈도 함께 커지므로, 프레임 수가 충분해 노이즈가 낮을 때만 의미가 있다.
멀티프레임 초해상도 (1차원 줄무늬)
시뮬레이터의 '없음'이 보여 주듯 표본 위치가 모두 같으면 초해상도는 불가능하다. 기기가 완전히 고정된 경우에는 OIS 구동기로 렌즈나 센서를 서브픽셀만큼 일부러 움직여 시프트를 만드는 방법이 쓰인다. 센서를 반 픽셀 또는 한 픽셀씩 정확히 옮기며 여러 장을 찍는 픽셀 시프트 촬영도 같은 원리이고, 이때는 시프트가 시뮬레이터의 '균등'에 해당한다.
합성 심도: 깊이를 재서 블러를 그린다
인물 사진에서 배경이 부드럽게 흐려지는 것은 렌즈의 얕은 심도 덕분이다. 5장에서 본 것처럼 초점이 맞지 않은 점은 센서 위에 착란원(Circle of Confusion)으로 퍼진다. 초점 거리 \(z_f\)에 맞춘 렌즈가 거리 \(z\)의 점을 찍을 때 착란원의 지름은 다음과 같다.
1/1.3형 센서의 스마트폰(\(f\) = 6.8 mm, F1.8)으로 1.5 m 거리의 인물에 초점을 맞추면 무한대 배경의 착란원은 \(6.8^2/(1.8\times 1500)\) = 0.017 mm로 화면 폭 9.8 mm의 0.17 %다. 같은 화각의 풀프레임 카메라(\(f\) = 25 mm, F1.8)에서는 \(25^2/(1.8\times 1500)\) = 0.23 mm로 화면 폭 36 mm의 0.64 %다. 화면 대비 블러가 센서 크기 비(약 3.7배)만큼 차이 난다. 블러를 정하는 것은 F-넘버가 아니라 조리개의 실제 지름 \(D\)이고, 작은 카메라는 \(D\)가 작다.
광학으로 얻을 수 없는 블러를 계산으로 그려 넣는 기능이 합성 심도(Synthetic Depth of Field), 흔히 말하는 인물 모드다. 순서는 세 단계다. 깊이를 재고, 깊이에서 블러 크기를 계산하고, 그 크기로 흐린다.
깊이 재기. 스마트폰이 쓰는 시점 차이는 두 가지다. 하나는 나란히 놓인 두 카메라이고, 다른 하나는 12장의 듀얼 픽셀이다. 듀얼 픽셀의 왼쪽·오른쪽 포토다이오드는 렌즈 조리개의 왼쪽 절반과 오른쪽 절반을 통해 장면을 본다. 초점을 맞추는 데 쓰던 그 위상차가 곧 화소별 깊이 정보다. 두 시점 사이의 거리인 기선(Baseline)을 \(B\)라 하면 시차(Disparity)는 다음과 같다.
| 방식 (\(f/p\) = 6000 가정) | 기선 \(B\) | 1.5 m 초점에서 3 m 물체의 시차 | 2 m에서 깊이 오차 (\(\delta d\) = 0.25 px) | 특징 |
|---|---|---|---|---|
| 듀얼 픽셀 | 약 1 mm (조리개 지름의 절반 이하) | 2 px | 약 17 cm | 카메라 하나로 가능, 가려짐이 적음, 먼 거리에서 부정확 |
| 듀얼 카메라 | 약 10 mm | 20 px (절대 시차) | 약 1.7 cm | 정밀하지만 한쪽에서만 보이는 영역이 생김, 두 모듈의 보정 필요 |
듀얼 픽셀의 시차는 몇 픽셀에 불과하므로 3절의 서브픽셀 정렬과 같은 기법으로 재고, 버스트의 여러 프레임을 모아 노이즈를 줄인다. 무늬가 없는 영역이나 기선과 나란한 가장자리에서는 시차를 잴 수 없다. 이런 곳은 사람 영역을 구분하는 분할 신경망과 한 장의 영상에서 깊이를 추정하는 학습 모델로 메운다. ToF 센서가 있으면 그 깊이도 함께 쓴다.
블러 그리기. 착란원 식과 시차 식을 나란히 놓으면 둘 다 \(|1/z_f - 1/z|\)에 비례한다. 듀얼 픽셀에서는 \(c/(d\,p) = D/B\)로 일정하다. 깊이를 미터 단위로 정확히 알 필요 없이 시차에 상수를 곱하면 블러 지름이 된다. 그 상수가 가상 조리개의 크기다. 렌더링에서 지켜야 할 것은 세 가지다.
- 원판 커널: 가우시안으로 흐리면 뿌옇게 보일 뿐 렌즈 블러처럼 보이지 않는다. 실제 착란원은 가장자리가 뚜렷한 원판이다.
- 선형 밝기에서 계산: 감마를 건 값으로 흐리면 밝은 점광원이 주변에 묻혀 사라진다. 선형 값에서, 가능하면 포화 전의 HDR 값으로 흐려야 점광원이 밝은 원판으로 남는다.
- 뒤에서 앞으로 층별 합성: 화소마다 자기 깊이의 반경으로 주변을 평균하기만 하면, 흐려진 배경에 선명한 인물의 색이 섞여 들어가 윤곽에 띠가 생긴다. 깊이별 층으로 나누어 먼 층부터 흐리고 가까운 층을 그 위에 덮어야 한다.
깊이 맵 기반 합성 보케
아티팩트는 거의 전부 깊이 맵의 가장자리에서 나온다. 머리카락, 안경테, 손가락 사이, 자전거 바큇살처럼 깊이 맵의 해상도보다 가는 구조는 배경으로 분류되어 함께 흐려진다. 유리잔과 같은 투명체나 거울 반사는 한 화소에 깊이가 둘이어서 깊이 맵 하나로 표현할 수 없다. 전경과 배경의 색이 비슷하면 시차 자체가 잘 재지지 않는다. 그리고 진짜 큰 렌즈는 조리개의 가장자리를 통해 전경 물체의 뒤쪽을 조금 돌아서 본다. 한 시점에서 찍은 영상에는 그 가려진 배경이 없으므로 주변 화소로 지어내 채울 수밖에 없다.
학습 기반 처리와 환각
앞 절까지의 기법은 모두 측정한 광자를 다시 배열하는 방법이었다. 결과의 모든 값은 어느 프레임의 어느 화소에서 왔는지 추적할 수 있다. 신경망을 쓰는 처리는 정보의 출처가 하나 더 있다. 학습 데이터에서 얻은 사전 지식(Prior)이다.
- 공동 디모자이킹·디노이징(Joint Demosaicking and Denoising): 4장의 보간과 10장의 노이즈 저감을 따로 하면 앞 단계의 오류가 뒤 단계에서 굳는다. 노이즈 낀 모자이크에서 깨끗한 RGB를 한 번에 추정하도록 학습하면 두 문제를 함께 풀 수 있다. 쿼드 베이어의 리모자이크(12장)도 같은 틀로 다룬다.
- 학습 기반 저조도 복원: 짧은 노출의 어두운 RAW와 긴 노출의 깨끗한 영상을 쌍으로 학습해, 고전적인 병합으로는 색이 무너지는 극저조도에서 색과 형태를 복원한다. 센서의 노이즈 모델로 합성한 데이터를 쓰기도 하므로 8장의 특성 측정이 학습 데이터의 품질을 정한다.
- 학습 기반 초해상도: 한 장 또는 버스트에서 고해상도 영상을 추정한다. 6절의 광학적 한계 너머의 디테일을 그럴듯하게 채운다.
- 의미 기반 보정: 하늘, 피부, 초목, 글자를 구분해 영역마다 노이즈 저감 강도와 톤, 색을 달리한다.
문제는 마지막 문장들의 "그럴듯하게"다. 6절에서 보았듯 차단 주파수 위의 정보는 센서에 도달하지 않았다. 신경망이 거기에 그려 넣는 디테일은 측정이 아니라 비슷한 장면에서 통계적으로 가장 흔했던 모양이다. 이것을 환각(Hallucination)이라 부른다. 잔디나 머리카락의 결처럼 정확한 모양이 중요하지 않은 질감에서는 문제가 되지 않고 오히려 보기 좋다. 틀리면 안 되는 내용에서는 위험하다.
| 고전적 다중 프레임 처리 | 학습 기반 처리 | |
|---|---|---|
| 정보의 출처 | 이번 촬영에서 측정한 광자 | 측정한 광자 + 학습 데이터의 통계 |
| 정보가 부족할 때 | 노이즈가 남거나 흐려진다 (부족함이 눈에 보인다) | 그럴듯한 내용으로 채운다 (부족함이 보이지 않는다) |
| 전형적인 실패 | 고스트, 정렬 오류, 남은 노이즈 | 없던 무늬, 바뀐 글자나 숫자, 지나치게 매끈한 피부, 학습 분포 밖 장면의 오류 |
| 결과의 검증 | 노이즈 모델로 불확실성을 계산할 수 있다 | 입력만으로는 어느 부분이 추정인지 알기 어렵다 |
전통적으로 RAW는 센서가 한 번의 노출에서 읽은 값 그대로였다. 화소값과 광자 수 사이에 선형 관계가 있고 노이즈는 샷 노이즈와 읽기 노이즈의 합이라는 7장의 모델을 그대로 적용할 수 있었다. 여러 장을 병합해 만든 RAW는 선형성은 유지하지만 4절에서 본 대로 화소마다 유효 프레임 수가 달라 노이즈가 영역마다 다르다. 여기에 학습 기반 처리가 더해지면 화소값은 더 이상 그 위치에 도달한 광자 수의 측정값이라 할 수 없다. 사진으로서는 더 좋아졌지만, 밝기를 재는 측광이나 과학·의료·법적 증거처럼 화소값을 측정으로 다루는 용도에는 쓸 수 없게 된다. 어떤 처리를 거쳤는지 기록해 두는 일과, 촬영 장치가 영상의 출처와 편집 이력을 서명해 남기는 표준이 그래서 중요해지고 있다.
한계와 비용
계산으로 얻은 화질에는 값이 있다. 메모리, 시간, 전력, 그리고 움직이는 장면에서의 실패다.
메모리. RAW 한 화소를 16비트로 담으면 1200만 화소 프레임 한 장이 24 MB다. 15장 버스트는 360 MB이고, 여기에 정렬용 피라미드와 중간 결과가 더해진다. 5000만 화소 RAW는 한 장이 100 MB다. 고화소 센서가 평소에는 화소를 묶어 1200만 화소로 내보내는 데에는 감도(7장, 12장)뿐 아니라 이 버스트 처리량도 이유로 작용한다.
시간과 전력. 버스트 병합과 그 뒤의 처리는 수백 ms에서 수 초가 걸린다. 사용자는 기다리지 않으므로 촬영 직후에는 빠른 경로로 만든 영상을 먼저 보여 주고, 본 처리는 뒤에서 끝낸 뒤 바꿔 넣는다. 연속으로 찍으면 처리가 밀린다. 프로세서가 내는 열은 기기 온도를 올리고, 온도가 오르면 암전류가 늘어나므로 화질에도 되돌아온다.
움직이는 피사체. 4절에서 본 대로 움직인 영역은 기준 프레임 한 장으로 되돌아간다. 아이나 반려동물, 스포츠 장면에서는 화면의 중요한 부분이 바로 그 영역이다. 배경은 깨끗한데 주인공만 거칠고, 그 한 장의 노출이 길었다면 모션 블러까지 있다. 여러 장을 합치는 방법은 근본적으로 정지한 장면에서 시간을 광자로 바꾸는 기술이다. 움직임이 클수록 큰 센서와 밝은 렌즈를 대신할 수 없다.
동영상. 동영상에서는 제약이 한꺼번에 조여진다.
| 사진 | 동영상 (4K 30 fps) | |
|---|---|---|
| 출력 한 장당 처리 시간 | 수백 ms ~ 수 초 | 33 ms 이내, 계속 |
| 처리량 | 버스트 한 번 | 약 830만 화소 × 30 = 초당 약 2.5억 화소 |
| 쓸 수 있는 프레임 | 기준 프레임 앞의 프레임 전부 (야간 모드처럼 셔터 뒤에 찍으면 뒤 프레임도) | 과거 프레임뿐 (미래 프레임을 쓰면 지연이 생김) |
| 프레임 노출 상한 | 모션 미터링이 정함 | 프레임 주기(33 ms) 이하 |
| 추가 요구 | 없음 | 시간적 일관성: 프레임마다 결과가 달라지면 깜박임으로 보임 |
그래서 동영상의 시간축 노이즈 저감은 버스트를 쌓아 두지 않고 직전 출력 한 장만 기억하는 순환 필터를 쓴다. 직전 출력을 현재 프레임에 맞게 정렬한 뒤 일정 비율로 섞는다.
전자식 손떨림 보정은 3절의 전역 정렬을 프레임마다 적용하고 가장자리를 잘라 내는 방식이어서 화각을 잃는다. 노출이 프레임 주기를 넘을 수 없으므로 어두운 곳의 동영상은 사진 야간 모드만큼 좋아질 수 없다. 동영상 화질에서 센서 크기와 픽셀 감도의 비중이 사진보다 큰 이유다.
이 장의 기법들은 센서 설계에 요구를 되돌려 보낸다. 읽기 노이즈가 낮을수록 버스트를 잘게 나눌 수 있다. 읽기 속도가 빠를수록 프레임 사이의 움직임과 롤링 셔터 왜곡이 줄어 정렬이 쉬워진다. 적층 구조로 센서 안에 메모리와 처리 회로를 넣으면 버스트를 센서 안에서 모을 수 있다. 듀얼 픽셀과 쿼드 PD는 초점뿐 아니라 깊이를 준다. 이런 구조는 12장 최신 센서 기술에서 다룬다.
핵심 정리
- 같은 화각·F-넘버·노출 시간에서 모이는 광자 수는 센서 면적에 비례한다. 작은 센서가 그 차이를 메울 수단은 시간이고, 손떨림 때문에 그 시간은 여러 장으로 나누어 써야 한다.
- 총 신호 \(S\)를 \(N\)장으로 나누면 \(\mathrm{SNR} = S/\sqrt{S + N\sigma_r^2}\). 프레임당 신호가 \(\sigma_r^2\)의 10배 이상이면 긴 노출 한 장과 거의 같고, 짧은 노출 한 장에 비하면 언제나 \(\sqrt{N}\)배다.
- ZSL 링 버퍼는 셔터를 누르기 전의 RAW를 담아 두어 셔터 지연 없이 버스트를 제공한다.
- 프레임 정렬은 타일 단위의 블록 매칭을 영상 피라미드 위에서 거친 단계부터 수행한다. 무늬가 없거나 한 방향 가장자리만 있는 타일에서는 실패할 수 있다.
- 강건 병합은 프레임 간 차이를 센서 노이즈 모델과 비교해 가중치를 정한다. 움직인 영역은 고스트 없이 남지만 노이즈가 줄지 않아, 병합 결과는 화소마다 유효 프레임 수가 다르다.
- 야간 모드는 모션 미터링으로 프레임 노출 \(t = b_{\max}/v\)를 정한다. 삼각대가 감지되면 프레임 노출을 늘려 읽기 노이즈 페널티를 줄인다.
- 멀티프레임 초해상도는 손떨림이 만든 서브픽셀 시프트로 에일리어싱을 풀고 디모자이킹을 대신한다. 픽셀 개구와 렌즈 MTF가 이미 지운 주파수는 되살릴 수 없고, 시프트가 없으면 노이즈만 줄어든다.
- 합성 심도는 시차로 깊이를 재고(\(d \propto fB/p\)), 착란원 \(c = fD\,|1/z_f - 1/z|\)에 맞춰 원판 커널로 층별로 흐린다. 아티팩트는 깊이 맵의 가장자리 오류에서 나온다.
- 학습 기반 처리는 측정하지 못한 정보를 사전 지식으로 채운다. 보기에는 좋지만 환각의 위험이 있고, 화소값을 측정으로 다루는 용도에는 맞지 않는다.
- 비용은 메모리·시간·전력이며, 움직이는 피사체와 동영상에서는 여러 장을 쓰는 이득이 크게 줄어든다. 동영상은 순환 필터로 \(N_{\text{eff}} = (2-\alpha)/\alpha\)의 저감을 얻는다.
확인 퀴즈
Q1. 총 신호가 100 e⁻, 읽기 노이즈가 3 e⁻인 조건에서 노출을 4장으로 나누어 찍어 병합했다. 긴 노출 한 장에 비해 SNR은 어떻게 되는가?
Q2. 프레임 정렬에서 영상 피라미드를 쓰는 주된 이유는?
Q3. 강건 병합을 거친 야간 사진에서, 걸어가던 사람의 영역은 정지한 배경과 비교해 어떻게 보이는가?
Q4. 삼각대에 완전히 고정한 카메라로 똑같은 위치에서 16장을 찍어 초해상도 병합을 시도했다. 나이퀴스트를 넘는 줄무늬는 어떻게 되는가?
Q5. 같은 시차 측정 오차에서, 기선 10 mm의 듀얼 카메라는 기선 1 mm의 듀얼 픽셀에 비해 깊이 오차가 어떻게 되는가? (나머지 조건은 같다)
Q6. 동영상의 순환 시간축 필터 \(y_t = \alpha x_t + (1-\alpha)\tilde{y}_{t-1}\)에서 \(\alpha\) = 0.25로 두었다. 정지한 영역의 노이즈 저감은 프레임 몇 장을 평균한 것과 같은가?