[계산사진학] Edge Aware Image Filtering - Bilateral Filtering

JAEYOON SIM·2021년 10월 13일
2

Computational Photography

목록 보기
14/34
post-thumbnail

Edge Aware Filters

Filter는 다양한 computer vision이나 graphics 분야에서 fundamental building block의 역할을 한다. 이러한 filter의 하나로 특수한 경우가 바로 edge aware filter이다. Edge aware filtersms 작은 디테일들을 smooth하게 만들면서 구조적인 edge들은 보존하는 filter다. 이를 이해하기 위해서 다음 예시를 보도록 하자.
좌측의 이미지는 noise가 심한 이미지이다. 여기서 noise는 아무래도 얼굴에 있는 작은 점들이 될 것이다. 우리의 목적은 이 이미지로부터 noise만 제거하고 얼굴이나 머리와 같은 edge들은 그대로 보존하는 것이다. 만약 이를 위해서 linear filter나 Gaussian filter를 이용하게 되면 아마 noise가 제거될 수는 있어도 전체적인 이미지는 blurry하게 될 것이다. Edge는 그대로 남겨야 하기 때문에 이러한 filter 대신에 edge aware filter를 사용할 것이다. 이번에는 많고 많은 edge aware filter 중에서 bilateral filter에 대해서 알아볼 것이다.

Bilateral Filter

Bilateral filter는 Tomasi와 Manduchi에 의해서 1998년도에 발표 되었다. Bilateral filter의 유용함 덕분에 이후에 많은 변형 된 버전이 나오기도 했다. 다시 위의 예시를 보도록 하자.
원본 이미지로부터 최대한 noise는 제거하고 edge는 보존해야 한다. 보통 noise는 high frequency component가 대부분이다. 결국 우리의 목표는 이러한 high frequency component를 제거하는 것이다. 원래 이러한 high frequency component를 제거하기 위해서 lowpass filter를 주로 사용했다. 그런데 그냥 lowpass filter를 사용하면 이미지 전체가 blurry해지는 결과가 나타나기 때문에 만족스럽지 못하다. Noise를 제거는 했어도 edge는 보존하지 못했기 때문이다. 아무래도 Guassian filter 같은 경우에는 edge에 대해서 고려하지 않는다. 그래서 Guassian filter 대신 edge aware filter를 사용하면 edge를 인식하기 때문에 전체적으로 smooth해지는 것을 막을 수 가 있다.

Problem with Gaussian Filtering

Bilateral filter의 핵심 아이디어를 살펴보기 전에, Gaussian filter의 문제점에 대해서 조금 자세히 보려고 한다.
Gaussian filter를 적용할 때, 우리가 정말로 해야하는 것은 이미지의 각 픽셀마다 작은 window를 crop하여 Guassian kernel과 dot product를 진행하는 것이다. Dot product의 결과로 하나의 output intensity 값을 얻을 수 있고, output 이미지의 같은 지점에 이 값을 넣으면 된다. Gaussian filtering는 이렇게 간단하게 진행이 된다. 이때, 중요한 점은 모든 픽셀에 같은 Gaussian kernel을 사용한다는 것이다. Edge가 심하게 존재하는 patch에 대해서 Gaussian kernel을 곱하게 되면 차이가 극명하게 드러나는 intensity 값이 혼합되어 edge마저도 smooth하게 된다. 바로 이러한 부분이 Gaussian filter의 문제점이다.

Bilateral Filtering Solution

이러한 부분을 막는 것이 중요하며 edge를 보존하여 noise만 제거해야 한다. 그러기 위해서 Gaussian filter 대신에 edge aware filter의 일종인 bilateral filter를 사용하게 되는 것이다. 이미지 patch의 특성을 고려해서 kernel의 모양을 다르게 하여 filtering을 해주면 된다. 첫번째 patch를 보면 아무런 edge 요소가 보이지 않기 때문에 gaussian kernel과 같이 진행해주면 된다. 문제는 두번째 patch이다. 이 patch에는 edge 요소가 두드러지게 나타난다. Output intensity 값을 계산해주기 위해서 한쪽 부분만 픽셀 값들을 blend 해주고 반대 부분은 해주지 않게 된다. 그리고 세번째 patch같은 경우에는 극명한 차이가 없어 전체적으로 blend를 해주게 된다. 그래서 bilateral filter는 대충 이러한 식으로 계산을 통해서 output 이미지를 만들게 된다.

