앨리어싱이 발생한 이미지를 생성해 봅니다.

서론



아날로그 신호를 디지털 신호로 변환할 때 샘플링 주파수 $f_s$의 1/2 크기의 주파수까지만 관측할 수 있습니다.
이 주파수를 나이퀴스트 주파수라고 하지만 이 나이퀴스트 주파수를 초과하는 진동은 저주파수로 처리됩니다.
나이퀴스트 주파수를 넘은 고주파의 진동을 저주파수로서 처리해 버리는 것을 앨리어싱(폴딩 노이즈)이라고 부릅니다.

$x_0$에서 $x_{N-1}$까지의 숫자가 $N$인 데이터의 이산 푸리에 변환을 고려하면,
C_k = \frac{1}{N}\sum_{m=0}^{N-1} x_me^{-i\frac{2\pi km}{N}}
k = 0, 1, 2, …, N-1

k에 해당하는 주파수는
f_k = \frac{kf_s}{N}

됩니다.
$k$는 $(N-1)$까지 존재하기 때문에, $f_{N-1}=\frac{(N-1)f_s}{N}$가 되어, $f_s/2$의 나이퀴스트 주파수를 넘는 진동까지 표현할 수 있을 것 같습니다만…,$C_k$와 $C_{N-k}$는 서로 공역인 복소수인 것이 알려져 있습니다.
C_k = C_{N-k}^*

그 때문에, $f_s/2$를 중앙으로서, 폴드가 발생합니다. 오해를 두려워하지 말고, $C_{N-k}$의 주파수에 해당하는 파는 $C_k$의 주파수의 파로서 처리되어 버립니다.

이미지 생성



numpy를 사용하여 고해상도 이미지(5000×5000)를 생성합니다. 이것을 의사적으로 아날로그 신호로 간주합니다.

import numpy as np
import matplotlib.pyplot as plt

#画像のサイズを指定
img_size_origin = 5000
#画像として零行列
img = np.zeros([img_size_origin, img_size_origin])

#画像の画素の値はy座標に依存
y = np.arange(img_size_origin) 

#周期100画素
amp = np.sin(2*np.pi*0.01*y)
for i in range(img_size_origin):
    img[:, i] = amp

plt.imshow(img, cmap="gray")
plt.show()

이렇게 하면 50개의 줄무늬가 있는 이미지가 생성됩니다.
50개의 줄무늬가 있으므로 전체 이미지를 1주기로 간주하면 50Hz의 파도가 존재하게 됩니다.



이 이미지에서 [comp×comp]당 1픽셀만 추출하여 새로운 이미지를 생성합니다.
comp = 5인 경우, 추출하는 픽셀은 [3 + 5n, 3 + 5m]의 좌표가 됩니다. (n>=0, m>=0)
comp = 99
#出力の画像サイズを計算
img_size = img.shape[0]//comp

#出力の画像
img_comp = np.zeros([img_size, img_size])

#[comp×comp]の画素のうち、中央の画素のみを抜き出し
for i in range(img_size):
    for j in range(img_size):
        img_comp[i, j] = img[(i*comp) + (comp//2), (j*comp) + (comp//2)]

plt.imshow(img_comp, cmap="gray")
plt.show()

plt.plot(img_comp[:, 0])
plt.show()

comp가 99이면



50Hz의 파도를 잘 관측할 수 없어 0.5Hz의 파도가 되어 버렸습니다.



comp가 98이면



50Hz의 파도를 잘 관측할 수 없고, 1Hz의 파도가 되어 버렸습니다.




comp가 96이면



50Hz의 파도를 잘 관측할 수 없어, 2Hz의 파도가 되어 버렸습니다.





끝에



이상한 이미지를 많이 할 수 있을 것 같다 (작은 느낌)

좋은 웹페이지 즐겨찾기