Posts List

[컴퓨터비전] 4. Image Filtering (작성중)

Image Filtering

Filter는 사실 주파수 영역의 domain processing에서 가져온 개념이다. 주로 전자 신호의 고주파 성분을 삭제시키거나(ex. noise) 저주파 성분을 삭제시키는데 사용한다. 

영상에서의 filter는 Spatial filtering 즉 주파수 domain이 아닌 공간 domain에서 동작하는 필터이다. 

주파수가 있는 1D signal부터 살펴보면, 모든 신호는 고주파와 저주합의 조합으로 나타낼 수 있다. 이 원리는 사실 영상에서도 마찬가지다. 위 그림은 2D 이미지의 주파수를 표현한 것인데, 역시 원본 이미지는 저주파 이미지와 고주파 이미지의 조합이라고 할 수 있다.

※ 위 그림에서 High frequency를 삭제시키면 Low-pass filter이다. 주로 noise 가 High frequency에 해당한다.


Linear Filter

즉, Filtering에 대해서 다시 정의하면, 원본 이미지를 원하는 방법으로(kernel, filter) 연산(ex. convolution)을 통해 변형된 이미지를 얻는 방법이며, 대표적인 예로 low pass filter를 이용해 noise를 제거하는 것이 있다.

Linear 필터는 [머신러닝/딥러닝 : CNN] 에서 배운 convolution 연산과 정확히 동일한 필터이다. 위 그림의 파란색 이미지는 원본이미지이고, 노란색은 filter 혹은 kernel이라 한다. 그리고 각각을 element-wise sum하는 것이 convolution 혹은 linear filtering이라고 한다.

※ 위 그림은 전체 원본 픽셀의 평균을 구하는 average filter (혹은 box filter)를 보여준다. 주변 이미지의 평균값으로 새로운 이미지를 생성하기 때문에 우측과 같이 blur된 이미지로 변환해 준다. 

여기서 kernel을 어떻게 정의하느냐에 따라 원본이미지의 변화를 control 할 수 있다.


Gaussian 분포를 본따 만든 Gaussian filter는 대표적인 low-pass filter이다. 

Gaussian filter는 원본이미지의 픽셀 중심이 가장 큰 값을 가지게하고 주위의 weight는 낮게 가져감으로써 box filter를 적용했을 때 보다 원본 이미지를 더 보존하면서 high frequency를 삭제시킬 수 있다.

그 외에도 kernel을 잘 설계하면 위와 같이 이미지를 이동시키거나, sharpening 효과를 적용시킬 수 있다. (unsharp masking)

특히 sharpening filter는 high-pass filter라고도 볼 수 있는데,

위 convolution연산의 우측항은 원본의 흐릿한(low frequency) 성분을 빼 줬음으로(-) 또렷한(high frequency) 성분만 남아있고, 

그 이미지를 원본에 다시 더 해줌으로써 더욱 선명한 이미지를 만드는 것을 확인할 수 있다.

그리고 우측 항에 상수 파라미터로 sharpening 강도를 조절할 수 있는데, 

다만 강도를 너무 강하게 줘서 over sharpening되면 object의 테두리가 지나치게 강조되는 현상이 발생하며, 이를 Halo artifacts라 한다. (object의 후광이 비치는 듯한 효과)


Image Gradients & Edge Detection

지금까지 배운 convolution 연산을 통해 이미지의 어떤 특징을 찾을 수 있는지 좀 더 알아보도록 하자.

지금까지 머신러닝, 딥러닝 등에서 배운 gradient는 위와 같이 continuous function f(x, y)를 파라미터 x, y로 각각 편미분함으로써 명확하게 구할 수 있다. 그럼 continuous function으로 표현하기 어려운 이미지에서 gradient는 어떻게 정의할 수 있을까?

이미지에서는 finite difference개념을 이용해 인접 pixel간 gradient를 근사화하는 3가지 방법으로 정의된다. (다음 픽셀 / 직전 픽셀 / 좌우인접 픽셀간의 gradient)

그리고 각 개념은 결국 linear transformation과 같음으로 위와 같이 convolution 연산으로 대체할 수 있다. 즉, 특정 형태를 가지는 kernel로 convolution하면 인접 pixel들의 gradient를 표현할 수 있게 된다.

이 원리를 이용하면 x, y방향 gradient를 계산하는 Horizontal/Vertical Sobel filter를 구현할 수 있는데,


