def median_filter(img, kernel_size): """中值滤波器""" kernel_half = kernel_size // 2 img_median = np.zeros_like(img) # 对每个像素进行中值滤波 for i in range(kernel_half, img.shape[0] - kernel_half): for j in range(kernel_half, img.shape[1] - kernel_half): # 获取当前像素周围的像素值 neighbors = img[ i - kernel_half: i + kernel_half + 1, j - kernel_half: j + kernel_half + 1 ] # 对这些像素值进行排序 sorted_neighbors = np.sort(neighbors.flatten()) # 取中间的值作为当前像素的值 img_median[i, j] = sorted_neighbors[kernel_half] return img_median优化一下这个代码
时间: 2024-01-18 07:03:08 浏览: 23
可以使用`np.lib.stride_tricks.as_strided()`函数来实现更高效的中值滤波器。以下是优化后的代码:
```
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
```
这个优化后的中值滤波器函数使用了`np.lib.stride_tricks.as_strided()`函数来构建移动窗口,然后使用`np.median()`函数来计算每个窗口的中值。这种方法比原来的双重循环更高效,因为它只需要遍历每个窗口一次。