用python代码实现自适应中值滤波器去除椒盐噪声,不调用openCV库
时间: 2024-05-14 07:14:33 浏览: 10
以下是使用Python实现自适应中值滤波器去除椒盐噪声的示例代码:
```python
import numpy as np
from scipy.signal import medfilt2d
def adaptive_median_filter(image, kernel_size=3, max_kernel_size=7):
"""
自适应中值滤波器
:param image: 输入图像
:param kernel_size: 初始核大小
:param max_kernel_size: 最大核大小
:return: 滤波后的图像
"""
height, width = image.shape[:2]
filtered_image = np.zeros((height, width), dtype=np.uint8)
for i in range(height):
for j in range(width):
# 当前像素点的领域范围
kernel_half_size = kernel_size // 2
kernel_range = range(-kernel_half_size, kernel_half_size + 1)
kernel_pixels = []
for k in kernel_range:
for l in kernel_range:
# 越界处理
if i + k < 0 or i + k >= height or j + l < 0 or j + l >= width:
continue
kernel_pixels.append(image[i + k, j + l])
# 中值滤波
kernel_pixels.sort()
median_value = kernel_pixels[len(kernel_pixels) // 2]
# 判断是否是椒盐噪声
if median_value == 0 or median_value == 255:
# 滑动窗口扩大
kernel_size += 2
# 达到最大核大小时停止扩大
if kernel_size > max_kernel_size:
filtered_image[i, j] = median_value
else:
continue
else:
# 中值滤波
filtered_image[i, j] = median_value
return filtered_image
# 测试
import cv2
# 读取图像
image = cv2.imread('lena.png', cv2.IMREAD_GRAYSCALE)
# 添加椒盐噪声
noise_image = image.copy()
noise_density = 0.05
noise_num = int(noise_density * image.shape[0] * image.shape[1])
for i in range(noise_num):
x, y = np.random.randint(0, image.shape[0]), np.random.randint(0, image.shape[1])
noise_image[x, y] = 255 if np.random.rand() > 0.5 else 0
# 自适应中值滤波
filtered_image = adaptive_median_filter(noise_image)
# 中值滤波
median_filtered_image = medfilt2d(noise_image, kernel_size=3)
# 显示结果
cv2.imshow('Original image', image)
cv2.imshow('Noisy image', noise_image)
cv2.imshow('Filtered image', filtered_image)
cv2.imshow('Median filtered image', median_filtered_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
注意:在实现过程中,当中值滤波结果为0或255时,需要将滑动窗口扩大,直到达到最大核大小时停止扩大。这个过程需要注意边界判断和核大小的变化。