일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- dynamic programming
- sklearn
- 딥러닝
- canny edge detection
- machine learning
- classification
- dfs
- BFS
- C++
- opencv
- MinHeap
- Python
- Reinforcement Learning
- SIFT
- 자료구조
- clustering
- IN
- 인공지능
- 머신러닝
- edge detection
- Mask Processing
- 백준
- exists
- MySQL
- image processing
- 그래프 이론
- TD
- AlexNet
- DP
- 강화학습
- Today
- Total
JINWOOJUNG
[ 영상 처리 ] Ch5. Image Pyramid and Warping 본문
본 영상 처리 개념과 기법들에 대한 공부를 진행하면서 배운 내용들을 중심으로 정리한 포스팅입니다.
책은 Computer Vision: Algorithms and Applications를 기반으로 공부하였습니다.
또한, 인하대학교 박인규 교수님의 디지털 영상 처리 과목을 기반으로 제작된 포스팅입니다.
Before This Episode
https://jinwoo-jung.tistory.com/62
원본 이미지의 Size가 맞지 않아서 이미지를 축소시켜 나간다고 가정해보자. 원본이미지가 존재할 때 절반씩 자르는 것이 아닌 원본을 유지하면서 전체적인 픽셀 사이즈를 축소 해 보자.
기본적인 Downsampling 기반으로 Resize 해 보자. 오른쪽 예시는 Max, Min Pooling 과정인데, 가장 기본적인 Downsampling 기법은 Sub Region에서 왼쪽 상단의 Pixel Intensity만 가져오는 것이다. Max Pooling의 예시인 경우 초록색 Region에서는 29를 취득하는 것이다. 하지만 위 방법으로는 문제가 발생한다.
DownSampling 기반으로 Resize를 한 이미지를 크기만 강제로 키운 것이다. 위와 같은 이미지는 특히 패턴이 많은 인물 뒤 부분은 고주파 성분이 많다. 고주파 성분을 정확히 표현하려면 그많큼 많은 Pixel이 요구된다. 하지만 DownSampling 과정을 통해 낮은 Sampling Rate로 Sampling이 진행되면 왜곡이 발생한다. 그 만큼 원본 영상을 표현하는데 충분한 픽셀이 존재하지 않기 때문이다. 따라서 젤 오른쪽 그림을 보면 원본 영상의 Color도 손실됨과 동시에 고주파 Pattern이 훼손되는 Aliasing이 발생하는 것을 확인할 수 있다.
결국 Sampling Rate가 낮아지면 픽셀 수도 낮아지기 때문에 원본 영상을 표현하기 위한 충분한 픽셀이 존재할 수 없다. 이는 Resize 과정에서 제어할 수 없는 부분이다. 그렇다면 이런 고주파 성분(High Frequency)를 줄이면 그만큼 필요한 픽셀 수도 적어진다. 그렇다면 Low-Pass Filter인 Gaussian을 적용해보자.
기본적으로 Peak 주파수의 2배에 해당하는 Sampling Rate를 만족해야 원본 영상을 정확히 표현할 수 있다.
Gaussian Pre-Filtering
Sampling 이전에 Gaussian Filter를 먼저 적용 한 후 DownSampling을 적용 해 보자. Aliasing을 줄이기 위해 원본 Signal의 Peak Frequency를 줄이기 위하여 Gaussian을 적용한다면 Resize 이후에도 원본 영상을 유지할 수 있을 것이다.
즉, Gaussian을 통해 Smoothing 효과를 일으켜 Peak Frequency를 낮출 수 있다.
이때, Gaussian Filter Size는 반드시 Size가 $\frac{1}{2}$로 줄어들 때 마다 2배가 되어야 한다. DownSampling을 한다는 것은 결국 2x2 Sub Region를 1개의 Pixel로 나타낸다는 것이다. 그리고 Gaussian Filter는 Filter Size 내의 인접 픽셀 Intensity를 고려하여 해당 픽셀의 Intensity로 설정한다는 의미이다. 원본 대비 축소 비율이 2배, 4배 등등 커진다고 하면 결국 더 넓은 범위의 Sub Region을 1개의 Pixel로 설정한다는 의미이다. 따라서 그만큼 Gaussian Filter의 크기가 커져서 해당 픽셀을 Intensity를 설정하는데 더 넓은 범위의 인접 픽셀을 고려한다면 원본 영상을 유지할 수 있을 것이다.
Gaussian을 하고 DownSampling을 한 결과 원본 영상을 잘 유지하면서 Aliasing이 줄어든 것을 확인할 수 있다.
Gaussian Pyramid
가우시안 피라미드는 위와 같이 이미지를 $\frac{1}{2}$로 Resize 하면서 저해상도의 이미지를 만들어 놓은 것이다. DownSampling을 통해 크기가 $\frac{1}{2}$로 줄면 그만큼 해상도(Resolution = Pixel 수)가 줄어들기 때문이다.
위와 같은 Gaussian Pyramid를 같은 크기로 다시 키우면 아래와 같다.
이렇게 각 이미지가 Gaussian Pyramid의 각 층을 이룬다.
Gaussian and Laplacian Pyramid
Laplacian Pyramid는 Gaussian Pyramid의 인접한 층끼리의 차이(Difference)를 구한 것이다.
DownSampling을 통해 크기가 작아진 이미지를 UpSampling으로 늘린 것이다. 이렇게 크기를 같게 만든 후 고해상도에서 저해상도 이미지를 빼면 아래와 같이 Laplacian Pyramid를 만들 수 있다. Laplacian Pyramid에서 밝은 부분이 Edge의 위치임을 확인할 수 있다. 따라서 Laplacian은 결국 다양한 해상도 영상에서의 Edge 정보를 가지고 있는 것이다.
Gaussian Pyramid를 만드는 과정에서 DownSampling이 일어나는데, 그 전에 Gaussian Filtering을 진행한다. Gaussian Filtering은 고주파(Noise)등을 제거하고 저주파를 통과 시키는 Low Pass Filter이다. 따라서 DownSampling을 진행할수록 고주파 성분은 없어지고 저주파 성분만 존재하게 된다.
Laplacian Pyramid는 인접한 층의 Gaussian Filter의 차분을 구하는 것이다. 파란색으로 표현되는 이미지의 신호 관점에서 보면 DownSampling이 진행되어 저주파만 통과되고, 결국 차분은 고주파 성분만 남게 된다. 이후 계속 차분을 구해보면 특정 주파수의 신호만 남게 되는데, 이는 Edge와 같은 고주파 신호만 통과됨을 의미한다. 따라서 이를 Band Pass Filter라고 하기도 한다. 이때, 통과되는 특정 주파수는 Pyramid의 층이 낮아질수록 낮아진다.
이렇게 차이를 구하는 과정에서는 Resize가 필요하다. 높은 해상도에서 낮은해상도의 이미지를 빼는 과정에서 두 이미지의 크기를 갖게 해야 하기 때문이다.
Image Warping
Image Warping은 Image를 변형하는 과정으로 선형적인 변환 과정이다. 각각이 의미하는 바는 깊게 다루지 않아도 되지만, Translation은 평행 이동, Euclidean은 Translation과 Rotation이 동시에 일어나서 회전과 이동 변환이 모두 진행된다. Similarity는 Rotation, Translation 뿐만 아니라 Scaling의 변화도 적용되어 위 예시처럼 크기 역시 달라짐을 확인할 수 있다.
Image Warping + Morphing
Warping은 선형적인 변환이였지만, Morphing은 하나의 형태가 전혀 다른 이미지로 변하는 비선형 변환이다. 즉, Matrix 변환으로 표현할 수 없다. 우리는 Warping을 주로 다룰것이니 가볍게 넘어가자.
이전까지 진행한 다양한 Filtering 과정은 단순히 이미지의 range를 변환하는 것이다. 즉, 이미지의 픽셀 구조는 유지한 상황에서 각 Filtering에 따라 픽셀의 Intensity가 바뀌엇다. Image Warping은 이미지의 Spatial Domain을 변환하는 것이다. 즉 위 사진처럼 이미지의 가로, 세로 비율이 바뀌는 등 원본 픽셀의 좌표(위치)가 변환된다.
Farward Warping
위와 같은 Image Warping을 발생시키는 Transformation Function $h(x)$는 우리가 알고 있다고 할 때, 원본 이미지의 픽셀은 $h(x)$에 의해 변환된 이미지의 픽셀로 위치가 바뀐다. 이를 Forward Warping이라 한다. 그렇다면 우리는 원본 이미지에서의 특정 픽셀의 위치를 알고 있고, Transformation Function을 알고 있을 때, 해당 픽셀이 변환된 이미지에서의 어떤 픽셀인지 알고 싶다. 하지만 변환된 픽셀이 정확한 좌표로 떨어지지 않게 되면 어떻게 될까?
위 예시처럼 변환된 픽셀의 위치가 실수형이라면, 이미지는 descrete한 정수형이기 때문에 정확히 매핑되기 힘들다.
이를 해결할수 있는 방법이 Splatting이다. Splatting은 실수형으로 descrete한 이미지의 픽셀에 매칭되지 않는 것을 방지하기 위해 1대 다 매칭을 통하여 채우는 방법이다. 이를 통하여 매칭되지 않아 발생하는 Holes의 수를 줄일 수 있다. 하지만 얼마나 많이 매칭할지는 역시 미지수다. 만약 너무 많이 매칭시키면, 하나의 픽셀에 다수의 원본 픽셀이 영향을 줘서 Blur 효과가 발생하며, 너무 적게 매칭하면 Holes가 발생하는 문제를 해결하지 못한다.
파나로마 이미지를 만들기 위해 Warping을 진행하였지만, 변환된 이미지가 원본 이미지보다 커져서 중간에 Holes가 발생함을 확인할 수 있다. 그렇다면 이를 해결할 수 없을까?
Inverse Warping
Forward Warping은 원본 이미지에서 Transformation Function을 통해 변환된 이미지로 픽셀을 매핑하였다. 하지만 우리는 그 역으로도 생각해 볼 수 있다. 즉, $h(x)$를 알고 있다면, 변환된 이미지의 특정 픽셀이 원본 이미지의 어떠한 픽셀인지 추정할 수 있다. 위 예시에서 꼭짓점을 예시로 들어본다면 초록색은 결국 보라색에서 매핑된 결과이다. 이처럼 변환된 이미지의 특정 픽셀을 역으로 원본 이미지에서 어떤 픽셀인지 확인하여 해당 픽셀의 Intensity를 가져오게 되면 Holes는 발생하지 않는다.
하지만, 여전히 실수형이기 때문에, 정확한 원본 이미지에서의 픽셀 위치를 특정하기는 어렵다. 따라서, 원본 이미지에서의 픽셀의 특정 위치가 계산된다면, 인접한 4개의 픽셀 Intensity를 이용하여 해당 Intensity를 보간한다.
인접 화소를 기반으로 보간하는 방법은 다양한 방법이 있다.
- Nearest Neighbor
- 보간 없이 인접 픽셀의 Intensity를 가져옴
하지만, 인접한 픽셀의 Intensity를 가져오기 때문에 픽셀 간의 부드러운 색상의 전환을 생성하지 않는다. 따라서 계단 현상이 발생하는데, 특히 대각선이나 곡선이 포함된 이미지를 변환하는 과정에서 선이 계단모양으로 깨져서 변환됨을 확인할 수 있다. Edge부분 역시 동일하게 계단현상(Jaggies)가 발생 가능하다.
- Bilinear Interpolation
- 선형 보간. x,y 각 축에 대하여 선형적으로 인접 픽셀을 거리를 기반으로 Weight를 선정하여 보간
위 경우 인접한 4개의 픽셀에 대하여 떨어진 거리를 Weight로 하여 선형 보간함을 확인할 수 있다. 가까이 있는 곳은 그만큼 더 많이 반영함을 의미한다. 인접픽셀이기 때문에 Weight는 모두 1보다 작을 것이고, 결국 Weight의 합은 1이 된다.
Inverse Warping 결과, forward와 다르게 hole없이 정확한 파노라마 이미지를 얻을 수 있는 것을 확인할 수 있다.
- Bicubic Interpolation
Bicubic Interpolation의 경우 2차가 아닌 3차로 인접한 픽셀을 반영하는 방법이다. 성능 향상은 확실히 좋지만, 차수가 높아짐에 따라 더 많은 연산량이 요구되는 단점이 있다.
'2024 > Study' 카테고리의 다른 글
[ 영상 처리 ] Part3-2. OpenCV Diagonal Edge Detection & Image Pyramid(C++) (0) | 2024.04.15 |
---|---|
[ 영상 처리 ] Part3-1. OpenCV Edge Detection(C++) (0) | 2024.04.15 |
[ 영상 처리 ] Ch4. Edge Detection (0) | 2024.04.11 |
[ 영상 처리 ] Ch3. Mask Processing(Filtering in Spatial Domain) (0) | 2024.04.11 |
[ 영상 처리 ] Part2-3. OpenCV Mask Processing(C++) (0) | 2024.04.08 |