自适应中值滤波器的python代码实现-----冈萨雷斯数字图像处理

基本原理:

自适应中值滤波器是一种图像处理技术,用于去除图像中的噪声。其原理是根据像素周围邻域内像素值的特性,动态地选择滤波器的大小和中值滤波的程度。

**邻域选择:**对于每个像素点,选取一个窗口或者邻域,通常是一个正方形或者矩形窗口,在这个窗口内进行滤波操作。
像素排序:对于选取的窗口内的像素值,按照大小进行排序,找出其中间值(中位数)。
**噪声检测:**比较中心像素值与中位数的差值,通过一定的阈值来判断这个窗口内是否存在噪声。如果中心像素值与中位数的差值超过了设定的阈值,说明这个像素可能受到了噪声的影响。
**滤波处理:**如果被判定为受噪声影响的像素,则将中心像素值替换为中位数值,否则保持原来的像素值不变。

自适应中值滤波器的优点是可以根据像素周围局部区域的情况来动态地调整滤波器的大小和中值滤波的程度,能够更好地适应不同类型和程度的噪声。但是,它也有可能在某些情况下无法有效去除噪声或者造成图像细节的损失,因此在实际应用中需要根据具体情况进行调整和优化。

在这里插入图片描述

编写代码,输出如下图所示的结果

在这里插入图片描述

注意:

这是一幅被胡椒和盐粒概率均为0.25的严重椒盐噪声污染的图像。结果依次显示了中值滤波器、自适应中值滤波器对该图像滤波的结果。注意观察自适应滤波器对图像清晰度和细节的较好保持。

代码实现

import cv2
import numpy as np
import skimage
from matplotlib import pyplot as plt

img = cv2.imread('Fig0514.tif',0)

#中值滤波器
def median_filter(image, kernel):
    height, width = image.shape[:2]
    m, n = kernel.shape[:2]

    padding_h = int((m - 1) / 2)
    padding_w = int((n - 1) / 2)

    # 这样的填充方式,可以奇数核或者偶数核都能正确填充
    image_pad = np.pad(image, ((padding_h, m - 1 - padding_h), \
                               (padding_w, n - 1 - padding_w)), mode="edge")

    image_result = np.zeros(image.shape)
    for i in range(height):
        for j in range(width):
            temp = image_pad[i:i + m, j:j + n]
            image_result[i, j] = np.median(temp)
    return image_result

def adaptive_median_denoise(image, sxy=3, smax=7):
    epsilon = 1e-8
    height, width = image.shape[:2]
    m, n = smax, smax

    padding_h = int((m - 1) / 2)
    padding_w = int((n - 1) / 2)
    # 这样的填充方式,可以奇数核或者偶数核都能正确填充
    image_pad = np.pad(image, ((padding_h, m - 1 - padding_h), \
                               (padding_w, n - 1 - padding_w)), mode="edge")

    img_new = np.zeros(image.shape)

    for i in range(padding_h, height + padding_h):
        for j in range(padding_w, width + padding_w):
            sxy = 3  # 每一轮都重置
            k = int(sxy / 2)
            block = image_pad[i - k:i + k + 1, j - k:j + k + 1]
            zxy = image[i - padding_h][j - padding_w]
            zmin = np.min(block)
            zmed = np.median(block)
            zmax = np.max(block)

            if zmin < zmed < zmax:
                if zmin < zxy < zmax:
                    img_new[i - padding_h, j - padding_w] = zxy
                else:
                    img_new[i - padding_h, j - padding_w] = zmed
            else:
                while True:
                    sxy = sxy + 2
                    k = int(sxy / 2)

                    if zmin < zmed < zmax or sxy > smax:
                        break

                    block = image_pad[i - k:i + k + 1, j - k:j + k + 1]
                    zmed = np.median(block)
                    zmin = np.min(block)
                    zmax = np.max(block)

                if zmin < zmed < zmax or sxy > smax:
                    if zmin < zxy < zmax:
                        img_new[i - padding_h, j - padding_w] = zxy
                    else:
                        img_new[i - padding_h, j - padding_w] = zmed

    return img_new

# 自适中值滤波器处理椒盐噪声
kernel = np.ones([7,7])

img_arithmentic_mean = median_filter(img, kernel=kernel)
img_adaptive_median = adaptive_median_denoise(img)

plt.figure(figsize=(7,4))
plt.subplot(1,3,1)
plt.imshow(img, cmap = 'gray')
plt.title('original'), plt.xticks([]),plt.yticks([])
plt.subplot(1,3,2)
plt.imshow(img_arithmentic_mean, cmap = 'gray')
plt.title('median'), plt.xticks([]),plt.yticks([])
plt.subplot(1,3,3)
plt.imshow(img_adaptive_median, cmap = 'gray')
plt.title('adaptive'), plt.xticks([]),plt.yticks([])
plt.show()

