python自适应中值滤波
时间: 2025-05-10 14:25:44 浏览: 18
### Python 实现自适应中值滤波算法
#### 自适应中值滤波简介
自适应中值滤波是一种能够根据局部像素的灰度值特征动态调整滤波器大小和形状的技术,旨在有效去除噪声的同时保留图像细节[^1]。
#### 算法核心逻辑
为了实现这一目标,通常会定义两个阈值 `Zmin` 和 `Zmax` 来表示当前窗口内的最小值与最大值;以及中心位置处的原始像素强度 `Zmed` 表示该区域内的中位数。如果检测到异常点,则扩大搜索范围直到满足条件为止或者达到预设的最大尺寸限制[^3]。
下面是具体的Python代码实现:
```python
import numpy as np
from scipy import ndimage
def adaptive_median_filter(image, max_size=7):
"""
对给定二维数组应用自适应中值滤波
参数:
image (numpy.ndarray): 输入待处理的灰度图
max_size (int): 最大允许的过滤器窗口边长,默认为7
返回:
filtered_image (numpy.ndarray): 经过自适应中值滤波后的输出图像
"""
def get_window(img_slice):
"""获取指定子区域内统计特性"""
z_min = img_slice.min()
z_max = img_slice.max()
z_med = np.median(img_slice)
return z_min, z_max, z_med
height, width = image.shape[:2]
padded_img = np.pad(image, ((max_size//2,),)*2, mode='reflect')
result = np.zeros_like(padded_img)
for y in range(max_size // 2, height + max_size // 2):
for x in range(max_size // 2, width + max_size // 2):
current_win_sz = min(3, max_size) # 初始化窗口大小
while True:
window = padded_img[y-(current_win_sz//2):y+(current_win_sz//2)+1,
x-(current_win_sz//2):x+(current_win_sz//2)+1]
z_min, z_max, z_med = get_window(window)
if not(z_min < z_med < z_max):
break
elif current_win_sz >= max_size:
result[y,x]=z_med
break
else:
current_win_sz += 2
else:
center_val=padded_img[y,x]
if z_min<center_val<z_max:
result[y,x]=center_val
else:
result[y,x]=z_med
return result[max_size//2:-max_size//2,max_size//2:-max_size//2]
# 测试用例
if __name__ == "__main__":
from skimage.data import camera
noisy_image = camera() + np.random.poisson(lam=50, size=camera().shape).astype(np.uint8)
clean_image = adaptive_median_filter(noisy_image.astype(float), max_size=9)
```
此段程序首先导入必要的库文件并定义辅助函数用于提取感兴趣区间的极值及中间数值。接着,在主功能部分实现了完整的AMF流程——从初始化参数设置开始直至最终完成逐像素扫描更新操作。最后提供了一个简单的测试场景以便验证效果如何。
阅读全文
相关推荐


