Bilateral Filtering vs Gaussian Filtering

지금부터 어떻게 bilateral filtering이 정의되는지 보도록 하자. Bilateral filter는 다음과 같이 정의가 된다.
hh은 output 이미지, m,nm,n은 픽셀의 위치, 1Wmn\frac{1}{W_{mn}}은 normalization factor, gg는 spatial weighting function, rmnr_{mn}은 intensity range weighting function, ff는 input 이미지를 가리킨다. 사실 이 정의는 Gaussian filter의 정의와 굉장히 유사하다. 그렇지만 약간의 차이는 존재한다. 그럼 이제 두 filter의 정의가 어떻게 다르고 각각의 component가 어떠한 역할을 하는지 살펴보도록 하자.

Gaussian filter와 Bilateral filter의 정의를 함께 보도록 하자. Gaussian filtering에서는 같은 spatial weighting function이 모든 픽셀과 곱해지고 있다. 이러한 식은 convolution operation의 정의를 따르고 있다. Bilateral filter도 보면 똑같이 spatial weighting function이 곱해지고 있다. 이러한 function은 target 픽셀 부근에서 큰 비중으로 이뤄지게 된다. Gaussian filter의 목적은 주변의 픽셀과 비슷하도록 값을 blend해주는 것이다. 그래서 spatial weighting function은 target 픽셀에 가까울수록 큰 값을 곱해주게 된다.

Bilateral filter에서는 intensity range weighting function의 역할도 중요하다. Intensity range weighting function의 역할은 target 픽셀과 비슷한 intensity 값을 가지는 픽셀에 더 큰 weight를 부여하는 것이다. 이 함수는 Gaussain spatial weighting function과 비슷하게 생겼다. 다른 점은 Gaussian spatial weighting function은 픽셀 distance를 기반으로 하고, intensity range weighting funtion은 input 이미지의 intensity difference를 기반으로 한다. 그래서 비슷한 intensity 값을 가지는 픽셀에 더 큰 weight를 부여하게 된다. 따라서 intensity range weighting function에 의해서 output 이미지 픽셀은 input 이미지 픽셀과 비슷한 intensity를 가지게 되면 더 큰 영향을 주게 된다. 이 부분이 bilateral filter에서 가장 중요한 포인트가 될 것이다.

한가지 더 다른 부분은 bilateral filter에 있는 normalization factor다. Normalization factor는 output 이미지를 normalize하는 역할을 한다. Gaussian filter는 이러한 normalization 과정이 필요하지 않다. 대부분의 spatial weight 값의 합이 1이기 때문이다. 반면 bilateral filter는 2개의 weight fucntion이 존재한다. 이들의 합은 더이상 1이 되지 않기 때문에 normalization factor가 필요한 것이다.

Bilateral Filter Visualization

더 나은 이해를 위해서 bilateral filter에서 weight를 visualization한 것을 보도록 하자.
Input 이미지에서 노란색의 target pixel이 어떻게 output 이미지에 채워지는지 visualization 과정을 통해서 살펴보면, spatial range weighting function과 intensity range weighting function의 곱으로 만들어진 bilateral filter를 통해서 값이 정해지게 된다. Spatial range weighting function은 input 이미지의 모든 픽셀에 대해서 적용이 된다. 그래서 만약에 intensity function이 없다면 output 픽셀은 1번 지역의 값들과 2번 지역의 값들의 blend를 통해서 결정이 될 것이다. 만약 이렇게 된다면 edge는 보존되지 않을 것이다. 그래서 intensity function의 도입으로 1번 지역에는 낮은 weight를, 2번 지역에는 높은 weight를 부여하는 역할을 통해서 blend 시 오로지 2번 지역의 값들을 강하게 부각시키고 1번 지역의 값들은 피하도록 만드는 것이다. 이러한 과정을 통해서 edge를 보존하도록 만드는 bilateral filter를 역할이 이루어지는 것이다.

