PyWavelets는 다양한 1D, 2D, N차원 데이터에 대해 웨이블릿 변환, 잡음 제거, 신호 분석을 지원하는 Python용 강력한 웨이블릿 처리 라이브러리임.
공식 site url: https://pywavelets.readthedocs.io/en/latest/
관련 gist
https://gist.github.com/dsaint31x/0fac4c521748cfb0c87026409f59417d
dip_wavelet.ipynb
dip_wavelet.ipynb. GitHub Gist: instantly share code, notes, and snippets.
gist.github.com
1. pywt.wavedec2 함수
pywt.wavedec2
함수는 입력 데이터를 지정된 wavelet과 decomposition level로 Multilevel 2D Wavelet Decomposition)을 수행.
2D data(이미지)를
- Low freq. component (=approximation coefficient) 와
- horizontal, vertical, diagonal 방향 및 해상도의 High freq. components (detail이라고 불림) 를 얻는데 사용됨.
1-1. signature
pywt.wavedec2(data, wavelet, level=None, axis=-1, mode='sym') -> list
1-2. parameters 설명:
data
: 2차원 NumPy 배열 형태의 입력 데이터. (여기서는 이미지 img)wavelet
: 사용할 wavelet.- 'db1', 'haar' 과 같은 문자열이나
pywt.Wavelet
instance로 지정가능.
level
: (optional) the number of decomposition levels to perform wavelet transform.None
: 최대 가능한 레벨까지 수행.
axis
: (optional) Wavelet Transform을 적용할 axis(축)을 지정.- 2차원 데이터의 경우 이 인자는 일반적으로 기본값 그대로 사용.
mode
: (optional)- 경계 처리 모드(boundary handling mode).
- padding의 방식을 지정함.
- 기본값은
'sym'
(symmetric).'zero'
,'per'
(periodic)
1-3. return value 설명:
- Wavelet coefficients 을 element로 가지는
list
를 반환.- 이
list
객체의 구조는 다음과 같음:[cA_n, (cH_n, cV_n, cD_n), ..., (cH_1, cV_1, cD_1)]
cA_n
: 최종 레벨의 approximation coefficient.- 나머지는 각 레벨의 detail coefficient tuple임:
(horizontal, vertical, diagonal)
- 이
다음을 참고할 것
- cA : Approximation coefficient
- cH : Horizontal detail coefficient
- cV : Vertical detail coefficient
- cD : Diagonal detail coefficient
- _n : decomposition level임.
2. pywt.waverec2
pywt.waverec2
함수는 Multilevel 2D Wavelet Reconstruction을 수행하여,
웨이블릿 변환된 계수들(wavelet coefficients)로부터 원래의 2D 데이터를 복원.
2D 웨이블릿 계수 리스트를 입력받아
- approximation coefficient와
- 각 레벨의 horizontal, vertical, diagonal detail coefficients를 결합하여
원본 이미지 형태의 2D 데이터를 재구성할 때 사용됨.
2-1. signature
pywt.waverec2(coeffs, wavelet, mode='sym') -> ndarray
2-2. parameters 설명:
coeffs
: 2D 웨이블릿 계수 리스트pywt.wavedec2()
가 반환하는 형태와 같은 구조:[cA_n, (cH_n, cV_n, cD_n), ..., (cH_1, cV_1, cD_1)]
wavelet
: 사용할 wavelet.- ‘db1’, ‘haar’와 같은 문자열 또는
pywt.Wavelet
instance로 지정 가능.
mode
: (optional)- 경계 처리 모드(boundary handling mode).
- padding 방식을 지정.
- 기본값은
'sym'
(symmetric).'zero'
,'per'
(periodic) 등 선택 가능.
2-3. return value 설명:
- 2차원 NumPy ndarray 형태의 복원된 데이터(이미지)를 반환함.
waverec*
으로*
가 없으면 1D용이고,2
인 경우 이미지,n
인 경우 n차원 wavelet transform임.
3. pywt.coeffs_to_array
coeffs
리스트에 담긴 wavelet coefficients를 하나의 NumPy의 ndarray 객체로 만들고, 그 결과를 arr
에 저장.
만약 extract_slice=True
(기본값)로 호출시 coeff_slices
변수에도 그 매핑 정보가 저장됨.
3-1. signature
pywt.coeffs_to_array(coeffs, padding=0) -> (coeff_arr, coeff_slices)
3-2. parameters 설명:
coeffs
: 변환할 wavelet coefficients.pywt.wavedec2
함수가 반환하는 것과 같은 형태의 리스트 또는 튜플의 중첩 구조여야 함.
padding=0
: (optional) float의 값으로 패딩에 사용할 값 지정.- 기본값은 0
None
인 경우, coefficients가 tightly packed가 아닌 경우 error 발생.
axes
: (optional) Discrete Wavelet Transform이 이루어진 axis들을 지정.None
이 기본값이며, 이 경우 모든 축에 대해 수행이 된 것으로 간주.
return value 설명:
coeff_arr
: Wavelet transform coefficient array (NumPy ndarray)coeff_slices
:- 웨이블릿 계수들을 하나의 큰 배열(arr)로 합친
coeff_arr
으로부터 - 원래의 wavelet coefficient 구조 (파라메터
coeffs
list객체의 구조)로 다시 만들기 위한 slicing 정보.
- 웨이블릿 계수들을 하나의 큰 배열(arr)로 합친
coeffs_arr
의 구조는 다음과 같음:
+---------------+---------------+-------------------------------+
| | | |
| c[0] | c[1]['ad'] | |
| | | |
+---------------+---------------+ c[2]['ad'] |
| | | |
| c[1]['da'] | c[1]['dd'] | |
| | | |
+---------------+---------------+ ------------------------------+
| | |
| | |
| | |
| c[2]['da'] | c[2]['dd'] |
| | |
| | |
| | |
+-------------------------------+-------------------------------+
실제 이미지를 이용한 예는 다음과 같음 (가운데 DWT):
coeff_slices
의 예는 다음과 같음:
[(slice(None, 120, None), slice(None, 160, None)), # c[0]의 슬라이싱 정보
{'ad': (slice(None, 120, None), slice(160, 320, None)), # c[1]['ad']의 슬라이싱 정보 cH
'da': (slice(120, 240, None), slice(None, 160, None)), # c[1]['da']의 슬라이싱 정보 cV
'dd': (slice(120, 240, None), slice(160, 320, None))}, # c[1]['dd']의 슬라이싱 정보 cD
{'ad': (slice(None, 240, None), slice(320, 640, None)), # c[2]['ad']의 슬라이싱 정보 cH
'da': (slice(240, 480, None), slice(None, 320, None)), # c[2]['da']의 슬라이싱 정보 cV
'dd': (slice(240, 480, None), slice(320, 640, None))}] # c[2]['dd']의 슬라이싱 정보 cD
- 행,열 = approximation, detail = ad = cH (Horizontal detail)
4. pywt.array_to_coeffs
pywt.coeffs_to_array()
가 반환한 하나로 합친 웨이블릿 계수 배열(NumPy의 ndarray)과 위치 정보(coeff_slices
)를 이용해 원래의 계수 리스트 구조로 복원하는 함수
4-1. Signature
pywt.array_to_coeffs(arr, coeff_slices, output_format) -> coeffs
4-2. parameters 설명:
arr
:pywt.coeffs_to_array()
를 통해 얻은 하나로 합쳐진 wavelet coefficient array- NumPy ndarray 객체
- approximation과 detail 계수가 타일 형태로 포함되어 있음.
coeff_slices
:pywt.coeffs_to_array()
가 반환한 slicing 정보.- 원래의 wavelet coefficient 구조로 다시 복원할 때
- 각 계수의 위치와 모양을 알려주는 정보.
output_format
: 복원할 웨이블릿 계수의 구조 형태를 지정.- 문자열로, 보통 다음 중 하나를 사용:
'wavedec2'
: 2D 웨이블릿 계수 구조로 복원 (리스트+튜플 형태)'wavedec'
: 1D 웨이블릿 계수 구조로 복원'wavedecn'
: 다차원(ND) 웨이블릿 계수 구조로 복원
- 문자열로, 보통 다음 중 하나를 사용:
4-3. return value 설명:
coeffs
:pywt.wavedec*
함수가 반환하는 것과 같은 형태의 복원된 list객체coeff_slices
정보에 기반하여arr
에서 slicing을 수행해 원래의 계수 구조로 되돌림.
5. pywt.threshold
pywt.threshold
함수는
웨이블릿 계수나 일반 배열 데이터에 thresholding을 적용하여 잡음 제거 또는 희소화(sparsification)를 수행.
입력 데이터의 절댓값을 기준으로 지정한 임계값(threshold) 이하의 값을 제거하거나 줄여서, 잡음 성분을 억제하는 데 사용됨.
주의할 것은 pywt.threshold
는 thresholding을 할 때 입력 데이터의 절댓값을 기준으로 처리
5-1. signature
pywt.threshold(data, value, mode, substitute=0, axes=None) -> ndarray
5-2. parameters 설명:
data
: thresholding을 적용할 입력 데이터.- NumPy ndarray 또는 스칼라 가능.
- value: threshold 값 (임계값).
float
또는int
로 지정.
mode
: thresholding 방식.- ‘hard’ : hard thresholding 적용 (임계값 이하의 계수는 0으로 만듦).
- ‘soft’ : soft thresholding 적용 (임계값 이하를 0으로 하고, 초과분은 value만큼 줄임).
substitute
: (optional) hard thresholding에서 threshold 이하 계수를 대체할 값.- 기본값은 0.
axes
: (optional) thresholding을 적용할 축을 지정.- None인 경우, 모든 축에 대해 thresholding이 적용됨.
5-3. return value 설명:
- thresholding이 적용된 결과 데이터
- NumPy ndarray 또는 입력과 동일한 타입의 객체.
5-4. Threasholding 모드
5-4-1. Hard thresholding
입력 데이터 $x$에 대해 임계값 $T$를 기준으로
$$
\text{hard}(x, T) =
\begin{cases}
x, & |x| \geq T \\
\text{substitute}, & |x| < T
\end{cases}
$$
5-4-2. Soft thresholding
입력 데이터 $x$에 대해 임계값 $T$를 기준으로
$$
\text{soft}(x, T) =
\begin{cases}
\operatorname{sign}(x) \cdot (|x| - T), & |x| \geq T \\
0, & |x| < T
\end{cases}
$$
같이보면 좋은 자료들
2024.09.02 - [.../Signals and Systems] - [SS] Wavelet Transform
[SS] Wavelet Transform
Wavelet 변환: 신호 처리에서의 시간과 주파수의 세밀한 분석Wavelet 변환은 신호 처리와 데이터 분석의 중요한 수학적 도구임. $\sin, \cos$ 을 basis function으로 삼는 Fourier Transform 과 달리Wavelet 변환은
dsaint31.tistory.com
2025.06.30 - [Programming/DIP] - [DIP] Discrete Wavelet Transform: Wavelet Decomposition
[DIP] Discrete Wavelet Transform: Wavelet Decomposition
다음은 DWT의 수식이다.$$ W_\Psi (f)(j,k) = \sum_n f[n] \Psi^*_{j,k} [n] \\ \Psi_{j,k} [n] = \frac{1}{\sqrt{2^j}}\Psi \left( \frac{ n-k2^j }{2^j} \right)$$ 간단하게는 CWT의 discrete version으로 이해하면 되고, 사실 이를 바탕으로
dsaint31.tistory.com
'Programming > DIP' 카테고리의 다른 글
Image Synthesis (1) | 2025.07.04 |
---|---|
[DIP] Discrete Wavelet Transform: Wavelet Decomposition (0) | 2025.06.30 |
Raster Graphics vs. Vector Graphics (0) | 2025.06.28 |
[DIP] Digital Image 란? (0) | 2025.06.28 |
[CV] Scene 과 Image: Computer Graphics 와 Computer Vision (0) | 2025.06.22 |