해당 포스트는 "열혈강의 영상처리 프로그래밍" 책의 내용을 요약한 것이다.



※ 쌍선형 보간

쌍선형 보간은 값을 구하려는 픽셀 주변의 픽셀 값 4개의 변화양상을 추정하여 픽셀 값을 구하는 것이다. 먼저 쌍선형이 아닌 그냥 일차원 선형 보간의 원리를 아래 그림을 통해 살펴보자. 

x는 정수 값을 가지는 픽셀 좌표에 해당하고 a와 b는 x, x+1 위치에서의 픽셀값을 나타낸다. p는 0에서 1사이의 소수점이다. c을 값을 구하기 위해 먼저 위 그래프에서 x를 0으로 가정하고 a-b 직선 함수 y = (b-a)x + a 를 만든다. 그리고 p를 대입한다. c는 (b-a)(p) + a가 되고 정리하면 (1-p)(a) + pb가 된다. 다음은 1차원 선형 보간을 2차원으로 확대해보자.

 

2차원 선형 보간은 1차원 선형보간을 두 번 수행하는거다. 구하고자 하는 좌표를 (x+p, y+p)라고 하자. 먼저 q에 대해서 (x,y)와 (x,y+1) , (x+1,y)와 (x+1,y+1) 사이의 1차원 보간을 구한다. (x,y)와 (x,y+1)사이의 1차원 보간을 e라고 하고 위에 1차원 보간을 구한 식에 대입해 보면 e= (1-q)(a) + qb가 된다. (x+1,y)와 (x+1,y+1) 사이의 1차원 보간을 f라고 하면 f = (1-q)c + qd가 된다. 마지막으로 e와 f 사이의 1차원을 구하면 된다. 이를 g라고 하면 g = (1-p)(e) + pf가 되고 여기에 우리가 구한 e와 f 값을 대입해 정리한다. 결과적으로 쌍선형 보간을 수행한 (x+p, y+q) 좌표의 픽셀 값은 g = (1-p)(1-q)(a) + (1-p)(q)(b) + p(1-q)(c) + (p)(q)(d) 가 된다. 이를 코드로 구현해보자.


BYTE BiLinearIntp(double x, double y)
	{
		double wLT, wRT, wLB, wRB;

		int xL = IN_IMG((int)x  , 0, m_nWidth);
		int xR = IN_IMG((int)x+1, 0, m_nWidth);
		int yT = IN_IMG((int)y  , 0, m_nHeight);
		int yB = IN_IMG((int)y+1, 0, m_nHeight);

		wLT = (xR - x)*(yB - y);
		wRT = (x - xL)*(yB - y);
		wLB = (xR - x)*(y - yT);
		wRB = (x - xL)*(y - yT);

		return (wLT*m_pImageData[yT*m_nWStep + xL] + wRT*m_pImageData[yT*m_nWStep + xR] + 
				wLB*m_pImageData[yB*m_nWStep + xL] + wRB*m_pImageData[yB*m_nWStep + xR]);
	}


쌍선형 보간은 최단 입점 보간보다 더 졍교해지지만 영상이 약간 번진다. 다음에 살펴볼 입방 회전 보간이나 쌍입방 보간은 더욱 정교한 결과를 보여준다.

+ Recent posts