def median_filter(img, kernel_size): """中值滤波器""" kernel_half = kernel_size // 2 img_median = np.zeros_like(img) # 构建移动窗口 shape = (img.shape[0] - kernel_size + 1, img.shape[1] - kernel_size + 1, kernel_size, kernel_size) strides = (img.strides[0], img.strides[1], img.strides[0], img.strides[1]) windows = np.lib.stride_tricks.as_strided(img, shape=shape, strides=strides) # 对每个窗口进行中值滤波 medians = np.median(windows, axis=(2,3)) # 将中值赋值给输出图像 img_median[kernel_half:img.shape[0] - kernel_half, kernel_half:img.shape[1] - kernel_half] = medians return img_median优化一下
时间: 2024-01-10 18:04:44 浏览: 94
基于matlab使用中值滤波medianfilter算法实现图像去噪
这段代码已经进行了比较好的优化,但如果要进一步提高效率,可以考虑使用并行计算。可以使用Python的`multiprocessing`模块来并行计算每个窗口的中值。
以下是使用`multiprocessing`模块并行计算中值滤波器的优化代码:
```
import multiprocessing
def median_filter(img, kernel_size):
"""中值滤波器"""
kernel_half = kernel_size // 2
img_median = np.zeros_like(img)
# 构建移动窗口
shape = (img.shape[0] - kernel_size + 1,
img.shape[1] - kernel_size + 1,
kernel_size,
kernel_size)
strides = (img.strides[0],
img.strides[1],
img.strides[0],
img.strides[1])
windows = np.lib.stride_tricks.as_strided(img,
shape=shape,
strides=strides)
# 定义并行计算每个窗口中值的函数
def compute_median(window):
return np.median(window)
# 使用多进程并行计算每个窗口的中值
with multiprocessing.Pool() as pool:
medians = pool.map(compute_median, windows.reshape(-1, kernel_size, kernel_size))
medians = np.array(medians).reshape(shape[:2])
# 将中值赋值给输出图像
img_median[kernel_half:img.shape[0] - kernel_half,
kernel_half:img.shape[1] - kernel_half] = medians
return img_median
```
这个优化后的中值滤波器函数使用了`multiprocessing`模块来并行计算每个窗口的中值。我们首先定义了一个`compute_median()`函数来计算每个窗口的中值,然后使用`multiprocessing.Pool()`创建一个进程池,调用`pool.map()`函数来并行计算每个窗口的中值。这种方法可以显著减少计算时间,特别是当处理大型图像时。
阅读全文