修正的阿尔法均值滤波器的python代码实现----冈萨雷斯数字图像处理

修正的阿尔法均值滤波器原理:

阿尔法均值滤波器是一种用于信号处理和图像处理中的滤波技术,它可以有效地减少噪声的影响并保留图像或信号的细节。修正的阿尔法均值滤波器是对传统的阿尔法均值滤波器进行了改进和优化,以更好地处理不同类型的噪声。

传统的阿尔法均值滤波器基于以下原理:
首先,选择一个窗口大小,通常是一个正方形或矩形的区域,在图像或信号上移动这个窗口。
将窗口内的像素或信号值按大小进行排序。
排序后,去掉一定比例的最高值和最低值,剩余值的平均数就是该窗口的新值。
将新值赋予中心像素或信号点。

修正的阿尔法均值滤波器改进了这个过程,它引入了修正参数,这个参数用于动态调整去除的最高值和最低值的数量,以更好地适应不同类型和强度的噪声。修正参数越高,滤波器对噪声的抑制效果越好,但可能会损失图像或信号的细节。
这种滤波器的优势在于它能够在去除噪声的同时,保持图像或信号的边缘和细微特征,相比于一些传统的平均值滤波器,它可以更好地保留图像细节。
需要注意的是,阿尔法均值滤波器的性能取决于所选取的窗口大小、修正参数以及对特定类型噪声的适应性。因此,在实际应用中,需要根据具体情况进行调整和优化,以获得最佳的滤波效果。

在这里插入图片描述
在这里插入图片描述
公式描述了修正的阿尔法均值滤波器的计算过程,根据给定的窗口大小和修正参数,该滤波器通过去除窗口内的极值并计算剩余值的平均数来产生输出信号或图像。这样可以有效地减少噪声的影响,并保留图像或信号的细节。

编写代码,输出如下图所示的结果:
在这里插入图片描述

提示:

结果图依次为:添加均值为0,方差为800的均匀噪声后的图像,在均匀噪声的基础上进一步添加胡椒和盐粒概率均为0.1的椒盐噪声后的图像,用5×5的算术均值滤波器对双重噪声污染后的图像滤波的结果,用5×5的几何均值滤波器滤波的结果,用5×5的中值滤波器滤波的结果,用5×5,d=20的修正的阿尔法均值滤波器滤波的结果。由于椒盐噪声的存在,算术均值滤波器和几何均值滤波器(尤其是后者)没有起到良好的作用。中值滤波器和修正的阿尔法均值滤波器则好得多,在降噪方面后者更好一些(细节更平滑一些)。注意,添加均匀噪声可以用语句noise = np.random.uniform(-50, 50, img.shape)实现,需要将叠加噪声后的结果图像值域归一化到[0,255]范围内。

python 代码实现

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

img = cv2.imread('Fig0507.tif',0)
img_uniform = skimage.util.random_noise(img, mode='speckle',mean=0,var=800)
img_uniform_ps = skimage.util.random_noise(img, mode='s&p')

def arithmentic_mean(image, kernel):
    img_h = image.shape[0]
    img_w = image.shape[1]

    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_mean = image.copy()
    for i in range(padding_h, img_h + padding_h):
        for j in range(padding_w, img_w + padding_w):
            temp = np.sum(image_pad[i - padding_h:i + padding_h + 1, j - padding_w:j + padding_w + 1])
            image_mean[i - padding_h][j - padding_w] = 1 / (m * n) * temp
    return image_mean

def geometric_mean(image, kernel):
    img_h = image.shape[0]
    img_w = image.shape[1]

    m, n = kernel.shape[:2]
    order = 1 / (kernel.size)

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

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

    image_mean = image.copy()
    # 这里要指定数据类型,但指定是uint64或者float64,但结果不正确,反而乘以1.0,也是float64,但却让结果正确
    for i in range(padding_h, img_h + padding_h):
        for j in range(padding_w, img_w + padding_w):
            prod = np.prod(image_pad[i - padding_h:i + padding_h + 1, j - padding_w:j + padding_w + 1] * 1.0)
            image_mean[i - padding_h][j - padding_w] = np.power(prod, order)

    return image_mean

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 modified_alpha_mean(image, kernel, d=0):

    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")

    img_result = np.zeros(image.shape)
    for i in range(height):
        for j in range(width):
            temp = np.sum(image_pad[i:i + m, j:j + n] * 1)
            img_result[i, j] = temp / (m * n - d)
    return img_result

kernel = np.ones([5, 5])
img_ari = arithmentic_mean(img_uniform_ps, kernel=kernel)
img_geo = geometric_mean(img_uniform_ps, kernel=kernel)
img_median = median_filter(img_uniform_ps, kernel=kernel)
img_modified_alpha = modified_alpha_mean(img_uniform_ps, kernel=kernel, d=20)

plt.figure(figsize=(8,5))
plt.subplot(2,3,1), plt.imshow(img, cmap='gray'), plt.title('uniform'), plt.xticks([]),plt.yticks([])
plt.subplot(2,3,2), plt.imshow(img_uniform_ps, cmap='gray'), plt.title('uniform + p&s'), plt.xticks([]),plt.yticks([])
plt.subplot(2,3,3), plt.imshow(img_ari, cmap='gray'), plt.title('arithmetic'), plt.xticks([]),plt.yticks([])
plt.subplot(2,3,4), plt.imshow(img_geo, cmap='gray'), plt.title('geometric'), plt.xticks([]),plt.yticks([])
plt.subplot(2,3,5), plt.imshow(img_median, cmap='gray'), plt.title('median'), plt.xticks([]),plt.yticks([])
plt.subplot(2,3,6), plt.imshow(img_modified_alpha, cmap='gray'), plt.title('alphatrimmed'), plt.xticks([]),plt.yticks([])
plt.show()

结果实现

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

修正后的阿尔法均值滤波器:用于处理被椒盐噪声污染的图像

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值