Bilateral Filter Parameter Space

Bilateral filter는 σr\sigma_r, σs\sigma_s 2개의 parameter를 가지게 된다.
Bilateral filter의 정의를 보면 서로 다른 2개의 weighting function이 있는 것을 볼 수 있다. 이 2개의 function은 Gaussian function이고, 각각의 function은 σ\sigma에 의해서 조절이 된다. 이 값을 Guassian function의 크기를 결정하게 된다.

σs\sigma_s는 spatial weighting function의 크기를 조절하고, σr\sigma_r은 intensity range weighting function의 크기를 조절한다. σr\sigma_r의 크기가 작다는 것은 Gaussain kernel의 circle 크기가 작다는 것이고, 이는 서로 차이가 매우 작은 intensity 값들을 이용해서 blend하기를 원하는 것이다. 반대로 σr\sigma_r의 크기가 크다는 것은 Gaussian kernel의 circle 크기가 크다는 것이고, 이는 서로 차이가 매우 큰 intensity인 경우에도 큰 weight을 부여하겠다는 이야기다. σr\sigma_r가 무한대로 커지게 되면 모든 intensity 값에 constant weight을 부여하겠다는 것이다. 이 이야기는 더이상 intensity range weighting function을 사용하지 않겠다는 의미와 같다. 이 parameter들의 서로 다른 조합을 통해서 다른 결과를 만들어내게 된다. σs\sigma_s의 값을 키우게 되면 spatial weight의 범위를 넓히게 되어 작은 디테일들을 효과적으로 제거할 수 있다. σr\sigma_r의 값을 키우게 되면 intensity 값의 차이가 큰 edge를 제거할 수 있다.

Does Bilater Filter Respect All Edges?

지금까지 intensity range weighting function을 통해서 edge를 고려해왔다. 그렇다면 bilateral filter가 모든 edge를 고려할 수 있을까? 답은 "NO"이다. Intensity range weighting function은 단순하게 intensity 값을 통해서 계산을 했다. 이 이야기는 비록 edge로 분리가 되어있다고 하더라도, 비슷한 intensity 값을 가지는 픽셀은 여전히 같이 blend 된다는 것이다.
3번째 patch에서 target 픽셀과 근처에 있는 픽셀은 비슷한 intensity 값을 가지고 있다. 그렇기 때문에 비록 이들 사이에 edge가 있다고 하더라도 큰 weight를 부여받게 될 것이다. 아마 대부분의 경우에 이러한 점은 문제가 될 것이다. Bilateral filtering에서 단지 intensity 값이 비슷하다는 이유로 ouput 이미지의 target 픽셀은 다른 object의 픽셀에 의해서 영향을 받을 수 있다. 그래서 이를 막기 위해서 다른 approach가 등장하게 된다. 이미 다른 filter들은 이를 해결하도록 만들어져 있으며, 이번에는 다루지 않을 것이다.

Applications

