2

情况

我正在尝试对黑白图像应用高通滤波器,以通过保持高频来增强纹理。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. 如果这种方法是正确的,我仍然不知道如何在过滤图像后回到空间域。

4

0 回答 0