일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 자료구조
- 딥러닝
- canny edge detection
- AlexNet
- BFS
- edge detection
- Python
- MySQL
- 머신러닝
- clustering
- exists
- 백준
- C++
- MinHeap
- IN
- machine learning
- opencv
- 강화학습
- image processing
- classification
- dfs
- sklearn
- DP
- TD
- SIFT
- 인공지능
- Mask Processing
- Reinforcement Learning
- dynamic programming
- 그래프 이론
- Today
- Total
JINWOOJUNG
[ 영상 처리 ] Ch11. Computational Photography(1) 본문
본 영상 처리 개념과 기법들에 대한 공부를 진행하면서 배운 내용들을 중심으로 정리한 포스팅입니다.
책은 Computer Vision: Algorithms and Applications를 기반으로 공부하였습니다.
또한, 인하대학교 박인규 교수님의 디지털 영상 처리 과목을 기반으로 제작된 포스팅입니다.
이번 시간부터는 디지털 영상 처리에 대하여 배운다. Feature, Transformation을 배우다 갑자기 Computer Graphics적인 이야기가 나와서 어색한 느낌이 있어서 몇가지 개념을 조금 정리 해 보고자 한다.
우리가 어떠한 색상을 볼 수 있는 이유는 광원으로 부터 나온 빛이 눈으로 들어오기 때문이다. 이 과정에서 조도(Illuminance), 휘도(Luminance)라는 개념이 등장한다.
- 조도(Illuminance) : 광원으로부터 나온 빛이 특정한 면의 면적에 도달하는 정도
- 휘도(Luminance) : 광원에서 빛이 발산되는 정도나 반사되어 나오는 빛 즉, 2차 광원의 밝기
- 어떤 표면에 반사되어 눈에 들어오는 정도
바다를 생각 해 보자. 바다가 밝게 빛나는 것을 우리가 인식하는 과정은 광원(태양)이 바다로 빛을 비추고, 바다 표면에서 반사된 빛이 눈으로 들어오기 때문에 빛난다고 인식할 수 있다. 이를 다르게 해석하면 광원에서 바다로 빛이 X 만큼 들어왔고, 그 중 일부가 반사되어 눈으로 빛이 Y만큼 들어왔다고 해석할 수 있다. 이때, X가 조도, Y가 휘도 이다.
이러한 개념이 등장한 이유는 광원에서 나온 빛은 흡수, 반사, 투과되기 때문이다.
Image Sensing Pipeline
Camera Sensor가 영상을 취득하는 과정이다. 여기서 Radiance라는 개념이 등장하는데, Radiance(복사휘도)는 앞서 설명한 휘도(Luminance)라고 이해하면 되는데, 광원에서 나온 빛이 물리적인 3차원 Scene에서 반사되어 발산되는 Energy이다. Scene, Radiance가 Camera Body로 들어오면 카메라 센서로 빛이 들어와서 위와 같은 Pipeline을 거쳐 우리가 아는 영상이 만들어진다. 따라서 우리가 실제로 다루는 정보는 Irradiance(복사조도)로, 카메라의 센서(특정 면적)에 도달하는 빛의 정도이다
.여기서 중요한 것은 Radiance, Irradiance가 어떤 의미인지 감을 잡고 지나가면 된다. 너무 깊게 PipeLine을 이해하고, 각각의 의미가 무엇인지 공부하려고 하면 끝이 없다.
하지만, 위와 같이 다양한 Transformation 과정에서 Noise가 발생한다. 따라서 취득한 영상 혹은 취득 과정에서 보정을 위한 후처리가 요구된다.
Computational Photography
그렇다면 이상적인 카메라는 어떠한 특성을 가질까? 무한한 해상도와 줌 기능을 가지며, 거리에 상관없이 모든 객체가 초점이 맞으며, 노이즈와 모션 블러가 없어야 한다. 또한, 무한한 Dynamic Range를 가져야 하는데, Dynamic Range는 영상이 동시에 명확하게 표현 가능한 가장 어두운 부분과 가장 밝은 부분의 밝기 범위(비율)을 의미한다. 객체의 뒤에 광원이 있으면 카메라는 더 밝은 광원에 초점을 맞추기 때문에, 객체는 상대적으로 어두워져 역광 현상이 발생하여 객체를 명확히 표현할 수 없다. 이상적인 카메라는 이것도 처리해야 한다.
이러한 카메라는 존재하지 않기 때문에 Computational Photography가 요구된다. Computational Camera는 Camera의 Hardware 자체를 변화하여 성능을 향상시키지만, Computational Photography는 Algorithm 적으로 기계적 한계를 보정하는 것이다. 우리가 카메라로 사진을 찍을 때 "화질이 좋다"라고 표현하는데, 이는 물론 센서 자체의 성능이 좋기도 하지만, 영상을 보정하는 Algorithm의 성능이 좋기 때문이기도 하다. 이를 Computational Camera(Photography)라 칭한다.
Camera Calibration
Calibration은 보정을 의미한다. 카메라를 보정하는 방법은 Geometric과 Photometric이 있다.
Geometric은 기하학적 관점에서의 보정으로 왜곡 보정이 있다. 영상은 현실 세계(3D)에서 이미지(2D)로의 변환이 요구되기 때문에 왜곡이 발생한다. 따라서 이를 보정 해 주기 위한 Camera Calibration 과정은 왼쪽과 같이 체커보드를 이용하여 카메라의 Intrinsic Parameter, Focal Lenght, Distortion 등을 추정하여 보정하는 것이다.
Photometric Calibration은 밝기, 색상, Noise 등에 대한 보정을 의미한다. 오른쪽 Macbeteh Color Checker Board는 각 색상을 완벽하게 물리적으로 재현한 것으로, 백색광을 각 색상에 투영하여 반사된 빛을 포착하였을 때 해당 색상을 정확하게 표현하는지 파악하여 보정을 진행한다. 예를 들어 완벽한 Magenta 색상의 경우 (1,0,1)을 나타내는데, 실제 해당 색상을 측정하였을 때 (1,0,1)이 아닌 다른 값이 나오게 된다면 이를 보정하는 것이다. 이를 위해 Energy에 따라 취득되는 각 색상의 R,G,B Value 통해 CRF를 추정하는데 사용된다. 이외에도, Gamma Correction, White Balancing 등이 Photometric Calibration에 포함된다.
Photometric Calibration
Photometric Calibration에서 사용되는 것이 바로 Camera Response Function(CRF)이다. CRF는 카메라 센서가 실제 빛의 세기를 디지털 이미지 값(Intensity)로 변환하는 과정을 설명하는 함수로, 각 색상에 대한 CCD Sensor가 Exposure 즉, 받아들이는 광자의 양에 따라 Intensity로 변환하는 수치를 수학적으로 표현한 것이다. 입력되는 빛의 양이 Log Scale로 표현되어 있기 때문에 Nonlinear한 특징을 보이지만, 단조 증가의 경향성을 보임을 확인할 수 있습니다. 이때, Log Scale로 표현되는 이유는 Exposure의 범위가 매우 크기 때문에 Large Scale Value를 표현하기 위함이다.
CRF는 각 센서의 특성을 나타내기 때문에 일반적으론 비공개이다. 우리는 CRF를 통해 각 센서가 특정 색상에 반응하는 정도를 알아낼 수 있고, 이를 기반으로 보정을 진행한다.
Photometric Calibration을 수행하는 방법에는 왼쪽과 같이 Integrating Sphere(광원을 균일하게 분산시키는 장치)를 이용하기도 하며, 앞서 설명한 Color Checker를 이용하기도 한다. 하지만, 앞으로 우리는 서로다른 노출값을 가지는 여러 이미지를 통해 보정하는 방법을 살펴 볼 것이다.
Exposure(노출값)이라는 개념이 다시 등장하는데 까먹었다면 다시 보고오자.
Dynamic Range
실제 환경에서는 High Dynamic Range 즉, 서로 다른 밝기 값을 가지는 Scene이 존재한다. 가장 위쪽에 암실과 같은 공간에서의 밝기를 1이라고 하면, 광원인 태양을 찍은 영상은 2,000,000의 밝기를 가진다. Log Scale을 적용한다고 하면 어두운 환경 대비 밝기가 2,000,000배이기 때문에 약 $10^6$ 즉, 6칸 이상 차이가 난다. 이러한 High Dynamic Range를 영상에 동시에 표현하는 것은 불가능하다.
일반적으로 카메라로 영상을 촬영하면 가운데와 같이 넓은 범주의 밝기값을 한번에 표현할 수 없다. 창문 쪽은 광원으로 부터 많은 빛을 받는 High Energy 영역이며, 창문을 뒤로하여 위치한 화분은 역광으로 Low Energy 영역이다. 우리가 원하는 것은 영상의 모든 영역이 명확히 표현되는 것이기 때문에 이러한 Dynamic Range를 모두 잘 표현해는 것이 목표이다.
Radiance Map
노출값을 조절하는 방법에는 Shutter Speed와 Aperture이 있지만, Aperture를 조절하면 DoF 즉, 심도가 달라지기 때문에 동일한 Scene에 대한 서로 다른 Exposure의 영상을 얻을 수 없다. 따라서, Shutter Speed를 변화시켜 가면서 노출값이 다른 동일한 영상을 취득한다. Shutter Speed를 감소시키면서 노출값을 감소시켜 취득한 영상이 왼쪽과 같다.
영상에서의 밝은 부분(광원, 창문)은 빛의 양이 많이 때문에 노출값이 적은 영상에서 더 명확하게 보인다. 반면, 천장, 바닥 등은 어둡기에, Shutter Speed를 증가시켜 노출값이 큰 영상에서 명확히 보인다. 이때, High Energy를 가지는 부분은 이미 포화되어 255로 표현됨을 확인할 수 있다.
이렇게 다양한 노출값에서 취득한 영상을 결합하여 만든 것이 Radiance Map이다. 빛도 결국 Energy이기 때문에, Radiance Map이란 Energy 방출 Map으로, 영상의 각 픽셀(영역)에서의 Energy(밝기)를 나타내는 Map이다. 우리는 영상의 부분 영역이 어떠한 Exposure에서 가장 명확히 보이는지 알기 때문에, 해당 영역의 Energy를 아는 것이고, 결국 영상 전체의 Energy 분포를 기반으로 Dynamic Range를 가지게 한다면 해당 영상을 보정할 수 있는 것이다.
야간 촬영을 예로 들어보자. 별, 달, 조명 등의 부분은 큰 Energy를 가지고, 하늘이나 배경은 작은 Energy를 가질 것이다. 따라서 한번 촬영 시 여러 노출값을 가지는 영상을 취득하여 결합한 뒤 Radiance Map을 생성하여 해당 Dynamic Range를 포괄하는 High Dynamic Range 영상을 결과값으로 반환한다.
Radiance Mape의 다른 예시인데, 위 6장의 Low Dynamic Range 영상을 기반으로 생성한 예시이다. 창문 밖의 영역은 밝기 때문에 High Energy 분포를 띔을 확인할 수 있다.
그렇다면 어떻게 High Dynamic Range(HDR) 영상을 생성할 수 있을까?
우리는 동일한 Scene에 대하여 노출값에 따른 다중 영상을 취득한다. 앞서 말한 것 처럼, 각 노출값에 따른 명확히 보이는 픽셀들을 얻을 수 있다. 왼쪽과 같이 노출값이 큰 영상에서는 낮은 밝기(Radiance)를 가지는 픽셀들이 많은 것이며, 오른쪽과 같이 노출값이 작은 영상에서는 큰 밝기를 가지는 픽셀들이 존재한다. 따라서 이를 Count하여 Histogram을 생성한 것이 아래 그래프이다.
우리는 이를 보정하여 오른쪽 아래와 같이 HDR Image를 생성할 수 있다. 가장 눈에 띄게 보이는 부분은 하늘에 대한 영상이 노출값이 큰 영상에서는 구름과 하늘이 구분이 안되었지만, 이를 다른 노출값을 가지는 영상으로부터 보정하여 HDR Image에서는 구분이 됨을 확인할 수 있다.
Imaging System Response Function
Camera는 Exposure(Irradiance) 즉, 센서에 들어오는 빛을 0~255의 Range로 Pixel Intensity를 표현해야 한다.
따라서 우리는 Exposure을 Pixel Value로 표현하는 System Response Function $f$를 복원해야 한다. 앞으로는 그 방법을 배울 것이다. 그 전에, 실제로 CCD Sensor로 들어오는 Exposure은 Radiance 즉, Scen 자체의 빛이 Shutter Speed에 의해 결정되는 $\delta t$만큼 들어오기 때문에 위와 같은 공식이 성립한다. 해당 Value는 값이 매우 큰 범위를 가지고, 이를 0~255의 Pixel Intensity에 할당하는 함수를 복원해야 하기에, Log Scale을 취하여 Pixel Value와의 관계를 고려한 System Response Function을 구하게 된다. 또한, log Scale을 취함으로써 곱셈을 덧셈 연산으로 변환하여 계산의 편의성을 가진다.
Exposure을 조절하는 방법은 위와 같이 여러가지가 있는데, 가장 쉽고 정확한 Shutter Speed를 기반으로 노출값을 조절한다. 앞서 언급한 것 처럼, F 값을 변화시키면 심도가 다른 영상을 얻게 되며, Filter를 사용하면 Exposure이 다른 영상을 취득하는데 제한적이다.
Shutter Speed는 실제로는 2의 지수승으로 변하지만 오른족과 같은 범주를 가지며, 다양하게 노출값을 조절하고 정확하며 재현가능한 장점이 있다.
SRF Recovery Algorithm
SRF를 복원하는 과정을 살펴보자. 위와 같은 전체적으로 어두운 영상을 가정하고, 그 중 가장 어두운 Pixel을 1, 중간 어두운 밝기를 가지는 Pixel을 2, 그나마 밝은 Pixel을 3이라 하자. 그리고 $\delta t$를 변경 해 가면서 즉, Shutter Speed를 늘려가면서 각 화소의 밝기가 밝아짐을 확인할 수 있다.
우리가 구하고자 하는 SRF $f$는 Exposure를 Input으로 하여 Pixel Value $Z$로 할당된다. Exposure은 Scene의 밝기를 센서가 $\delta t$만큼 열려 있는 동안 받아들인 노출값이다. 이를 Log Scale를 취하면 Radiance와 $\delta t$의 Log를 취한 덧셈으로 표현된다.
1번 픽셀이 원래 가장 어두웠고, 3번 픽셀이 가장 밝았으므로, 해당 Pixel Value는 왼쪽과 같이 표현 될 것이다. 그리고 $\delta t$가 점점 증가함에 따라 각 Pixel의 밝기는 증가 할 것이고, 3번 픽셀의 경우 원래 밝았기 때문에 255에 수렴해 가는 것을 볼 수 있다.
하지만 $\delta t$를 변경 하면서 얻은 것은 Radiance는 동일한 상황이다. 즉, 센서를 더 오래 열어서 많은 빛을 받아들이는 것이 아닌, 실제로 어둡고 밝은 부분의 Exposure를 Pixel Intensity로 할당해야 한다. 실제 Scene의 밝기는 $\delta t$가 아닌, 각 영역의 밝고 어두움에 의해 결정되기에 Radiance 자체의 차이를 적절히 Pixel Intensity로 변환해야 한다.
따라서 이를 고려하여 Exposure에 따른 Pixel Value(Intensity)를 plot하면 오른쪽과 같다. 따라서 $f$만 특정할 수 있으면, Exposure에 따른 0~255의 Pixel Intensity를 할당할 수 있다. 이때, $f$는 단조 증가이므로, $f$의 역함수는 존재하고 이를 아래와 같이 정의하자.
$$g = f^{-1}(Z)$$
이제 $f$를 구하기 위해 $g$의 관점에서 생각 해 보자.
$$f(log\,Radiance_i + log\,\delta t_j) = Z_{ij}$$
앞서 소개한 그래프를 $f$를 이용하여 함수화 하면 다음과 같이 표현할 수 있다. 이를 역함수 관점에서 보면,
$$log\,Radiance_i + log\,\delta t_j = g(Z_{ij})$$
위 수식을 해석 해 보면, $i$ Pixel의 Radiance와 $j$ Image을 얻을 때의 $\delta t$의 Log Scale Sum이 $j$ Image에서 $i$ Pixel의 Intensity를 $g$의 인자로 하여 얻은 값과 동일하다는 것이다. 위 수식을 만족하는 함수 $g$를 역함수로 하는 $f$가 결국 Exposure을 Pixel Intensity로 정확하게 할당하기 위해서는 위 수식을 만족해야 한다. 그리고 이는 하나의 Pixel이 아닌 모든 Pixel에 대하여 해당 수식을 만족해야 하기에 최적화 과정이 요구된다.
Solve Linear System(Regression)
fitting term을 보면 앞서 표현한 수식에서 오른쪽 $g(Z_{ij})$항을 왼쪽 항으로 옮겨 오차를 구하는 부분이다. 만약 $f$가 이상적이라면 둘의 차이는 0에 수렴할 것이다. 이때, $i$는 영상의 Pixel Resolution, $j$는 $\delta t$가 다른 영상의 개수를 의미한다. 해당 알고리즘이 소개된 논문에서, $g()$는 7차 함수로 제안했기에, 현재 모르는 미지수는 8+N*P 가 된다.
왼쪽 smoothness term은 완만한 커브를 생성하기 위한 보정수치인데, $g()$의 2차 미분항이 사용된다고만 받아들이고 넘어가자.
이를 각각의 체널에 대하여 수행하면 위와 같이 $f_A, f_B, f_C$를 얻을 수 있다.
지금까지 한 과정을 생각 해 보자.
우리는 HDR Image를 생성하기 위하여, Exposure에 따라 Pixel Intensity를 0~255의 범위로 할당하는 SRF의 함수를 복구하는 방법을 배웠다.
위 영상에서의 Radiance Map을 생각 해 보자. Low Energy와 High Energy는 약 $2 \cdot 10^5$정도 차이가 난다. 위에서 구한 SRF를 이용하여 Log Scale을 취한 Input을 사용한다 해도, 0~255 Pixel Intensity로 할당하기에는 너무 큰 Dynamic Range를 보인다. 따라서 이를 Low Dynamic Range(LDR)로 축약시킬 필요가 있다.
Tone Mapping
Dynamic Range를 줄이기 위하여 단순히 Linear하게 줄여보자. HDR의 낮은 Energy를 0, High Range를 1로255로 할당하여 선형적으로 줄이게 된다면 오른쪽과 같은 결과가 나온다. High Energy 영역만 표현되고 나머지는 모두 검은색을 띄는것을 알 수 있는데, 이는 대다수의 화소가 Low Energy를 가지지만, 이를 선형적으로 축소시켰기 때문에 모두 검은색으로 표현된다.
이처럼, 단순한 Linear Scaling은 부정확한 결과를 도출한다.
따라서, 어두운 부분은 유지하면서 밝은 부분(High Energy)를 범위 안으로 축소시켜야 한다. 쉽게 떠오르는 함수는 Log 함수이지만, 이는 수렴하지 않기 때문에 문제를 완벽히 해결할 수 없다. 이때 사용되는 것이 Reinhard이다.
Reinhard를 사용한다면, 작은 값들은 넓게 펴주고, 큰 값은 압축시켜 많은 변화량이 있어도 조금만 변하기에(압축) HDR을 LDR로 만들 수 있다. 또한, $L_{world}$를 무한대로 보내면, 1에 수렴하기 때문에 Maximum도 보장 가능하다. 따라서 HDR Rediance Map을 생성하여 LDR로 변환시켜 8Bit Pixel Intensity에 할당하여 영상을 생성하는 것을 Tone Mapping이라 한다. 이때, Non-Linear Reinhard가 사용된다.
이렇게 생성된 영상은, HDR을 모두 잘 표현하는 것을 확인할 수 있다.
해당 결과는 HDR 중 어두운 영역의 0.1% 정도를 0~255의 값으로 할당하고, 그보다 큰 Energy는 모두 255로 할당하여 Tone Mapping한 결과인데, Reinhard Operator을 사용한 결과와 별 차이가 없다. 즉, 많은 부분의 화소가 어두운 부분에 모여있기에, 단순한 Linear Scaling은 적절한 결과를 도출하지 못함을 의미한다.
'2024 > Study' 카테고리의 다른 글
[ 컴퓨터 비전 ] Ch5. Deep Learning...1 (0) | 2024.11.23 |
---|---|
[ 영상 처리 ] Ch11. Computational Photography(2) (0) | 2024.06.08 |
[ GRAPH ] Topological Sorting (0) | 2024.06.02 |
[ 영상 처리 ] Ch8. Clustering and Segmentation(3) (0) | 2024.06.01 |
[ 영상 처리 ] Ch8. Clustering and Segmentation(2) (0) | 2024.06.01 |