Bilateral filter는 매우 다양한 application을 가지고 있다. 그 중 하나가 바로 이미지 denoising이다.
대부분의 noise는 high frequency component이다. 이는 lowpass filter에 의해서 쉽게 제거될 수 있다. 그리고 bilateral filter를 통해서 edge를 보존하면서 noise를 제거할 수 있다. 결과를 보면 edge가 보존되면서 noise가 사라진 것을 볼 수 있다. 또 다른 예시로는 tone mapping이 있다.
Gaussian filter와 비슷하게 bilateral filter도 서로 다른 frequency로 분해하는데 이용될 수 있다. 원본 이미지를 보면 너무 밝은 부분과 너무 어두운 부분이 대조되어 있어 디테일을 파악하기 어렵다. Tone mapping이라는 것은 intensity를 조절하여 디테일을 살리는 것을 말한다. Histogram equalization과 비슷해보이지만 다른 이론이 적용된 것이다. Tone mapping에서 low frequency component는 intensity를 compress하고 high frequency component는 디테일을 amplify한다. 이러한 원리로 bilateral filter이 frequency decomposition에 적용이 될 수 있다. 다음은 photo retouching이다.
Bilateral filter를 통해서 이미지를 더욱 매력있게 만들 수 있다. 얼굴같은 경우 잡티가 많이 존재하는데, 이를 filtering을 통해서 제거할 수 있다. 이러한 photo retouching은 이미 많은 카메라나 핸드폰에 적용이 되어 있다. 다음으로는 흥미로운 application이다.
어두운 환경에서 찍힌 사진이 있다고 해보자. Input 이미지가 너무 많은 noise를 가지고 있다. 이러한 경우에 noise와 edge를 구분하기 어려울 수 있다. 그래서 이렇게 심한 경우에는 conventional denoising 알고리즘은 제대로 동작할 수 없게 된다. 그래서 flash/no-flash denoising이라는 것이 등장하게 된다. 빛이 너무 없는 경우에는 빛을 필요로하게 된다. 그래서 같은 장면을 빛이 있는 환경에서 촬영하게 되면 다음과 같이 이미지가 만들어질 것이다.
하지만 이러한 결과는 부자연스럽다. 왜냐하면 빛이 있는 환경인데 object에 대해서 그림자가 존재하지 않기 때문이다. 그래서 이러한 결과는 빛이 정면에서 발싸되어 그림자가 object 뒤에 존재한다고 생각하면 이상적이게 된다. 이러한 부분 때문에 빛을 사용하게 되었을 때 문제가 발생하는 것이다. 하지만 우리는 이를 이용할 수 있다. 빛이 존재하는 환경에서 찍힌 장면을 이용해서 원래 어두운 환경에서 찍힌 이미지의 noise를 제거할 수 있다. 이러한 아이디어로부터 생긴 것이 바로 flash/no-flash denoising이다.

Joint Bilateral Filter

이러한 아이디어를 사용하기 위해서는 기존의 bilateral filter의 정의를 다음과 약간 수정해야 한다.

h[m,n]=1Wmnk,lg[k,l]rmn[k,l]f[m+k,n+l]h[m,n] = \frac{1}{W_{mn}}\sum_{k,l}g[k,l]r_{mn}[k,l]f[m+k,n+l]

Intensity range weighiting function이 원래의 이미지가 아닌 빛에 의해 촬영이 된 guide 이미지로부터 계산이 되는 것이다. 그러면 더 정확한 intenstiry range를 계산하게 되어 edge를 보존할 수 있게 된다. 이러한 아이디어는 많은 분야에 사용이 될 경우에 대해서 매우 효과적이다. 하나의 예로 다음과 같이 depth map denoising에도 사용이 된다.
RGB 이미지와 depth map이 있다고 해보자. Depth map은 기본적으로 각각의 object가 카메라로부터 얼마나 멀고 가까운지를 보여주는 정보다. 진한 파란색일수록 카메라에 가깝고, 노란색과 밝은 파란색일수록 카메라로부터 멀다는 것이다. 이러한 depth map은 특수한 카메라에 의해서 촬영이 된다. Conventional depth 카메라는 많은 noise를 가지게 된다. 이러한 경우 noise를 제거하기 위해서 joint bilateral filter를 사용한다. RGB 이미지의 정보를 사용해서 depth map의 noise를 제거하면 된다.

profile
평범한 공대생의 일상 (글을 잘 못 쓰는 사람이라 열심히 쓰려고 노력 중입니다^^)

2개의 댓글

comment-user-thumbnail
2022년 10월 17일

Bilateral filter에 대해 쉽게 설명해주셔서 감사합니다! 도움이 많이 되었습니다.

답글 달기
comment-user-thumbnail
2023년 2월 24일

유익한 게시물 감사합니다! visual 예시들이 훌륭하네요. 혹시 게시글에 사용된 슬라이드들이나 3D 그래프는 어떤 툴로 만드신 건가요?

답글 달기