각 보간법의 결과 예시

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