일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- machine learning
- TD
- DP
- IN
- dfs
- opencv
- BFS
- exists
- 딥러닝
- sklearn
- image processing
- classification
- edge detection
- 그래프 이론
- Mask Processing
- MySQL
- AlexNet
- 백준
- clustering
- canny edge detection
- Reinforcement Learning
- Python
- 자료구조
- C++
- MinHeap
- dynamic programming
- 인공지능
- SIFT
- 머신러닝
- 강화학습
- Today
- Total
JINWOOJUNG
[ 영상 처리 ] Ch3. Mask Processing(Filtering in Spatial Domain) 본문
본 영상 처리 개념과 기법들에 대한 공부를 진행하면서 배운 내용들을 중심으로 정리한 포스팅입니다.
책은 Computer Vision: Algorithms and Applications를 기반으로 공부하였습니다.
또한, 인하대학교 박인규 교수님의 디지털 영상 처리 과목을 기반으로 제작된 포스팅입니다.
Before This Episode
https://jinwoo-jung.tistory.com/54
Mask Processing은 하나의 픽셀을 Processing 하는데 Kernel(Mask) 내의 인접 픽셀을 고려한다. 이러한 Filtering 과정은 Convolution을 기본으로 하는데, 이를 먼저 살펴보자.
1D Convolution
수식적으로 알 수 있듯이, 1D Convolution은 두 함수의 곂치는 면적을 계산하는 것이다.
$f(t)$와 $g(x-t)$의 그래프 개형을 보면 다음과 같다. $f(t)$가 고정되어 있는 상황에서 $g(x-t)$는 $x$에 따라 변하게 된다. Convolution 과정에서 $g(x-t)$가 움직이면서 겹치는 영역이 아래와 같이 달라지게 된다.
따라서 이를 유효한 구간별로 적분한 값은 아래와 같다.
결과적으로 오른쪽과 같은 Convolution Function을 도출해 낼 수 있다. 이를 2차원으로 확장함과 동시에, 연속적인 Data가 아닌 Discrete Data를 고려하기 때문에 적분이 아닌 시그마로 표현할 것이다.
2D Convolution
2D Convolution의 경우 적분 대신 시그마로 표현 하였으며, x,y축 2개의 항을 표현함을 알 수 있다. 위 2D Convolution을 그림으로 나타내면 오른쪽과 같다. $f$는 영상, $g$는 filter(mask)를 의미한다. 이때, $k,l$은 filter 내부 영역을 탐색하기 위한 값들로, $f[x-k,y-l]$로 표기되어 있기 때문에 filter $g$가 거꾸로 되어 있는 것을 알 수 있다.
2D Correlation
2D Correlation은 2D Convolution과 큰 차이가 없다. 하지만 $f[x+k,y+l]$이기 때문에 filter $g$가 뒤집히지 않음을 확인할 수 있다. 따라서 Image Filtering에서는 위와 같은 방식으로 Filtering을 진행하게 된다.
참고로, mask $g$ 가 대칭성을 가지면 결국 2D Convolution과 별 차이가 없음을 알 수 있다.
Image Filtering
Image Filtering은 Mask Processing으로, 필터링을 진행할 픽셀 위치에서 인접 픽셀을 고려하여 연산을 진행하여 결과를 만들어내는 과정이다. 연산 과정에서는 위에서 언급한 2D Correlation을 기반으로 진행한다. Image Filtering에서 사용되는 다양한 Filter를 기반으로 Filtering이 어떤 기능을 하는지 살펴보자.
Box Filter
가장 기본이 되는 Box Filter는 오른쪽 3x3 Filter와 같이 인접 픽셀의 Intensity 평균값을 각 픽셀의 Intensity로 만들어 주는 Filter로, Smoothing Effect를 일으킨다. Smoothing Effect는 Noise를 감소시는 이점이 있지만 더 좋은 Filter가 있기때문에 주로 사용되지는 않는다.
Box Filter가 실제 Image Filtering 과정에서 어떻게 사용되는지 살펴보자. 위 수식을 보면 결국 $(m,n)$위치의 픽셀 Intensity를 $(m,n)$을 중심으로 인접픽셀에 접근하여 인접 픽셀의 Intensity와 해당 위치의 Filter Weight를 곱하고 전부 더한 값으로 설정함을 알 수 있다. 이때, Filter의 앞에 $\frac{1}{9}$가 있기 때문에, 결국 평균을 냄을 의미한다.
이를 전체 픽셀에 대해 적용하면 위와 같은 결과를 얻을 수 있다. Box Filter 기반으로 Image Filtering 결과 Smoothing이 진행되면서 밝기 값이 무뎌진 것을 확인할 수 있으며, Edge 부분이 특히 무뎌짐을 확인할 수 있다. 또한, 이미지의 가장자리 부분은 값이 없는 것을 확인할 수 있다.
Smoothing이 일어나는 것은 확인할 수 있으나, x 방향과 y 방향의 등방성이 보장되지 않아 실제로는 활용되지 않는다.
Gaussian Filter
Gaussian Filter은 Noise 제거에 가장 효과적인 Filter이다. 2차원 Gaussian Equation은 다음과 같다.
2차원 Gaussian은 등방성(Isotropic)이 존재한다.
젤 오른쪽은 5x5 Kernel, $\sigma$는 1일 때, Kernel의 Weight를 의미한다. Filtering을 적용할 픽셀을 중심으로 x, y 방향에 따라 Weight의 차이가 없음을 확인할 수 있다. 즉, Gaussian Filter는 중심으로 부터 떨어진 거리에 다라 가중치를 달리하기 때문에 등방성이 존재한다. 또한, 모든 Weight의 합이 1임을 알 수 있는데, 만약 Weight의 합이 1이 아닌 경우 Filtering 이후 영상이 어두워지거나 밝아질 수 있다. 또한, 현재 Weight는 float형인데, 이는 많은 연산량을 요구한다. 따라서 Weight를 정수로 변환 후 가중치의 합으로 나눠 줌으로써 Weight의 합을 1로 유지하는 방법도 있다.
왼쪽은 Box Filter이고, 오른쪽은 Gaussian Filter이다. Box Filter의 경우 대각선 방향의 Weigh와 x,y 방향의 Weight는 차이가 존재한다. 하지만 Gaussian Filter의 경우 모든 방향에서 Weight의 차이가 없다. 이것이 등방성이다.
Gaussian Filtering 결과 Smoothing이 일어남을 확인할 수 있다. 육안으로 구분하기는 힘들지만, Gaussian Filter의 등방성으로 인해 방향에 관계없이 일정하게 Smoothing 되었다. 대부분의 Noise는 가우시안 분포를 따르는 고주파 성분이다. 따라서 Gaussian Filter가 Noise를 없에는 최적의 필터이며, Low-Pass Filter 역할을 한다.
Gaussian을 같은 $\sigma$에 대해서 2번 돌리면 어떻게 될까? 결과는 $\sqrt{2} \sigma $로 Gaussian을 돌린 결과와 동일하다. 이는 Filter의 Weight가 인접 픽셀의 Intensity에 선형적으로 곱해지는 Gaussian Filter의 경우
$$a \otimes ( b \otimes c) = ( a \otimes b ) \otimes c$$
이를 만족시키기 때문에, Convolution을 한 Filter를 적용시킨 결과와 동일하다.
Separability of the Gaussian Filter
2차원 Gaussian은 지수함수의 특징을 통해 1차 Gaussian 2개로 분리할 수 있다. 여기서도 Gaussian의 선형성으로 인하여 x,y 각 방향으로의 1차원 Gaussian 2개를 적용한 결과와 동일하다.
이는 연산량에서도 이점을 보임과 동시에 Filter를 1차원으로 나누는 것이 하드웨어적으로도 이득이다.
Filter Size
그렇다면 최적의 Gaussian Filter Size는 무엇일까?
위 그림은 30x30 Filter에서 $\sigma$가 각각 2와 5인 경우이다. $\sigma$가 커질수록 중심 픽셀로부터 더 많은 인접 픽셀을 고려함을 의미한다. 왼쪽처럼 $\sigma$가 Kernel Size에 비해 너무 작을 경우 Weight가 0인 부분이 너무 많아지기에 실제 Filtering에는 영향을 주진 않지만 많은 연산량을 차지하기에 비효율적이다. $\sigma$가 5인 경우 적절한 Filter Weight가 설정됨을 알 수 있다.
일반적으로 필터링 하는 픽셀 즉, 중심으로 부터 $\sigma * 3$의 half width를 가지도록 설계하는 것이 적절한 Filter Size이다. 예를 들어, $\sigma = 3$인 경우 적절한 Kernel Size는 17x17이다.
Edge Problem
앞서 Filtering 과정에서 Edge(가장자리) 부분은 Filtering이 되지 않음을 확인할 수 있었다. Filtering 하는 픽셀이 Filter의 가운데에 오기 때문에, 가장자리는 처리되지 않기 때문이다. 이를 해결하기 위해 여러 방법이 존재한다.
- Clip Filter
- 단순히 Image의 가장자리 픽셀의 Intensity를 0으로 설정하여 원본 픽셀과 겹쳐지는 부분만 계산하여 Filtering이 가능하도록 하는 방법
- Wrap Around
- 동일한 이미지를 가장자리에 반복
- 경계에 불연속
- Copy Edge
- Edge 부분을 그대로 복사하여 확장시켜 Filtering 적용
- Reflect Across Edge
- Edge 부분의 연속성을 보장하기 위해 Mirroring을 진행
Sobel Filter
Sobel Filter는 수직, 수평 방향의 엣지를 검출하는데 유용한 Filter이다. Correlation Filter 중 하나로 해당 Filter 내의 Value 분포와 유사한 이미지일 수록 Response가 높아진다. 즉, Filter와 이미지가 얼마나 유사한 관계를 갖는지를 Return 하는 Filter이다.
가운데 Filter의 Weight 분포와 같이, 검출하고자 하는 Edge의 방향에 따라서 가운데를 두고 나뉘는 형태를 띄고 있다.
Bilateral Filter, Median Filter 두 Filter의 필요성과 Filtering 결과 및 코드 구현은 아래 포스팅에서 진행하였다.
'2024 > Study' 카테고리의 다른 글
[ 영상 처리 ] Ch5. Image Pyramid and Warping (0) | 2024.04.13 |
---|---|
[ 영상 처리 ] Ch4. Edge Detection (0) | 2024.04.11 |
[ 영상 처리 ] Part2-3. OpenCV Mask Processing(C++) (0) | 2024.04.08 |
[ 영상 처리 ] Part2-1. OpenCV Mask Processing(C++) (0) | 2024.04.07 |
[ 영상 처리 ] Part1-2. OpenCV Image Processing(C++) (0) | 2024.04.06 |