高斯高通滤波python
时间: 2024-12-28 16:28:24 浏览: 4
### 高斯高通滤波器的Python实现
高斯高通滤波器主要用于增强图像边缘和其他高频成分,抑制低频成分。为了实现这一功能,在频率域应用高斯高通滤波器是一个常见做法。
下面展示了一个利用`numpy`和`opencv-python`库来创建并应用高斯高通滤波器的例子[^1]:
```python
import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
def create_gaussian_high_pass_filter(shape, cutoff_frequency):
rows, cols = shape
crow, ccol = int(rows / 2), int(cols / 2)
# 创建一个全零矩阵作为掩模
mask = np.zeros((rows, cols))
# 构建距离中心的距离矩阵
distance_matrix = (np.hypot(*np.ogrid[:rows, :cols]) - np.sqrt(crow ** 2 + ccol ** 2)) ** 2
# 应用高斯函数计算权重
mask = 1 - np.exp(-distance_matrix / (2 * (cutoff_frequency ** 2)))
return mask
def apply_fft_and_filter(image_path, cutoff_frequency=30):
img = cv.imread(image_path, 0)
dft = cv.dft(np.float32(img), flags=cv.DFT_COMPLEX_OUTPUT)
dft_shift = np.fft.fftshift(dft)
magnitude_spectrum = 20 * np.log(cv.magnitude(dft_shift[:, :, 0], dft_shift[:, :, 1]))
rows, cols = img.shape
ghp_mask = create_gaussian_high_pass_filter((rows, cols), cutoff_frequency=cutoff_frequency)
fshift = dft_shift * ghp_mask
f_ishift = np.fft.ifftshift(fshift)
img_back = cv.idft(f_ishift)
img_back = cv.magnitude(img_back[:, :, 0], img_back[:, :, 1])
plt.subplot(131),plt.imshow(img, cmap='gray')
plt.title('Input Image'), plt.xticks([]), plt.yticks([])
plt.subplot(132),plt.imshow(magnitude_spectrum, cmap='gray')
plt.title('Magnitude Spectrum'), plt.xticks([]), plt.yticks([])
plt.subplot(133),plt.imshow(img_back, cmap='gray')
plt.title('Filtered Image'), plt.xticks([]), plt.yticks([])
plt.show()
apply_fft_and_filter('path_to_image.jpg', cutoff_frequency=30)
```
此代码片段展示了如何定义一个名为`create_gaussian_high_pass_filter()`的方法用于构建高斯高通滤波器,并通过傅里叶变换将输入图片转换到频域中进行过滤处理后再逆变回空间域显示最终效果。
阅读全文