![]() 각 보간법의 결과 예시 |
![]() Cubic Interpolation은 과적합 위험이 크다. |
보간(Interpolation)이란?
Known data points를 바탕으로 새로운 data point의 값을 추정하는 기법
Nearst Neighbor Interpolation
값을 추정하고자 하는 data point에서 가장 가까운 data point의 값을 그대로 사용하는 방식
특장점
- 계산 단순 → 구현이 쉬우며 속도가 빠름 → 실시간성
- 결과의 불연속성 → 경계값에서 변위 커짐
- 거리 함수에 따라 가장 가까운 data point가 다르게 선정될 수 있다.
Linear Interpolation
2개의 Known data points를 바탕으로 1차 보간(Interpolation) 함수를 계산하여 값을 추정하는 방식
$$
y = y_0 + \frac{(y_1 - y_0)(x-x_0)}{x_1 - x_0}
$$
특장점
- 계산이 단순하고 빠름
- 비선형 데이터에 부적절
Cubic Interpolation
4개의 known data points를 바탕으로 3차 보간 함수를 계산하여 값을 추정하는 방식
특장점
- 3차 다항식 사용 → 연속
- 선형 보간보다 높은 정확도
- 계산이 복잡함
- 과적합 위험성 높음
Cubic Spline Interpolation
Spline Interpolation
- Data points를 구간으로 나누고 각 구간에 대한 다항식을 생성한다.
- 각 구간에서의 함수와 도함수가 연속하도록 설계되어 전체 구간에서 연속하고 미분가능하다.
Cublic Spline Interpolation
- 인접한 두 개의 data points를 하나의 구간으로 정의.
- 각 구간에서 아래 조건을 만족하는 삼차 함수를 구한다.
- 함수의 연속
- 도함수의 연속
- 2차 도함수의 연속
- 경계조건(양 끝점에서 2차 도함수가 0)
참고
보간법 예시 Python 코드
import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import interp1d, lagrange
# 원본 데이터 생성
x = np.random.choice(range(20), size=9, replace=False)
y = np.random.choice(range(40), size=9, replace=False)
# 보간을 위한 새로운 x 값 생성
x_new = np.linspace(min(x), max(x), 500)
# 보간 함수 생성
f_nearest = interp1d(x, y, kind='nearest')
f_linear = interp1d(x, y, kind='linear')
f_cubic = interp1d(x, y, kind='cubic')
f_lagrange = lagrange(x, y)
# 보간 결과 계산
y_nearest = f_nearest(x_new)
y_linear = f_linear(x_new)
y_cubic = f_cubic(x_new)
y_lagrange = f_lagrange(x_new)
# 그래프 그리기
plt.figure(figsize=(10, 6))
plt.plot(x_new, y_nearest, label='Nearest Neighbor', linestyle='--')
plt.plot(x_new, y_linear, label='Linear', linestyle=':')
plt.plot(x_new, y_cubic, label='Cubic', linestyle='-')
#plt.plot(x_new, y_lagrange, label='Lagrange', linestyle='-')
plt.plot(x, y, 'o', label='Original Data')
plt.title('Interpolation Methods Comparison')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.grid(True)
plt.show()
이미지 보간 예시 Python 코드
import cv2
import numpy as np
import matplotlib.pyplot as plt
import requests
# 원본 이미지 크기 설정
width, height = 64, 64 # 원본 이미지 크기
# Picsum Photos에서 무작위 이미지 가져오기
url = f"https://picsum.photos/{width}/{height}"
response = requests.get(url)
image_array = np.asarray(bytearray(response.content), dtype=np.uint8)
original_image = cv2.imdecode(image_array, cv2.IMREAD_COLOR)
# 확대 비율 설정
scale_factor = 2
new_width = width * scale_factor
new_height = height * scale_factor
# 보간 방법에 따른 이미지 확대
resized_nearest = cv2.resize(original_image, (new_width, new_height), interpolation=cv2.INTER_NEAREST)
resized_linear = cv2.resize(original_image, (new_width, new_height), interpolation=cv2.INTER_LINEAR)
resized_cubic = cv2.resize(original_image, (new_width, new_height), interpolation=cv2.INTER_CUBIC)
# BGR을 RGB로 변환 (Matplotlib에서 올바른 색상 표시를 위해)
original_image_rgb = cv2.cvtColor(original_image, cv2.COLOR_BGR2RGB)
resized_nearest_rgb = cv2.cvtColor(resized_nearest, cv2.COLOR_BGR2RGB)
resized_linear_rgb = cv2.cvtColor(resized_linear, cv2.COLOR_BGR2RGB)
resized_cubic_rgb = cv2.cvtColor(resized_cubic, cv2.COLOR_BGR2RGB)
# 결과 이미지 표시
plt.figure(figsize=(12, 8))
plt.subplot(2, 2, 1)
plt.imshow(original_image_rgb)
plt.title(f"Original ({width}x{height})")
plt.axis("off")
plt.subplot(2, 2, 2)
plt.imshow(resized_nearest_rgb)
plt.title(f"Nearest Neighbor({scale_factor}x)")
plt.axis("off")
plt.subplot(2, 2, 3)
plt.imshow(resized_linear_rgb)
plt.title(f"Linear Interpolation({scale_factor}x)")
plt.axis("off")
plt.subplot(2, 2, 4)
plt.imshow(resized_cubic_rgb)
plt.title(f"Cubic Interpolation({scale_factor}x)")
plt.axis("off")
plt.tight_layout()
plt.show()
'CS' 카테고리의 다른 글
Support Vector Machine(SVM) 간략하게 이해하기 (0) | 2025.05.02 |
---|