초보 개발자의 이야기, 릿허브

[CV] Bilateral Filter (양방향 필터) 본문

개념정리/📖 개념

[CV] Bilateral Filter (양방향 필터)

릿99 2023. 12. 6. 19:16
728x90
반응형

Bilateral Filter

 

 

1. Introduction

 

우리는 일상생활에서 수많은 이미지를 접하게됩니다.

이러한 이미지들은 모두 '픽셀(pixel)'이라는 색상 정보를 포함하는 요소로 구성되어있습니다.

각 픽셀은 RGB 값으로 색상을 나타내며 각 색상의 강도(intensity)를 나타냅니다.

이 강도는 일반적으로 0~255 범위의 단일 바이트로 개별적으로 표시됩니다.

 

Example of color image patch

 

오늘 소개할 Bilateral filter(양방향 필터)는 image transformation technique의 일종으로 그 중에서도 filtering의 일종입니다.

Filtering이란 이미지의 각 픽셀 값을 변경하는 것을 의미합니다.

이 "intensity" 값을 변경하는 것은 이미지의 "range"를 변경하는 것으로 표현되기도 합니다.


아래 그림은 image filtering의 예시로, 다양한 이미지 필터를 보여줍니다.

임의의 이미지 'F' 에 임의의 filter 'h'를 적용한 결과, 'G'와 같이 filtering된 이미지가 출력됩니다.

보시다시피 이미지의 높이나 너비에는 변화가 없으나, pixel intensity, range가 변경된 것을 볼 수 있습니다.

 

Example of the image filtering

 

다음은 다양한 이미지 필터와 시각화 결과입니다.

(a)의 경우 중앙에 1, 주변은 '0'으로 이루어진 filter로, 이를 이미지에 적용하면 중앙 부분이 강조된 이미지가 출력됩니다.

이러한 filter를 Edge detection filter라고 하며 이는 이미지의 중요한 정보 중 하나인 edge, 가장자리를 감지하는 데 사용됩니다.

다음 (b)와 (c)는 Gaussian filter의 일종으로, 이미지를 부드럽게 하거나 노이즈를 줄이는 데 사용됩니다.

이미지의 중앙 부분은 유지되고 주변 부분은 흐려집니다.

 

Example of filter kernels

 

오늘 소개할 Bilateral filter는 앞서 언급했듯 위와 같은 이미지 filtering의 일종입니다.

Bilateral filtering은 아래 그림과 같이 가장자리를 유지하면서 이미지를 매끄럽게(smoothing) 만드는 기술입니다.

이는 영상의 spatial한 부분과 intensity(range) 부분을 모두 고려하기 때문인데요,

제안하는 방법에 대해서는 아래에 더 자세하게 기술하도록 하겠습니다.

 

Application example of bilateral filter

 

 

2. Related work

 

Bilateral filter를 이해하기 위해서는 먼저 Gaussian filter(가우시안 필터)에 대한 이해가 필요합니다.

Gaussian filter는 아래와 같이 Gaussian kernel을 이용하여 영상을 처리하는 필터입니다.

Image smoothing, noise reduction, blurring 등에 사용됩니다.

아래 그림은 Gaussian filter를 적용한 결과로,
왼쪽의 입력 영상에 Gaussian filter를 적용하면 오른쪽 그림과 같이 전체적으로 흐릿한 영상이 나타납니다.

 

Application example of Gaussian filter

 

Gaussian filter는 아래 식과 같이 표현됩니다.

 

Gaussian filter

 

이해를 위해 식을 단순화하여, 입력 이미지가 Grayscale 이미지라고 가정하겠습니다.

다음 방정식에서 I_p는 픽셀 위치 p의 이미지 값입니다.

||p − q|| 는 픽셀 위치 p와 q 사이의 Euclidean distance이고 G_sigma는 이미지에 적용된 Gaussian kernel입니다.

Gaussian kernel은 아래와 같은 형태로 표현됩니다.

 

Gaussian distribution and result according to sigma value


앞서 설명했듯, Gaussian filtering은 중심 위치 p까지의 spatial(공간적) distance에 따라 weight가 변화합니다.

즉, Gaussian filtering은 인접한 위치의 intensity에 대한 weighted  average입니다.
픽셀 q의 가중치는 Gaussian G_σ로 정의됩니다.

 

σ는 neighbor size를 정의하는 값으로, 픽셀의 값(intensity)이 아닌 픽셀 사이의 spatial distance에만 의존합니다.

예를 들어, 밝은 픽셀은 인접한 어두운 픽셀에 큰 영향을 미칩니다.

비록 이 두 픽셀 값이 다르더라도 말입니다.