结果展示

在这里插入图片描述

自适应中值滤波器 (Adaptive Median Filter)上面提到常规的中值滤波器,在噪声的密度不是很大的情况下(根据经验,噪声的出现的概率小于0.2),效果不错。但是当概率出现的概率较高时,常规的中值滤波的效果就不是很好了。有一个选择就是增大滤波器的窗口大小,这虽然在一定程度上能解决上述的问题,但是会给图像造成较大的模糊。

常规的中值滤波器的窗口尺寸是固定大小不变的,就不能同时兼顾去噪和保护图像的细节。这时就要寻求一种改变,根据预先设定好的条件,在滤波的过程中,动态的改变滤波器的窗口尺寸大小,这就是自适应中值滤波器 Adaptive Median Filter。在滤波的过程中,自适应中值滤波器会根据预先设定好的条件,改变滤波窗口的尺寸大小,同时还会根据一定的条件判断当前像素是不是噪声,如果是则用邻域中值替换掉当前像素;不是,则不作改变。
常规的中值滤波器的窗口尺寸是固定大小不变的,就不能同时兼顾去噪和保护图像的细节。这时就要寻求一种改变,根据预先设定好的条件,在滤波的过程中,动态的改变滤波器的窗口尺寸大小,这就是自适应中值滤波器 Adaptive Median Filter。在滤波的过程中,自适应中值滤波器会根据预先设定好的条件,改变滤波窗口的尺寸大小,同时还会根据一定的条件判断当前像素是不是噪声,如果是则用邻域中值替换掉当前像素;不是,则不作改变。

自适应中值滤波器有三个目的

滤除椒盐噪声
平滑其他非脉冲噪声
尽可能的保护图像中细节信息,避免图像边缘的细化或者粗化
噪声出现的概率较低,自适应中值滤波器可以较快的得出结果,不需要去增加窗口的尺寸;反之,噪声的出现的概率较高,则需要增大滤波器的窗口尺寸,这也符合种中值滤波器的特点:噪声点比较多时,需要更大的滤波器窗口尺寸。
中值滤波器能够很好的滤除“椒盐”噪声。椒盐噪声是在图像上随机出现的孤立点,根据中值滤波器的原理,使用邻域像素的中值代替原像素,能够有效的消除这些孤立的噪声点。

和均值滤波器的区别

和均值滤波器相比,中值滤波在消除噪声的同时,还能在很大程度保护图像的细节,不会造成很大的模糊。
和常规的中值滤波器相比,自适应中值滤波器能够更好的保护图像中的边缘细节部分。

  • 23
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
自适应中值滤波是一种能够有效处理图像中不同大小的噪声的滤波器。下面是使用Python实现对彩色图像使用自适应中值滤波的示例代码: ```python import cv2 import numpy as np def adaptive_median_filter(img, max_size): """ 自适应中值滤波 :param img: 原始图像 :param max_size: 最大滤波器尺寸 :return: 滤波结果 """ h, w, c = img.shape result = np.zeros((h, w, c), dtype=np.uint8) for i in range(h): for j in range(w): for k in range(c): size = 3 while size <= max_size: x1 = max(i - size // 2, 0) y1 = max(j - size // 2, 0) x2 = min(i + size // 2, h - 1) y2 = min(j + size // 2, w - 1) window = img[x1:x2 + 1, y1:y2 + 1, k] median = np.median(window) zmin = np.min(window) zmax = np.max(window) a1 = median - zmin a2 = median - zmax if a1 > 0 and a2 < 0: b1 = img[i, j, k] - zmin b2 = img[i, j, k] - zmax if b1 > 0 and b2 < 0: result[i, j, k] = img[i, j, k] else: result[i, j, k] = median break else: size += 2 if size > max_size: result[i, j, k] = median return result # 加载彩色图像 img = cv2.imread('color_image.jpg') # 对图像进行自适应中值滤波 result = adaptive_median_filter(img, 7) # 显示结果 cv2.imshow('Original', img) cv2.imshow('Result', result) cv2.waitKey(0) cv2.destroyAllWindows() ``` 其中,`adaptive_median_filter`函数实现自适应中值滤波。它使用一个滑动窗口来计算局部区域的中值,并根据中值与局部最小值和最大值的关系来判断是否需要对当前像素进行滤波。`max_size`参数指定了滤波器的最大尺寸。在函数中,我们使用了`numpy`库中的一些函数,如`np.median`、`np.min`和`np.max`等。 在主程序中,我们加载了一张彩色图像,并对其进行自适应中值滤波。最后,我们显示了原始图像和滤波结果。你可以替换`color_image.jpg`为你自己的彩色图像,并调整`max_size`参数来比较不同滤波器尺寸下的效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值