自适应中值滤波python
时间: 2023-07-25 11:07:04 浏览: 114
自适应中值滤波
4星 · 用户满意度95%
自适应中值滤波是一种非线性滤波方法,常用于去除图像中的椒盐噪声。它通过对像素周围的邻域进行分析,确定中值滤波器的大小,以达到更好的噪声去除效果。下面是一个简单的 Python 实现:
```python
import cv2
import numpy as np
def adaptive_median_filter(img, max_kernel_size):
# 获取图像尺寸
height, width = img.shape[:2]
# 创建一个与原图像大小相同的空白图像
filtered_img = np.zeros((height, width), np.uint8)
# 遍历每一个像素
for i in range(height):
for j in range(width):
# 确定当前像素的邻域大小
kernel_size = 3
while kernel_size <= max_kernel_size:
# 获取邻域
neighborhood = img[max(i-kernel_size, 0):min(i+kernel_size, height),
max(j-kernel_size, 0):min(j+kernel_size, width)]
# 计算邻域内的中值和极差
median = np.median(neighborhood)
d = np.max(neighborhood) - np.min(neighborhood)
# 如果当前像素的灰度值不在邻域的灰度值范围内,则继续扩大邻域
if median - np.min(neighborhood) > 0 and median - np.max(neighborhood) < 0:
# 对邻域进行中值滤波
filtered_pixel = np.median(neighborhood)
break
# 如果邻域大小已达到最大值,则直接将当前像素的灰度值赋给滤波后的像素
elif kernel_size == max_kernel_size:
filtered_pixel = img[i, j]
break
else:
kernel_size += 2
# 将滤波后的像素值赋给新图像
filtered_img[i, j] = filtered_pixel
return filtered_img
```
这个实现中,我们先创建一个与原图像大小相同的空白图像,然后遍历每一个像素。对于每个像素,我们计算其周围的邻域大小,然后根据邻域内的中值和极差来确定是否需要对邻域进行中值滤波。如果中值不在邻域内,则扩大邻域;如果邻域大小已达到最大值,则直接将当前像素的灰度值赋给滤波后的像素。最后将滤波后的像素值赋给新图像,并返回新图像。
阅读全文