즉, smoothing degree는 spatial degree(sigma)에 의해 조정됩니다.

결과적으로 불연속적인 픽셀의 평균이 함께 계산되므로 이미지 가장자리가 흐려지게(blurred)됩니다.
위의 그림과 같이 왼쪽으로 갈수록, 시그마 값이 클수록 중심보다 이웃 값을 더 많이 고려하게됩니다.

그래서 시그마의 값이 커질수록 원본에 비해 부드러워진 것을 알 수 있습니다.

 

아래 그림은 앞서 설명한 시그마 값에 따른 smoothing 변화의 또 다른 예입니다.

그림의 윗 행은 Gaussian kernel을 보여주고 아래 행은 해당 Gaussian kernel의 filtering으로 얻은 결과입니다.

σ 값이 높으면 훨씬 더 넓은 영역에 걸쳐 평균화가 수행되기 때문에 edge 정보가 손실됩니다.

 

Gaussian distribution and result according to sigma value

 

원본 이미지에서 noise를 최대한 제거하고 edge 정보를 보존하는 것은 주요한 challenge 중 하나입니다.

일반적으로 noise는 대부분 high frequency(고주파) 성분으로 구성됩니다.

궁극적으로 우리의 목표는 이러한  high frequency 성분을 제거하는 것입니다.


이러한 고주파 성분을 제거하기 위해 주로 low-pass filter가 사용되었는데,

그 대표적인 예가 앞서 말씀드린 Gaussian filter입니다.

그러나 앞선 결과를 통해 확인했듯, Gaussian filter를 사용하면 이미지 전체가 흐려지게됩니다.

즉, noise는 제거되나 edge 정보 또한 손실되게 됩니다.

이러한 이유는 Gaussian filter가 픽셀의 값(intensity)이 아닌 픽셀 사이의 spatial distance만 고려하기 때문입니다.

따라서, 이미지 edge 부근의 픽셀 값을 평탄화시키는 단점이 있습니다.

이러한 문제점은 Edge-aware filter를 사용하여 해결할 수 있습니다.



Application example of Gaussian filter

 

 

3. Bilateral filter

 

Bilateral filter는 Edge-aware filter의 대표적인 예 중 하나입니다.

Bilateral filter는 아래와 같이 이미지 패치의 특성을 고려하여 커널의 모양을 달리해 필터링하는 방법입니다.

 

Application example of bilateral filter


첫 번째 패치를 보면 Edge 요소가 없어 Gaussian 커널을 적용할 수 있습니다.

문제는 2, 3번째 패치입니다.

이러한 패치의 경우 Gaussian kernel의 개념을 취하되, 각 픽셀의 intensity value를 고려하여 커널을 구성합니다.

두 번째 패치에서는 상대적으로 왼쪽의 픽셀값이 더 밝고 오른쪽의 픽셀값이 어둡기때문에, 다음과 같은 커널을 사용하게 됩니다.

Bilateral filter는 대략 다음과 같은 계산을 통해 출력 이미지를 생성합니다.

 

Bilateral filter는 neighbor 픽셀의 weighted average로 정의되는데, 이는  Gaussian convolution과 매우 유사합니다.

두 방식간의 가장 큰 차이점이자  Bilateral filter의 가장 큰 특징은, edge를 보존하기 위해 intensity 차이를 고려한다는 것입니다.

 

Bilateral filter는 위와 같이 정의됩니다. 전체적인 구조는 이전 Gaussian filter 매우 유사합니다.

Bilateral filter는 다음과 같이 크게 3가지 종류로 구성됩니다.

 

Normalization factor W_p, Spatial weighting G_sigma_s, Range weighting G_sigma_r

 

기존 Gaussian filter에서 normalization factor와 range weighting이 추가된 형태입니다.

 

Definition of bilateral filter

 

이제 두 필터의 정의가 어떻게 다른지, 각 구성요소가 어떤 역할을 하는지 살펴보겠습니다.

 

1. Spatial weighting
Gaussian filter에서는 동일한 spatial weighting function이 모든 픽셀에 곱해집니다.

이 방정식은 convolution 연산의 정의를 따릅니다.

Bilateral filter 또한  spatial weighting function이 수행됩니다.

이 기능은 대상 픽셀의 근처(spatial한 관점에서)에서 큰 비율로 발생합니다.

Gaussian filter의 목적은 값을 주변 픽셀과 유사하도록 blending하는 것입니다.

따라서 spatial weighting function은 대상 픽셀에 가까울수록 더 큰 값을 곱해주게 됩니다.

 

2. Range weighting

Bilateral filter의 intensity range weighting은 매우 중요한 개념인 동시에, 가우시안 필터와의 가장 큰 차이점이기도 합니다.

