Post

컴퓨터비전(7) - Image Resizing and Resampling(1)

Image Resizing and Resampling

저번 글에서는 image의 feature로 edge를 사용하고, edge를 detection하는 방법에 대해 알아보았습니다. 이번 장에서는 feature를 추출하기 이전, image의 size를 변경하고(resize), 새롭게 만드는(resampling)에 대해 알아보겠습니다.

Image Resizing

근데, 왜 image를 resizing하나요? 답은 간단합니다. “멀리 떨어져 있거나, 너무 가까우니까.”라고 대답을 할 수 있습니다. Image에서 내가 추출하고자 하는 feature가 너무 작으면(카메라의 렌즈 기준 너무 멀리 떨어진 상황) 잘 detection되지 않을 것이고, 너무 크다면 뭔가 다른 image를 detection하는데 방해가 될 것 같기 때문입니다. 따라서 feature(object, edge, 등등..)를 인지하기 위해선 다양한 scale(비율)로 image를 봐야 합니다.

Image sub-sampling

image가 너무 큽니다. 한 눈에 들어오지 않습니다. 이런 경우 image를 줄여야 하지 않나요? 내가 어떤 image를 절반 사이즈로 줄이고 싶습니다. 가장 간단한 방법은 row와 column을 없애버리는 것입니다. 이는 image의 information은 감소되겠지만, 제일 쉽고 제일 빠른 방법일 것입니다. 이를 image subsampling이라고 부릅니다.

image

이미지가 점점 흐려지는 이유는 바로 row와 column을 하나씩 날려서, 아주 naive하게 image의 사이즈를 줄였다는 것이죠. 이는 근데 문제가 많습니다. 너무 resolution(해상도이자 다른 관점으로 보면 information)이 떨어진다는 것입니다.

Image Aliasing

image

출처 : https://www.esa.int/ESA_Multimedia/Images/2014/06/Aliasing_illustration

오른쪽 이미지처럼 뭔가 이미지가 약간 왜곡되어 보이는 사진을 본 적이 다들 한 번쯤 있을 것이라고 생각합니다. 이러한 효과를 image aliasing이라고 합니다. 왜 이러한 현상이 일어나는지에 대해 알아봅시다.

사실 컴퓨터에서 사진(image)이라는 것은 연속적인 real world에서 어떤 순간을 포착해서, pixel 단위로 pixel 단위로, 이산화(discrete)한 것 아닌가요? 이러한 real world의 그 시점을 파동으로 표현할 수 있습니다. 이미지의 변화량이 많은 곳은 고주파로, 변화량이 적은 곳은 저주파로 표현할 수 있습니다. 예전에 gaussian convolution을 보며 했던 이야기입니다. [궁금하면 여기를 클릭! ,.. 링크 넣기] 근데 이러한 연속적인 이미지를 이산화 (discretize)하면 당연히 오차가 생기기 마련입니다. 마치 floating point error처럼요. 조금 고급지게 표현하자면, 디지털 이미지화 기술이 진짜 이미지를 따라가지 못하기 때문입니다. 이제 aliasing의 이유를 알아봅시다!

Image Aliasing’s reason

아래처럼 어떤 이미지(파란색)가 주파수 형태로 존재합니다.

image

이러한 이미지를, 이산화해서 디지털 형태로 만들려고 합니다. 그래서 특정 주기를 바탕으로, 몇 개의 샘플을 뽑아(빨간 점) 이를 이산화된 이미지로 구현했습니다. 이는 원래 이미지보다 주기가 늘었고, 이는 진동수가 감소함을 의미합니다. 즉, sampling rate가 image의 정보를 충분히 표현하지 못하면, 이미지가 왜곡되어 보인다는 것이죠. 이것이 aliasing의 이유입니다.

이러한 aliasing을 피하기 위해서 Nyquist theory에 대해 이해해야 합니다. 하지만 신호처리 시간이 아니므로, 간략하게 결과만 알고 갑시다!

1
sampling rate >= 2*이미지의 최대 주파수. 즉, 하나의 주기당 2개의 샘플

의 조건을 만족하면, aliasing을 피할 수 있다고 합니다. 이 때, 최소 sampling rate를 Nyquist rate라고 합니다.

image

이를 보면, 흑백의 변화로 이루어진 실제 이미지에서, 한 주기당 2개의 샘플을 뽑는다면 우리가 컴퓨터에서 보는 이미지를 잘 표현할 수 있습니다!

즉, 아래처럼 요약할 수 있습니다!

1
2
3
4
1) 이미지는 높은 주파수(변환이 많은 곳 - 경계)와, 낮은 주파수로 나뉩니다.
2) 높은 주파수는 pixel의 detail(경계를 표현하므로)을 나타냅니다.
3) 낮은 주파수는 경계가 아닙니다. 즉 이는 이미지의 전체적인 패턴을 말합니다. (high-level structure)
4) subsampling 할 때, detail은 줄이되(부드럽게 표현 :  subsampling 할 때, 경계가 두드러지면 안됩니다. 이는 high frequency를 낮추어야 합니다.), high level structure는 유지(low frquency)해야 합니다.

Gaussian pre-filtering

