728x90

보간법 Interpolation 은 영상처리에서 자주 활용됩니다. 이미지 확대나 변환 시 원본 이미지의 특성을 보전하고자 하는 해상도 개선 기법의 기본 입니다. 양선형 보간법 Bilinear Interpolation은 단어에서 같이 선형 보간법을 두번 반복하는 방법이며, 양선형 필터링 또는 양선형 맵핑 등으로도 언급됩니다. 현 블로그에서는 보간법의 이론적인 부분을 간략 다뤄보겠습니다.

 

양선형 보간 과정을 살펴보면, 그림에서 우리가 알고 싶은 점은 실수 좌표 (x, y)에 위치한 픽셀 값입니다. 이 실수 좌표는 정수 좌표 A, B, C, D의 픽셀 사이에 있으며, 이 정수 좌표의 픽셀 값을 이용하여 보간 할 수 있습니다.

 

 

 

4개의 좌표의 픽셀 값을 식으로 표현하면,

 

A = f(x1, y1), B = f(x2, y1), C = f(x1, y2), D = f(x2, y2)

보간 위치: (x, y), 여기서 x1 ≤ x ≤ x2, y1 ≤ y ≤ y2

 

계산 과정을 단계로 보면,

1) X 방향 보간

(A와 B 사이) R1=(x2−x)/(x2−x1)∗A+(x−x1)/(x2−x1)∗B

(C와 D 사이) R2=(x2−x)/(x2−x1)∗C+(x−x1)/(x2−x1)∗D

 

2) Y 방향 보간

(R1과 R2를 이용) P(x,y)=(y2−y)/(y2−y1)∗R1+(y−y1)/(y2−y1)∗R2

 

3) 하나의 공식으로 표현하면,

P(x,y)=A∗(x2−x)∗(y2−y)+B∗(x−x1)∗(y2−y)+C∗(x2−x)∗(y−y1)+D∗(x−x1)∗(y−y1)

여기서, 픽셀 간격이 “1”이라고 가정합니다. 참고로 “1”이 아닌 경우 (x2-x1)*(y2-y1)으로 정규화해주는 것이 일반적입니다.

 

단계별 공식 변환에서처럼 X축 방향과 Y축 방향으로 각각 적용한 방법이 양선형 보간법 입니다. 더 확장해보면 위 식은 다선형 다항식 Multilinear Polynomial 형태로 변환하여 문제를 풀 수 있습니다. 양선형 보간은 이차 다항식이 아니라 두 변수 일차 다항식으로 생각할 수 있으며, 어떤점 (x, y)에서의 값을 2차원이 아닌 일차 다항식 형태로 근사합니다.

 

하나의 공식으로 합쳐진 P(x, y)를 아래와 같이 좌표 (x, y) 기준 다항식으로 변환 할 수 있습니다.

f(x,y)=a0​+a1​x+a2​y+a3​xy

a0​=Ax2​y2​−Bx1​y2​−Cx2​y1​+Dx1​y1

a1​=−Ay2​+By2​−Cy1​+Dy1​

a2​=−Ax2​+Bx1​+Cx2​−Dx1​

a3=A+D−B−C

 

따라서 위 f(x,y) 식을 선형시스템으로 가정하여 우리가 알고 있는 4개의 위치 A, B, C, D를 행렬식으로 정리하여 선형대수로 계수 a0, a1, a2, a3를 구할 수 있습니다. 간략히 Ax=b 형태의 Matrix 계산으로 변환할 수 있으며, 주변 4개의 좌표를 이용한 양선형 보간법의 예를 파이썬 코드로 확인 할 수 있습니다. 계수 계산 시 np.lianlg,solve 함수를 사용합니다.

 

| 1 x1 y1 x1y1 |  |a0|      |f1|

| 1 x2 y1 x2y1 |  |a1|  =  |f2|

| 1 x1 y2 x1y2 |  |a2|      |f3|

| 1 x2 y2 x2y2 |  |a3|      |f4|

 

# Linear System Solution Ax=b
import numpy as np

# 4개 점의 좌표와 픽셀값
x1, x2 = 0, 1
y1, y2 = 0, 1
f1, f2, f3, f4 = A, B, C, D

# 계수 행렬 A
M = np.array([
    [1, x1, y1, x1*y1],
    [1, x2, y1, x2*y1],
    [1, x1, y2, x1*y2],
    [1, x2, y2, x2*y2],
])

# 함수값 벡터
f = np.array([f1, f2, f3, f4])

# 계수 a0, a1, a2, a3 계산
a = np.linalg.solve(M, f)

# 양선형 보간 함수
def bilinear_interp(x, y):
    return a[0] + a[1]*x + a[2]*y + a[3]*x*y
728x90
728x90

프로그래밍을 할 수 있는 언어는 크게 인터프리터 Interpreter와 컴파일 Complile 언어로 구분할 수 있습니다. 앞에서 설명한 C-언어가 컴파일 언어의 대표 예입니다. 인터프리터 언어에는 요즘 많이 활용 중인 파이썬 Python과 매트랩 Matlab 언어가 있습니다.

 

매트랩 Matlab은 수치 컴퓨팅, 데이터 분석 및 시각화에 활발히 사용 됩니다. 인터프리터 언어 특성상 사용하기 쉽고 다양한 소프트웨어 패키지를 이용하여 물리, 수학, 금융 및 제어 시스템을 포함한 다양한 과학 및 엔지니어링 분야에서 널리 사용됩니다. 그러나 파이썬은 무료에 반해 매트랩은 유료로 사용할 수 있습니다.

 

파이썬 Python의 경우 인공지능 분야 활용 확대로 활용성이 급격히 상승한 언어 중에 하나이며 다양한 응용 분야에서 활용되고 있습니다. 웹 Web 개발, Deep Learning(D/L), 네트웍, 서버, 게임, GUI 등등. 다만 무료 사용은 장점이지만 파이썬 버전에 따른 활용에 주의할 필요도 있습니다.

 

넘피 NumPy, 판다스 Pandas, Matplotlib, scikit-learn 등의 라이브러리는 다양한 데이터 분석에 활용 됩니다. 장고 Django와 플라스크 Flask와 같은 프레임워크는 확장 가능한 웹 응용 프로그램을 쉽게 개발할 수 있으며, 인공지능 Artificial Intelligence 과 자연어 처리  Natural Language Processing  분야에서는 텐서플로우 TensorFlow와 파이토치 PyTorch와 같은 프레임워크를 활용하여 훈련하는데 사용됩니다.

 

SciPy와 SymPy와 같은 라이브러리는 과학적 컴퓨팅, 수학적 문제 해결, 시뮬레이션 수행을 위한 도구들을 제공합니다. Pygame 라이브러리는 간단한 비디오 게임을 작성하기 위한 모듈을 제공합니다.

 

파이썬은 그래픽 사용자 인터페이스(GUI) 개발하는 데 사용될 수 있으며, Tkinter, PyQt 및 Kivy와 같은 라이브러리는 Desktop Application을 쉽게 구축할 수 있습니다.

728x90

+ Recent posts