본문 바로가기
Python Library/SciPy

[SciPy] B-spline

by goatlab 2023. 7. 31.
728x90
반응형
SMALL

Signal Processing

 

신호 처리 도구 상자에는 현재 일부 필터링 기능, 필터 설계 도구의 제한된 집합, 1D 및 2D 데이터에 대한 B-spline 보간 알고리즘이 포함되어 있다. 그리고 SciPy의 신호가 실수 또는 복잡한 숫자의 배열이라는 것을 이해해야 한다.

 

B-spline

 

B-spline은 B-spline 계수와 매듭 점의 관점에서 유한 영역에 대한 연속 함수의 근사이다. 매듭 점이 간격으로 동일하게 이격되어 있으면 1-D 함수에 대한 B-spline 근사는 유한 기저 확장이다.

 

 

매듭 간격이 있는 2차원에서 함수 표현은 다음과 같다.

 

 

이러한 식에서 βo는 공간 제한 B-spline 기저 함수의 차수 o이다. 동일한 간격의 매듭 점과 동일한 간격의 데이터 점이 필요하므로 샘플 값 yn에서 계수 cj를 결정하는 빠른 (역필터링) 알고리즘을 개발할 수 있다. 일반적인 spline 보간 알고리즘과 달리 이러한 알고리즘은 큰 이미지에 대한 spline 계수를 신속하게 찾을 수 있다.

 

B-spline 기저 함수를 통해 샘플 세트를 나타내는 장점은 데이터 샘플이 기본 연속 함수로부터 추출되었다고 가정하는 연속 도메인 연산자 (도함수, 재샘플링, 적분 등)를 스플라인 계수로부터 상대적으로 쉽게 계산할 수 있다는 것이다. 예를 들어, spline의 2차 미분은 다음과 같다.

 

 

B-spline의 속성을 사용하면 다음과 같다.

 

 

o가 3일 때, 샘플 포인트에서 다음과 같다.

 

 

따라서, 2차 미분 신호는 spline 적합으로부터 쉽게 계산될 수 있다. 원하는 경우, 스무딩 스플라인은 2차 미분이 무작위 오류에 덜 민감하게 되도록 하는 것을 발견할 수 있다. 데이터 샘플이 컨볼루션 연산자를 통해 매듭 계수와 관련되어 있으므로, 샘플링된 B-spline 함수를 갖는 간단한 컨볼루션은 spline 계수에서 원본 데이터를 복구한다. 컨볼루션의 출력은 경계를 처리하는 방법에 따라 변경될 수 있다 (이것은 데이터 세트의 차원 수가 증가함에 따라 점점 더 중요). B-spline과 관련된 알고리즘은 mirror-symmetric 경계 조건을 가정한다. 따라서, spline 계수는 그 가정을 기반으로 계산되고, 데이터 샘플도 mirror-symmetric이라고 가정함으로써 spline 계수로부터 정확하게 복구될 수 있다.

 

패키지는 1차원 및 2차원 (qspline1dqspline2dcspline1dcspline2d)의 동일한 간격의 샘플에서 2차 및 3차 입방 (cubic) spline 계수를 결정하는 기능을 제공한다. 큰 경우 B-spline 기저 함수는 표준 편차가 동일한 0 평균 가우시안 함수에 의해 잘 근사될 수 있다.

 

 

임의에 대해 이 가우시안을 계산하는 함수는 (gauss_spline) 또한 사용할 수 있다. 다음 코드와 그림은 스플라인 필터링을 사용하여 scipy.datasets.face 명령에 의해 반환되는 배열인 라쿤 얼굴의 에지 이미지 (평활된 스플라인의 2차 미분)를 계산한다. sepfir2d 명령은 mirror-symmetric 경계 조건을 가진 분리 가능한 2-D FIR 필터를 spline 계수에 적용하는 데 사용되었다. 이 함수는 spline 계수에서 샘플을 재구성하는 데 이상적으로 적합하며 임의의 2-D 필터를 합성하고 mirror-symmetric 경계 조건을 선택할 수 있는 convolve2d보다 빠르다.

 

import numpy as np
from scipy import signal, datasets
import matplotlib.pyplot as plt

image = datasets.face(gray=True).astype(np.float32)
derfilt = np.array([1.0, -2, 1.0], dtype=np.float32)
ck = signal.cspline2d(image, 8.0)
deriv = (signal.sepfir2d(ck, derfilt, [1]) + signal.sepfir2d(ck, [1], derfilt))

laplacian = np.array([[0,1,0], [1,-4,1], [0,1,0]], dtype=np.float32)
deriv2 = signal.convolve2d(ck, laplacian,mode='same', boundary='symm')

plt.figure()
plt.imshow(image)
plt.gray()
plt.title('Original image')
plt.show()

plt.figure()
plt.imshow(deriv)
plt.gray()
plt.title('Output of spline edge filter')
plt.show()

 

https://docs.scipy.org/doc/scipy/tutorial/signal.html#filtering

 

Signal Processing (scipy.signal) — SciPy v1.11.1 Manual

The signal processing toolbox currently contains some filtering functions, a limited set of filter design tools, and a few B-spline interpolation algorithms for 1- and 2-D data. While the B-spline algorithms could technically be placed under the interpolat

docs.scipy.org

 

 

 

728x90
반응형
LIST