Research/컴퓨터비전, 영상처리

선형보간법(linear interpolation)과 삼차보간법(cubic interpolation), 제대로 이해하자

bskyvision.com 2020. 5. 29. 16:29

선형보간법(linear interpolation)에 대해서는 잘 설명된 자료가 많지만, 삼차보간법(cubic interpolation)에 대해서는 읽을 만한 괜찮은 자료를 찾기가 쉽지 않습니다. 아마도 삼차보간법에 대해 글을 쓰신 분들도 완벽하게 원리를 이해하고 쓴 것이 아닌 것 같습니다. 아인슈타인이 이렇게 말했죠. "만약 당신이 무엇인가를 쉽게 설명할 수 없다면, 그것을 제대로 이해한 것이 아니다." 이 글이 삼차보간법과 쌍삼차보간법을 이해하는데 있어 여러분들께 통찰력을 제공하길 바랍니다. 

 

우선 보간법(interpolation)이라는 것이 무엇인지 간략히 설명하고 넘어가겠습니다. 보간법이란 알려진 값을 가진 두 점 사이 어느 지점의 값이 얼마일지를 추정하는 기법을 의미합니다. 아래 그림을 보시면 a와 b사이에 위치한 x의 값, 즉 f(x)가 무엇인지를 추정하는 것이 바로 보간법입니다. 

 

보간법이란?

 

선형보간법(linear interpolation)

보간법에는 여러가지 접근법이 있는데, 그중 비교적 간단한 선형보간법은 두 점 사이에 직선을 그립니다. 그리고 그 선을 이용해서 f(x)를 추정합니다. 다음 그림과 같이 말이죠. 

 

선형 보간법(linear interpolation)

 

두 점의 좌표를 알면 1차 함수식을 만들 수 있죠? y = mx + n에 두 좌표값을 대입시키면 그 1차 함수식을 찾아낼 수 있습니다. 그러면 결과적으로 다음과 같은 함수식이 도출됩니다. 

 

$y = \frac{f(a)-f(b)}{a-b}x+\frac{af(b)-bf(a)}{a-b}$

 

식이 복잡해보인다고 겁먹지 마세요.^^ 어려운 것 아닙니다. 중요한 것은 일차함수식을 찾아냈다는 것입니다. 일차함수식을 찾아냈기 때문에, a와 b 사이의 어떤 점 x의 함수값, 즉 f(x)도 그 식에 대입함으로써 알아낼 수 있습니다. 이것이 바로 선형보간법의 핵심입니다. 기억해야할 것은 선형보간법에서는 값을 추정할 때 두 개의 점을 참조했다는 점입니다.  

 

삼차보간법(cubic interpolation)

보간법에는 다양한 접근법이 존재한다고 했습니다. 그 중 하나가 방금 설명한 선형보간법이었습니다. 선형보간법은 1차 함수를 활용한 것이었죠? 이제 설명드릴 삼차보간법은 3차(cubic) 함수를 활용합니다. 삼차보간법은 우리가 알고 있는 두 점 a, b가 삼차함수 그래프 위에 있다고 가정합니다. 다음과 같이 말이죠. 

 

3차 보간법(cubic interpolation)

 

이렇게 3차 함수를 이용해서 미지의 값을 추정하면 일차 함수를 통해 찾는 것보다 훨씬 더 부드러운 결과를 만들어낼 수 있습니다. 직선이 아닌 곡선을 이용하기 때문이죠. 문제는 이 3차 함수 $f(x) = mx^3 + nx^2 + jx + k$를 알아내야 한다는 점입니다. m, n, j, k를 찾아내야 한다는 뜻이죠.

 

문제를 간단하게 만들기 위해서 $a = 0$, $b =1$이라고 가정하고 출발하겠습니다. 그리고 $f(0) = y_0$, $f(1) = y_1$로 놓겠습니다. 

 

 

자, 그럼 함께 m, n, j, k를 계산해봅시다. 우선 k는 쉽게 구할 수 있겠네요. f(x)에 0을 대입하면, f(0) = k가 나옵니다. k는 이미 알고 있는 값인 $y_0$입니다. 

 

$k = y_0$   ...(1)

 

이제 네 개 중에 하나 구했습니다. 이번엔 f(x)에 1을 대입해볼까요? 그러면 다음과 같은 식을 얻을 수 있습니다. 

 

$f(1) = m + n + j + k = y_1$

 

여기서 k는 아까 $y_0$임을 알았으니 대입해서 정리하면 미지수가 세 개인 방정식을 하나 얻게 됩니다.

 

$m + n + j = y_1 - y_0$   ...(2)

 

미지수가 세 개인 방정식이 세 개 있으면 연립해서 그 미지수들을 모두 구할 수 있죠? 그것을 위해 f(x)를 x에 대해 미분한 후에 0과 1을 각각 대입시켜보겠습니다. 그러면 방정식을 두 개 얻을 수 있겠죠? 우선 f(x)를 미분하면, 다음과 같이 됩니다. 

 