Sobel filter를 적용하면 위와 같이 좌우 픽셀간 변화량을 표현한 결과와(Horizontal), 상하 픽셀간 변화량을 표현한 결과(Vertical)를 얻을 수 있다.

이렇게 수직/수평선을 구분할 수 있다면, 이것을 활용하여 object의 외곽선을 검출 할 수도 있다. 위는 이미지의 x, y gradient의 방향(direction)과 크기(amplitude) 를 구할 수 있는 일반화된 방법을 보여주며, 

이 방법을 활용해 위와 같이 이미지 내 object의 외곽선을 검출할 수 있다. 

그런데 1-D signal에서도 noise가 많으면 difference를 구하기 쉽지 않기 때문에 명확하게 edge를 찾을 수 없다. 

그래서 이렇게 미분을 목적으로 하는 필터는 noise를 제거하는 blur과정(low-pass filter)을 통상 동반하게 된다. 

그리고 이 특성은 교환법칙에 따라 Gaussian + Derivative filter로 한번에 합성곱 연산으로 대체할 수 있다. 물론 이 예제는 이미지에서도 똑같이 적용된다.

그런데 우리가 지금껏 배운 필터를 이미지에 적용하면 필연적으로 이미지 크기가 줄어들게 되어 있다. 이는 이미지의 정보를 날려버리는 의미와 같기 때문에 필터 적용 후에도 이미지의 크기를 유지하기 위한 방법padding이라고 한다. padding의 방법에는 가장 외각 테두리를 0으로 확장시키던가, 동일한 픽셀로 채우는 등 여러가지 방법이 있다. (Clip filter, Wrap around, Copy edge, Reflect across edge, Vary filter near edge)

※ 통상 CNN에서 padding은 zero-padding을 주로 쓰는데, 영상처리 관점에서는 별로 좋은 방법은 아니다. 왜냐하면 이미지 외곽에 아주 강한 edge가 있는 이미지로 만들어 주기 때문이다. 

지금까지 배운 linear 필터 외에도 mean / median / mode / min / max 등 통계값으로 변형하는 order-statistic filter들도 널리 알려진 필터이다. 실제로 low-pass filter로 완벽히 제거하기 어려운 salt-and-pepper noise를 median filter가 잘 제거하는 효과를 보이곤 한다.

그리고 앞서 배운 low / high pass filter외에도 특정 주파수 대역대만 통과하지 못하게하거나 통과시키는 band-reject / band-pass filter 도 있으니 기억해두도록 하자.


Morphology

다음은 Morphology라는 개념에 대해 알아보도록 하자. morphology는 영상처리에서 자주 쓰이는 기법중 하나인데, 이미지 내 object 패턴을 파악하는 기법이다. (ex. object의 외곽선, 이미지에서 글자 추출하기) 이 때 morphological 연산은 이미지를 0과 1로 이루어진 binary 이미지로 표현함으로써 object의 특징을 추출한다.
※ biology에서 동/식물의 구조를 표현하는 morphology가 어원이다.

morphology는 set(집합) theory를 base로 한다. 

예를 들어 위 그림의 A라는 object를 찾고 싶다고 가정해보자. 여기서 A라는 object에 해당하는 픽셀들은 (A-B) ∪ (A∩B)의로 표현되며, 이렇게 set theory를 활용해 object의 특징을 검출하는 방법을 mathematical morphology라 한다.

그리고 Set theory를 컴퓨터에서 가능한 연산으로 표현하기 위해 AND/OR/NOT/XOR/NAND 등의 Logic operation을 활용할 수 있다.

그럼 이제 이 개념들을 활용해서 morphological operation에 대해 알아보자.

Dilation 연산은 binary image에 binary kernel로 convolution 연산을 해 structuring element로 확장시켜 주는 것이다. (binary 버전의 convolution연산이다.)

Dilation 연산은 원본 이미지를 특징을 추출하기 쉬운 형태로 표현하는데 활용한다. 위 그림은 알아보기 힘든 binary image를 보다 선명한 패턴을 가질 수 있도록 binary classification한 결과를 보여준다.

Erosion은 Dilation의 완전 정반대의 연산이다. 이 연산을 활용하면 원하는 object의 위치를 찾을 수 있다.

Opening은 A와 B를 Erosion한 다음 B로 Dilation한 연산이며, B를 포함시킬 수 있는 A의 영역이 남는다.

반면 Closing은 A와 B를 Dilation한 다음에 B로 Erosion한 연산이며, B를 이용해 A의 외곽을 표현한 결과가 남는다.

이 연산을 활용하면 stru







댓글 쓰기

0 댓글