情况
我正在尝试对黑白图像应用高通滤波器,以通过保持高频来增强纹理。signal.welch()
目标是从从scipy
库中应用的结果中获得的特定频率值中进行过滤。到目前为止,我尝试过的代码运行良好,我可以绘制频率-PSD 图并直观地识别感兴趣的频率值。
编码
以下代码采用 2D numpy 数组图像并计算每个水平线导数的 PSD,并获得绘制周期图的平均值。
def plot_periodogram(image):
# Calculate increment for each line (derivative)
img_incr = np.diff(image[:,:,0], axis=1)
# Calculate PSD for each increment of the line
f_tot, Pxx_tot = [], []
for i in range(image.shape[0]):
f, Pxx = signal.welch(img_incr[i,:])
f_tot.append(f)
Pxx_tot.append(Pxx)
# Calculate mean of the increments of the line
f_mean = np.mean(f_tot, axis=0)
Pxx_mean = np.mean(Pxx_tot, axis=0)
# log-log plot of frequency-PSD
plt.loglog(f_mean, Pxx_mean)
plt.xlabel('frequency [Hz]')
plt.ylabel('PSD')
plt.show()
return f_mean, Pxx_mean, f_tot, Pxx_tot
f_mean, Pxx_mean, f_tot, Pxx_tot = plot_periodogram(img)
在此示例图像中(忽略红线),f=0.23 附近的峰值有助于识别应用滤波器的**截止频率**(即 fc=0.23)。
问题
有了截止频率,我应该如何在频域中过滤图像并返回空间域?
我最好的猜测是我应该将所有Pxx_tot
对应的元素f_tot
都设置为 0 低于fc
. 如果这种方法是正确的,我仍然不知道如何在过滤图像后回到空间域。