근데 예전에, gaussian convolution을 사용하면 low-pass image를 만들 수 있다고 했지 않나요? 이를 활용하면 될 듯합니다!

먼저 가우시안 필터로, 합성곱을 취해서 부드럽게 만들어주고 (높은 주파수 제거), 새로 생성된 이미지에서 하나의 row와 하나의 column을 제거한다면 조금 더 효과적으로 image를 subsampling 할 수 있습니다. 왜냐하면 가우시안 합성곱이란 것이, 하나의 픽셀을 주변 픽셀의 특징을 갖도록 새롭게 이미지를 만드는 과정이니까요. 남겨두는 pixel이 딱 그 이미지의 위치 정보를 갖는 것이 아닌, 주변 이미지의 정보를 다 담아두겠다는 의미로 해석할 수 있습니다!

아래는 가우시안 필터를 적용하여, 이미지를 subsampling한 결과입니다.

image

아래는 필터를 적용하지 않고, 단순히 row와 column을 하나씩 제거한 결과입니다. 이는 점점 image resolution이 감소되는 것을 확인할 수 있습니다.

image

gaussian pyramid

하지만 매번, gaussian filter를 사용해서 subsampling (down sampling)하는 것은 무리가 있습니다. 메모리 사용이 너무 커진다는 것입니다. 이를 위해서, 아래와 같이 미리 downsampling한 결과를 이미지 속에 넣어둔다면, 그냥 rendering만 하면 됩니다. 이러한 data structure를 gaussian pyramid라고 합니다.

image

image upsampling

image를 down sampling하는 방법도 알았습니다. 하지만, 그렇다면 반대도 생각해봐야겠죠. 이를 image upsampling이라고 합니다. down sampling하는 법은 그냥 있는 정보를 잘 추려서 새롭게 만들면 됐습니다. 하지만 upsampling은 그런 문제의 영역이 아닙니다. 어떤 주어진 64x64 이미지를 4배 확대하고 싶은 상황을 가정해보겠습니다. 이는 256x256 image로 새롭게 만들어야 합니다. 즉 1x1 pixel을 4x4 pixel로 새롭게 창조해야 합니다. 완전 다른 영역입니다. 이러한 문제를 해결하기 위해서 image interpolation이 등장합니다.

image interpolatiom

interpolation은 컴퓨터 그래픽스를 공부하신 분이라면 많이 들어봤을 것입니다. 바로 보간이라는 의미입니다. 음, 이미 주어진 pixel을 가지고 중간 pixel을 잘 만들어보자는 의미입니다. 이미지는 사실 연속된 정보의 집합입니다. 연속된 정보기에, 내가 만들고자 하는 중간의 정보들도 따지고 보면 원래의 시작과 끝 점 사이 정보라는 것이죠.

아래는 linear interpolation의 예시입니다. 어떤 상황은 linear하다고 가정 후, 처음과 끝 점을 활용하여 중간 지점을 찾는 방법입니다.

image

아까 위에서 이미지는, 연속된 주파수를 적절한 주기로 이산화(양자화)한 값이라고 설명했습니다. 그렇다면 주기 사이에 있는 정보는 어쩔 수 없이 사라지게 됩니다. 그렇다면 이를 잘 복원하면 이미지를 upsampling하는 것도 무리가 아니라고 생각합니다.

image

위 이미지를 아래처럼 만들 수 있다면, 즉 sampling rate를 더 촘촘하게 만들 수 있다면 upsampling도 쉽다는 것이죠.

image

이제 이를 보간법을 사용해서 잘 추측하자는 것입니다. 원래의 이미지를 f라고 하고, 이산화한 이미지를 F라고 하겠습니다. 아래 그림을 참조해주세요!

image

우리는 대략적인 추측 이미지가 필요한데, 이를 보간을 잘 해주는 filter와의 합성곱으로 표현하면 추측을 잘 할수 있지 않을까? 라는 것이 주된 아이디어입니다. 이제 보간에 효과적인 필터들에 대해 알아보도록 하겠습니다.

image

이러한 함수를 활용하여, 보간된 이미지를 만들 수 있습니다. 현재는 1차원으로 설명했는데, 2차원 image에 대해서도 위 함수의 변수를 2개로 변경하면 되겠네요. 보통 2차원에서 Bicubic filter를 사용해서 많이 interpolation을 진행합니다. 또한 이러한 interpolation은 이미지의 모형을 변화시키는 resampling에서도 많이 사용됩니다. 그래픽스를 배우신 분은 제가 한 말이 딱 이해가 될 것입니다.

image

이런 형태로 이미지를 변환할 때, 사잇값을 interpolation으로 채우겠다는 의미입니다.

마무리하며

다음 글에서는 image의 특징 중 하나인 corner에 대해 살펴보겠습니다.

출처 : https://opencv-python.readthedocs.io/en/latest/doc/23.imageFourierTransform/imageFourierTransform.html

출처 : https://cloudinary.com/glossary/image-aliasing

https://darkpgmr.tistory.com/137

1
https://velog.io/@richpin/Computer-Vision-03-Image-Pyramid
This post is licensed under CC BY 4.0 by the author.