Range weighting function의 역할은 대상 픽셀과 intensity가 유사한 픽셀에 더 큰 가중치를 할당하는 것입니다.

이 함수는 Gaussian의 spatial weighting function과 유사해 보이지만 상당히 다릅니다.

Spatial weighting function은 픽셀 간의 거리를 기반으로 하고, range weighting function은 intensity 차이를 기반으로 합니다.

따라서 비슷한 intensity 값을 가진 픽셀에 더 큰 가중치가 부여됩니다.

 

3. Normalization factor

Bilateral filterGaussian filter의 또 다른 차이점은 normalization factor입니다.

이는 출력 이미지를 정규화하는 역할을 합니다.

Gaussian filter는 대부분의 spatial weight의 합이 1이기 때문에 이러한 정규화 과정이 필요하지 않습니다.
반면에 Bilateral filter에는 두 가지 가중치가 있어, 그 합이 더 이상 1이 되지 않기 때문에 해당 인자가 필요합니다.

 

Definition and comparison of Gaussian filter and bilateral filter

 

앞서 설명한 Gaussian과 Bilateral filter를 시각화한 결과입니다.

먼저 Gaussian의 경우, 아래 그림의 오른편의 noisy한 계단 형태의입력 I_q가 들어오면
가운데 Gaussian filter를 사용하여 맨 왼쪽 형태와 같은 결과가 도출됩니다.

출력을 보면 입력에 비해 가장자리가 기울어지고 detail이 사라져, 전체적으로 부드러워지는 것을 볼 수 있습니다.

 

Visualization of Gaussian filter

 

반면 Bilateral filter의 경우, Gaussian filter와 달리 각 픽셀의 intensity 값인 range weight도 고려합니다.

따라서 그림을 보면 동일한 입력이 들어왔을 때, 각 픽셀 값에 적합한 spatial, range weight를 고려하여 필터가 생성되며,

edge 부분의 디테일은 살아있되, 전체적으로 매끄러워진 결과를 볼 수 있습니다.

 

Visualization of bilateral filter

 

최종적으로, Gaussian filter와 Bilateral filter의 차이에 대해 다시 한번 정리해봅시다.

Gaussian은 spatial distance만을 고려하여 전체 영상을 매끄럽게 만드는 기술로, 결과적으로 아래와 같이 전체적으로 흐릿한 영상이 됩니다.
반면, Bilateral은 spatial, range(intensity) distance를 모두 고려하여 픽셀의 공간과 강도에 따라 스무딩을 수행합니다.

따라서 Gaussian filter를 적용했을 때보다 모서리가 더 잘 보존되는 것을 볼 수 있습니다.

 

Comparison of result of gaussian filter and bilateral filter

 

 

4. Experiment result

 

Bilateral filter는 두 개의 매개변수 σs 및 σr를 갖습니다.

σs는 spatial weight parameter, σr은 range weight parameter입니다.

이러한 Bilateral filter의 spatial, range parameter를 통해 Gaussian에 비해 더 다양한 컨트롤이 가능합니다.


아래 그림은 필자가 구현한 Biternal filter 코드의 결과입니다.

사용된 이미지 크기는 512x512이며, 각 이미지당 약 1분 정도 소요되었습니다.

(built-in function을 사용하지 않고 구현했기에, 시간이 다소 소요되었습니다)

σs 값과 σr 값을 변경하여 출력을 확인한 결과, 각 값이 0에 가까워질수록 원래 값에 가까워지는 것을 확인할 수 있습니다.

그리고 각 값이 증가할수록 흐려지는 정도가 증가합니다.

 

Images according to changes in sigma value

 

Gaussian, Bilateral filter를 적용 및 비교한 결과는 다음과 같습니다.

σr 에는 10을, σs에는 50을 사용했습니다.

앞서 언급했듯, 동일한 입력 및 parameter 값에 대해 Gaussian은 전체적으로 흐릿한 이미지를 생성하는 반면

Bilateral은 상대적으로 edge를 보존하면서 노이즈가 제거된 이미지를 생성합니다.

 

Comparison of result of gaussian filter and bilateral filter

 

 

5. Conclusion

 

정리하자면, Bilateral filter는 spatial weight와 range weight를 사용하여
edge와 디테일을 유지하면서 이미지를 효과적으로 매끄럽게 만드는 기술입니다.

대표적인 low-pass filter인 Gaussian filter는 spatial distance에만 초점을 맞추고 전체적으로 흐릿해집니다.

반면, Bilateral filter 의 경우 spatial, range distance를 모두 고려하여
노이즈를 효과적으로 제거하면서도 edge가 선명한 영상을 얻을 수 있습니다.

 

 

 

728x90
반응형