$f'(x) = 3mx^2 + 2nx + j$

 

그 다음에 0과 1을 각각 대입하면, 

 

$f'(0) = j$  ...(3)

$f'(1) = 3m + 2n + j$  ...(4)

 

과 같은 방정식들이 도출됩니다. 이제 세 개의 방정식이 생겼으니 연립해서 풀면 됩니다. 그런데 연립방정식을 풀기 위해서는 먼저 f'(0)과 f'(1)을 알아야합니다. 우리가 다루는 데이터가 연속적(continuous)인 경우라면 미분해서 값을 넣어주면 되지만, 이산적(discrete)인 경우에는 다음과 같이 미분값들을 구할 수 있습니다. 기울기(미분값)는 y의 증가량을 x의 증가량으로 나눠준 것임을 중학생 때 배웠던 것 같습니다.  

 

$f'(0) = \frac{y_1 - y_{-1}}{2}$

$f'(1) = \frac{y_2 - y_0}{2}$

 

따라서 우리는 $(0, y_0)$, $(1, y_1)$말고도, 추가적으로 두 점 $(-1, y_{-1}), (2, y_2)$도 참조해야합니다. 그래서 삼차보간법은 이웃한 두 개를 참조하는 선형보간법과 달리 네 개의 점을 참조합니다.  

 

삼차보간법은 4개의 이웃점을 필요로 한다.

 

이제 f'(0)과 f'(1)을 방정식 (3), (4)에 각각 대입하겠습니다.

 

$j = \frac{y_1 - y_{-1}}{2}$   ...(3)

$3m + 2n + j = \frac{y_2 - y_0}{2}$   ...(4)

 

이 과정에서 j도 알게 되었네요. 방정식 (2)와 (4)에 j를 대입해서 나머지 m, n을 구해봅시다. 먼저 j를 대입하면 방정식 (2), (4)가 다음과 같이 정리됩니다. 

 

$m + n = \frac{y_{-1} - 2y_0 + y_1}{2}$   ...(2)-1

$3m + 2n = \frac{y_{-1} - y_0 - y_1 + y_2}{2}$   ...(4)-1

 

이 친구들을 연립해서 풀면, m과 n을 구할 수 있습니다. 구했더니 이렇게 나오네요. 

 

$m = - \frac{y_{-1}}{2} + \frac{3}{2}y_0 - \frac{3}{2}y_1 + \frac{y_2}{2}$   ...(2)-2 

$n = y_{-1} - \frac{5}{2}y_0 + 2y_1 - \frac{y_2}{2}$   ...(4)-2

 

드디어 우리가 알아야할 m, n, j, k를 모두 찾아냈습니다. $f(x) = mx^3 + nx^2 + jx + k$를 찾아낸 것이죠. 0과 1사이에 존재하는 어떤 x의 함수값, f(x)도 우리는 이제 이 함수를 이용해서 추정할 수 있습니다. 이것이 바로 삼차보간법입니다. 다시 한번 말하지만 수식은 중요하지 않습니다. 이렇게 전개된다는 것 정도만 알고 계시면 됩니다. 

 

쌍선형보간법(bilinear interpolation)과 쌍삼차보간법(bicubic interpolation)

선형보간법을 2차원으로 확장시킨 것이 바로 쌍선형보간법이고, 삼차보간법을 2차원으로 확장시킨 것이 쌍삼차보간법입니다. 2차원으로 확장시킨 것 외에 원리상 달라진 것은 없습니다. 쌍선형보간법은 이웃한 4(=2x2)개의 점을 참조하고, 쌍삼차보간법은 16(=4x4)개의 점을 참조합니다. 

 

 

이제 마무리 인사를 드릴 시간이네요. 끝까지 읽고 생각하시느라 수고하셨습니다. 블로그를 운영하면서 알게된 진리는 "힘들게 쓴 글은 독자들이 알아준다"는 것입니다. 이 글도 꽤 어렵게 썼습니다. 따라서 이 글도 누군가 알아주실 것을 기대하며 글을 마칩니다.^^ 항상 질문과 지적은 환영입니다. 댓글로 남겨주시면 빠르게 답변드리도록 하겠습니다. 

 

 

b스카이비전의 추천글

초해상화(Super-resolution)란? 저화질 영상을 고화질로 바꿔주는 기술

[MATLAB] 이미지 크기 조정하기, imresize 함수

[python] opencv-python 패키지 유용한 함수 10개 정리

 

 

<참고자료>

[1] https://dsp.stackexchange.com/questions/18265/bicubic-interpolation, stackexchange, "bicubic interpolation"

[2] https://darkpgmr.tistory.com/117, 다크프로그래머, "선형 보간법"