【论文复现】均值滤波改进:Adaptive Weighted Mean Filter(AWMF)

Adaptive Weighted Mean Filter (AWMF)

在这里插入图片描述

y i , j = { s m i n ,  with probability  p 椒 噪 声 s max ⁡ ,  with probability  q 盐 噪 声 x i , j ,  with probability  1 − p − q y_{i, j}=\left\{\begin{array}{rll}s_{m i n}, & \text { with probability } & p 椒噪声\\s_{\max }, & \text { with probability } & q 盐噪声\\x_{i, j}, & \text { with probability } & 1-p-q\end{array}\right. yi,j=smin,smax,xi,j, with probability  with probability  with probability pq1pq
滤波器 S i j ( w ) S_{ij}(w) Sij(w):表示以 i , j i,j i,j为中心的的 ( 2 w + 1 ) × ( 2 w + 1 ) (2w+1)\times (2w+1) (2w+1)×(2w+1)的模板。我们使用 S i , j m i n S^{min}_{i,j} Si,jmin S i , j m e d S^{med}_{i,j} Si,jmed S i , j m a x S^{max}_{i,j} Si,jmax表示模板内的最小值,中值以及最大值。

AMF算法:
对于噪声图像 y y y和重建图像 z z z的每个像素:
(1)初始化 w = 1 , h = 1 , w m a x = 39 w=1,h=1,w_{max}=39 w=1,h=1,wmax=39
(2)计算 S i , j min ⁡ ( w ) , S i , j m e d ( w ) S_{i, j}^{\min }(w), S_{i, j}^{m e d}(w) Si,jmin(w),Si,jmed(w) S i , j max ⁡ ( w ) S_{i, j}^{\max }(w) Si,jmax(w)
(3)如果 S i , j min ⁡ ( w ) < S i , j m e d ( w ) < S i , j max ⁡ ( w ) S_{i, j}^{\min }(w)\lt S_{i, j}^{m e d}(w)\lt S_{i, j}^{\max }(w) Si,jmin(w)<Si,jmed(w)<Si,jmax(w),跳到步骤(5)
(4)如果 w < w m a x w\lt w_{max} w<wmax,跳到步骤(2),否则 z i , j = S i j m e d 并 停 止 z_{i,j}=S^{med}_{ij}并停止 zi,j=Sijmed
(5)如果 S i , j m i n ( w ) < y i , j < S i , j m a x S^{min}_{i,j}(w)\lt y_{i,j}\lt S^{max}_{i,j} Si,jmin(w)<yi,j<Si,jmax,即 ( i , j ) (i,j) (i,j)为非噪声点,则令 z i , j = y i , j z_{i,j}=y_{i,j} zi,j=yi,j;否则令 z i , j = S i , j m e d ( w ) z_{i,j}=S^{med}_{i,j}(w) zi,j=Si,jmed(w)并停止

AWMF:
对于噪声图像 y y y和重建图像 z z z的每个像素:
(1)初始化 w = 1 , h = 1 , w m a x = 39 w=1,h=1,w_{max}=39 w=1,h=1,wmax=39
(2)计算 S i , j min ⁡ ( w ) , S i , j m e a n ( w ) S_{i, j}^{\min }(w), S_{i, j}^{m e an}(w) Si,jmin(w),Si,jmean(w), S i , j max ⁡ ( w ) , S i , j m i n ( w + h ) , S i , j m a x ( w + h ) S_{i, j}^{\max }(w),S_{i, j}^{min}(w+h),S_{i, j}^{max}(w+h) Si,jmax(w)Si,jmin(w+h)Si,jmax(w+h)
(3)如果 S i , j m i n ( w ) = S i , j m i n ( w + h ) , S i , j m a x ( w ) = S i , j m a x ( w + h ) S_{i, j}^{m i n}(w)=S_{i, j}^{m i n}(w+h), S_{i, j}^{m a x}(w)=S_{i, j}^{m a x}(w+h) Si,jmin(w)=Si,jmin(w+h),Si,jmax(w)=Si,jmax(w+h) S i , j m e a n ( w ) ≠ − 1 S_{i, j}^{m e an}(w)\not = -1 Si,jmean(w)=1,跳到步骤(5)否则 w = w + h w=w+h w=w+h
(4)如果 w ≤ w m a x w\le w_{max} wwmax,跳到步骤(2),否则 z i , j = S i j m e a n 并 停 止 z_{i,j}=S^{mean}_{ij}并停止 zi,j=Sijmean
(5)如果 S i , j m i n ( w ) < y i , j < S i , j m a x S^{min}_{i,j}(w)\lt y_{i,j}\lt S^{max}_{i,j} Si,jmin(w)<yi,j<Si,jmax,即 ( i , j ) (i,j) (i,j)为非噪声点,则令 z i , j = y i , j z_{i,j}=y_{i,j} zi,j=yi,j;否则令 z i , j = S i , j m e a n ( w ) z_{i,j}=S^{mean}_{i,j}(w) zi,j=Si,jmean(w)并停止

其中:
在这里插入图片描述
权重 a k , l a_{k,l} ak,l设置为:
a k , l = { 1 , S i , j m i n ( w ) < y k , l < S i , j m a x ( w ) 0.  otherwise  a_{k, l}=\left\{\begin{array}{cc}1, & S_{i, j}^{m i n}(w)\lt y_{k, l}\lt S_{i, j}^{m a x}(w) \\0 . & \text { otherwise }\end{array}\right. ak,l={1,0.Si,jmin(w)<yk,l<Si,jmax(w) otherwise 
让我们来解释一下AWMF的细节。

我们首先通过连续扩大窗口尺寸直到两个连续窗口内的最大值和最小值分别相等。如果第一个窗口中心的像素值等于最大值或最小值,则认为它是噪声点,否则为非像素点。通过这种方式可以很大程度减少检测错误,特别是图像信噪比很低的时候。

在这里插入图片描述
如图1所示,对于像素值为66的非噪声点。AWMF将检测为非噪声点,输出66;而AMF将检测为噪声点,输出78。.

采用非噪声点的均值替代噪声点而不是普通中值滤波的原因:
(1)排除了噪声点的影响。

(2)经过实验,前者比后者更好。

# -*- coding:utf-8 -*-
'''
@paper:A New Adaptive Weighted Mean Filter for Removing Salt-and-Pepper Noise
'''
import numpy as np

# Adaptive Weighted Mean Filter
class Awmf(object):
    def __init__(self, h, w_max):
        self.h = h
        self.w_max = w_max

    def t_zero_pad_matrix(self, A, t):
        '''在图像四周填充t层0'''
        m, n = np.shape(A)
        img_pad = np.zeros((m + t, n + t))
        img_pad[t:, t:] = A
        return img_pad

    def k_approximate_matrix(self, img_pad, i, j, k, t):
        k_approximate_mat = img_pad[(i + t - k):(i + t + k + 1), (j + t - k):(j + t + k + 1)]
        return k_approximate_mat

    def row_matrix(self, img_k_approximate):
        H = img_k_approximate.flatten()
        H = np.sort(H)
        return H

    def amf(self, img):
        '''Adaptive Mean Filter'''
        m, n = np.shape(img)
        z = img.copy()
        img_pad = self.t_zero_pad_matrix(img, self.w_max)
        for i in range(m):
            for j in range(n):
                w = 1
                while w <= self.w_max:
                    k_approximate_mat = self.k_approximate_matrix(img_pad, i, j, k=w, t=self.w_max)
                    median_value = np.median(k_approximate_mat)
                    max_value = np.max(k_approximate_mat)
                    min_value = np.min(k_approximate_mat)
                    if min_value < median_value < max_value:
                        if min_value < img[i, j] < max_value:
                            z[i, j] = img[i, j]
                            break
                        else:
                            z[i, j] = median_value
                            break
                    else:
                        w = w + self.h
                        if w > self.w_max:
                            z[i, j] = median_value
        return z

    def mean_awmf(self, Y, max_value, min_value):
        m, n = np.shape(Y)
        A = np.zeros(np.shape(Y))
        for k in range(m):
            for l in range(n):
                if min_value < Y[k, l] < max_value:
                    A[k, l] = 1
        if np.sum(A) != 0:
            mean_value = np.sum(A * Y) / np.sum(A)
        else:
            mean_value = -1
        return mean_value

    def process_image(self, img):
        m, n = np.shape(img)
        z = img.copy()
        img_pad = self.t_zero_pad_matrix(img, self.w_max)
        for i in range(m):
            for j in range(n):
                w = 1
                while w <= self.w_max:
                    k_approximate_mat1 = self.k_approximate_matrix(img_pad, i, j, k=w, t=self.w_max)
                    k_approximate_mat2 = self.k_approximate_matrix(img_pad, i, j, k=w + self.h, t=self.w_max)
                    max_value1 = np.max(k_approximate_mat1)
                    min_value1 = np.min(k_approximate_mat1)
                    mean_value1 = self.mean_awmf(k_approximate_mat1, max_value1, min_value1)
                    max_value2 = np.max(k_approximate_mat2)
                    min_value2 = np.min(k_approximate_mat2)
                    if min_value1 == min_value2 and max_value1 == max_value2 and mean_value1 != -1:
                        if min_value1 < img[i, j] < max_value1:
                            z[i, j] = img[i, j]
                            break
                        else:
                            z[i, j] = mean_value1
                            break
                    else:
                        w = w + self.h
                        if w > self.w_max:
                            z[i, j] = mean_value1
        return z


Noise levelNoise imageAWMF
90%在这里插入图片描述在这里插入图片描述
95%在这里插入图片描述在这里插入图片描述
99%在这里插入图片描述在这里插入图片描述
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二进制人工智能

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值