davipeix
davipeix

Reputation: 65

High pass filter with specific cut-off frequency

The situation

I am trying to apply a high pass filter to a black&white image to enhance the texture by keeping the high frequencies. The goal is to filter from a specific frequency value obtained from the outcome of applying signal.welch() from scipy library. Up to this point, the code I have tried works good enough that I could plot the frequency-PSD graph and visually identify the frequency value of interest.

The code

The following code takes a 2D numpy array image and calculates the PSD for each horizontal line derivative, and obtains the mean to plot the periodogram.

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)

In this sample image (ignore red lines), the peak around f=0.23 helps to identify the **cut-off frequency ** (i.e. fc=0.23) which should be used to apply the filter.

The Question

Having the cut-off frequency, how should I proceed to filter the image in frequency domain and return to spatial domain?

My best guess is that I should turn to 0 all Pxx_tot elements whose corresponding f_tot are lower than fc. If this approach is correct, I still don't know how to go back to spatial domain after filtering the image.

Upvotes: 2

Views: 412

Answers (0)

Related Questions