해당 포스트는 "열혈강의 영상처리 프로그래밍" 책의 내용을 요약한 것이다.
※ 쌍선형 보간
쌍선형 보간은 값을 구하려는 픽셀 주변의 픽셀 값 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]); }
쌍선형 보간은 최단 입점 보간보다 더 졍교해지지만 영상이 약간 번진다. 다음에 살펴볼 입방 회전 보간이나 쌍입방 보간은 더욱 정교한 결과를 보여준다.
'영상처리 프로그래밍' 카테고리의 다른 글
영상의 평행 이동, 회전, 확대 및 축소 (0) | 2017.06.12 |
---|---|
픽셀 값의 보간 방법(3) - 입방 회선 보간 (0) | 2017.06.12 |
픽셀 값의 보간 방법(1) - 최단 입점 보간 (0) | 2017.06.12 |
영상의 광학적 변환(4) - 히스토그램 (0) | 2017.06.11 |
영상의 광학적 변환(3) - 영상 잡음 감소 (0) | 2017.06.10 |