【发布时间】:2019-12-11 15:21:47
【问题描述】:
我正在实施本文中的方法: https://dspace.mit.edu/bitstream/handle/1721.1/66243/Picard_Noncontact%20Automated.pdf?sequence=1&isAllowed=y
主要思想是使用 10 秒视频中的一组帧 (N=300) 进行心脏脉搏测量,因此帧速率等于 30 fps。
red = [item[:,:,0] for item in imgs]
green = [item[:,:,1] for item in imgs]
blue = [item[:,:,2] for item in imgs]
red_avg = [item.mean() for item in red]
green_avg = [item.mean() for item in green]
blue_avg = [item.mean() for item in blue]
red_mean, red_std = np.array(red_avg).mean(), np.array(red_avg).std()
green_mean, green_std = np.array(green_avg).mean(), np.array(green_avg).std()
blue_mean, blue_std = np.array(blue_avg).mean(), np.array(blue_avg).std()
red_avg = [(item - red_mean)/red_std for item in red_avg]
green_avg = [(item - green_mean)/green_std for item in green_avg]
blue_avg = [(item - blue_mean)/blue_std for item in blue_avg]
data = np.vstack([signal.detrend(red_avg), signal.detrend(green_avg), signal.detrend(blue_avg)]).reshape(300,3)
from sklearn.decomposition import FastICA
transformer = FastICA(n_components=3)
X_transformed = transformer.fit_transform(data)
from scipy.fftpack import fft
first = X_transformed.T[0]
second = X_transformed.T[1]
third = X_transformed.T[2]
ff = np.fft.fft(first)
fs = np.fft.fft(second)
ft = np.fft.fft(third)
imgs - 是具有 300 个图像像素值的数组的初始列表。
如您所见,我将所有帧拆分为 RGB 通道,因此有痕迹x_i(t),其中i = 1,2,3
标准化后,我们去除所有迹线的趋势并将它们堆叠以进一步应用 ICA,然后对所有三个组件进行 FFT。
然后,该方法声称我们需要绘制功率与频率 (Hz) 的关系图,并选择最有可能是心脏脉冲的分量。
最后,我们对选定的源信号应用快速傅里叶变换 (FFT) 获得功率谱。脉冲频率被指定为频率 对应于工作频段内频谱的最高功率。为了 在我们的实验中,我们将操作范围设置为 [0.75, 4] Hz(对应于 [45, 240] bpm) 以提供广泛的心率测量。
这是我尝试将频率可视化的方法:
import numpy as np
import matplotlib.pyplot as plt
from scipy import signal
data = ft
print(fs.size)
ps = np.abs(np.fft.fft(data))**2
sampling_rate = 30
freqs = np.fft.fftfreq(data.size, 1/sampling_rate)
idx = np.argsort(freqs)
#print(idx)
plt.plot(freqs[idx], ps[idx])
我得到的完全不同,因为频率范围从 $-15$ 到 $15$,我不知道这是否以赫兹为单位。
上面的三张图片是我在执行代码以可视化频率和信号功率时得到的。
如果有任何帮助或建议,我将不胜感激。
【问题讨论】:
标签: python numpy scipy signal-processing