python 能否帮我写一个低通滤波函数 核大小可以自己设定 该函数支持float64 类型
时间: 2024-02-09 21:12:57 浏览: 62
python实现低通滤波器代码
4星 · 用户满意度95%
当然可以,以下是一个自定义低通滤波函数的示例代码,支持float64类型:
```python
import numpy as np
from scipy import signal
def lowpass_filter(img, kernel_size, sigma):
"""
自定义低通滤波函数
:param img: 输入的图像
:param kernel_size: 滤波核大小,必须为奇数
:param sigma: 高斯核标准差
:return: 低通滤波后的图像
"""
# 检查滤波核大小是否为奇数
if kernel_size % 2 == 0:
kernel_size += 1
# 生成高斯核
x, y = np.meshgrid(np.linspace(-1, 1, kernel_size), np.linspace(-1, 1, kernel_size))
d = np.sqrt(x * x + y * y)
gaussian_kernel = np.exp(-(d ** 2) / (2.0 * sigma ** 2))
gaussian_kernel /= np.sum(gaussian_kernel)
# 对图像进行卷积
return signal.convolve2d(img, gaussian_kernel, mode='same', boundary='symm')
# example
img = np.random.rand(512, 512)
result = lowpass_filter(img, 5, 2)
```
该函数的实现过程是先检查滤波核大小是否为奇数,然后生成高斯核,对输入图像进行卷积。其中,高斯核的生成使用了numpy.meshgrid函数生成x坐标和y坐标的网格,然后计算每个点到中心点的距离d,再根据高斯分布函数计算每个点的权重,最后将所有权重归一化即可。卷积使用了scipy.signal.convolve2d函数,可以指定卷积模式和边界处理方式。需要注意的是,该函数只支持单通道的图像,如果输入图像是多通道的,需要对每个通道分别进行低通滤波。
阅读全文