空间滤波

空间滤波基础

空间域滤波利用像素邻域的灰度关系进行计算

邻域:以图像某像素为中心的m×n个像素称为它的邻域,m,n为奇数

邻域操作的工具:模板(mask)

输出图像 ( x , y ) (x, y) (x,y)像素点的灰度等于邻域中各像素的灰度加权求和;模板中的值是系数值,而不是灰度值。

在待处理图像中逐点移动掩模,每点响应等于模板系数与模板对应像素灰度值的乘积之和:
g ( x , y ) = R = k 0 s 0 + k 1 s 1 + ⋅ ⋅ ⋅ + k 8 s 8 g(x,y) = R = k_0s_0 + k_1s_1+···+k_8s_8 g(x,y)=R=k0s0+k1s1++k8s8

在这里插入图片描述

平滑空间滤波器

图像平滑作用

  • 消除或减少噪声,改善图像质量
    • 典型的随机噪声由灰度级的急剧变化组成
    • 平滑处理降低了图像 “尖锐”变化,达到降噪的目的
  • 用于预处理
    • 例如:在提取大的目标值前去除图像中一些琐碎细节、桥接直线或曲线的缝隙
  • 模糊图像

平滑空间滤波器的分类

  • 平滑线性滤波器:加权均值滤波器
  • 统计排序滤波器(非线性滤波器):最大值滤波器,中值滤波器,最小值滤波器

平滑线性滤波器:均值滤波器

平均模板, 输出邻域内的简单平均值,也称均值滤波器。
一 般 : m × n 平 均 模 板 R = 1 m ⋅ n ∑ i = 1 m ⋅ n Z i 一般:m\times n平均模板\\ R = \frac{1}{m·n}\sum_{i=1}^{m·n}Z_i m×nR=mn1i=1mnZi
在这里插入图片描述

Code

import matplotlib.pyplot as plt
import numpy as np
import cv2 as cv

# 平滑线性滤波器:均值滤波器
def meanfilter(img,mask_shape):
    """
    :param img: 输入的灰度图
    :param mask_shape: 模板形状
    :return: 返回滤波后的图像
    """
    if mask_shape[0]!=mask_shape[1] or mask_shape[0]%2!=1 or mask_shape[1]%2!=1:
        print("The mask shape should be Singluar!")
        return np.array([]).reshape((0,0))
    mask = np.ones(mask_shape)/(mask_shape[0]*mask_shape[1])
    cp_img = np.copy(img)
    row,col = mask.shape
    # 边界补零处理
    r = (row-1)//2
    c = (col-1)//2
    rb = np.zeros((r,cp_img.shape[1]))
    temp = np.vstack([rb,cp_img,rb])
    cb = np.zeros((temp.shape[0],c))
    last = np.hstack([cb,temp,cb])

    mem = np.zeros(cp_img.shape)
    # 加权求和
    for i in range(r,last.shape[0]-r):
        for j in range(c,last.shape[1]-c):
            mem[i-r][j-c] = np.sum(mask*last[i-r:i+r+1,j-c:j+c+1])

    return mem

if __name__=="__main__":

    img = cv.imread("10.png")
    img = cv.cvtColor(img, cv.COLOR_RGB2GRAY)

    filter_img_1 = meanfilter(img, (3,3))
    filter_img_2 = meanfilter(img, (5,5))
    filter_img_3 = meanfilter(img, (7,7))
    filter_img_4 = meanfilter(img, (9,9))
    filter_img_5 = meanfilter(img, (15,15))
    filter_img = {'img': img, 'mask=3x3': filter_img_1, 'mask=5x5': filter_img_2, 'mask=7x7': filter_img_3,'mask=9x9': filter_img_4, 'mask=15x15': filter_img_5}
    
    i = 1
    for k,v in filter_img.items():
        plt.subplot(2, 3, i)
        plt.imshow(v,cmap="gray")
        plt.axis('off') # 去掉坐标轴
        plt.title("{}".format(k))
        i+=1
    plt.show()

在这里插入图片描述

平滑线性滤波器:加权均值滤波器

高斯平滑滤波器

平均模板对领域内的所有像素具有相同权重,容易造成图像迅速模糊。

改进:领域中心具有较大权重,边缘较小权重。

模板:二维高斯函数离散化。

Example
w = 1 16 × { 1 2 1 2 4 2 1 2 1 } w = \frac{1}{16}\times\left\{ \begin{matrix} 1 & 2 & 1 \\ 2 & 4 & 2 \\ 1 & 2 & 1 \\ \end{matrix} \right\} w=161×121242121

统计排序滤波器

虽然均值滤波器对噪声有抑制作用,但同时会使图像变得模糊。即使是加权均值滤波,改善的效果也是有限的。为了既消除噪声又保持细节(不模糊),必须改换滤波器的设计思路。

非线性滤波器:

响应基于邻域中像素的统计排序,由排序结果决定的值代替中心像素的值。又称统计排序滤波器。

最常见的是 中值滤波器。其次还有 最大值滤波器,最小值滤波器。

中值滤波器设计思想:

  • 如果一个像素是噪声,该像素比周围的像素亮(暗)许多
  • 如果在某个邻域中,对像素灰度由小到大排列,那么最亮的或者是最暗的点(噪声)一定被排在两侧
  • 取邻域中排在中间位置上的灰度值来替代待邻域中心像素的值,就可以达到滤除噪声的目的

在这里插入图片描述

  • 强迫突出的亮点(暗点)更象它周围的值,以消除孤立的亮点(暗点)
  • 在去除噪音的同时,可以比较好地保留边的锐度和图像的细节(优于均值滤波器)
  • 中值滤波器对处理脉冲噪声(椒盐噪声)非常有效

示例:

在这里插入图片描述

邻域平均与中值滤波的比较:

邻域平均滤波器在去掉孤立脉冲时模糊了图象,中值滤波器在去掉孤立脉冲时不影响图象

在这里插入图片描述

  • 中值滤波在抑制图象随机脉冲噪声方面甚为有效,易硬件实现。
  • 问题:排序费时
  • 中值滤波的两种快速算法:
    • 准中值:先找到列中值,再求各列中值之中值
    • 用稀疏窗口模板运算,速度较快

Code

import matplotlib.pyplot as plt
import numpy as np
import cv2 as cv

# 中值滤波
def medianfilter(img,m):
    """
    :param img: 输入灰度图像
    :param m: 进行中值滤波的领域窗口大小
    :return cp_last: 滤波后的图像
    """
    cp_img = np.copy(img)
    row, col = m,m
    # 边界补零处理
    r = (row - 1) // 2
    c = (col - 1) // 2
    rb = np.zeros((r, cp_img.shape[1]))
    temp = np.vstack([rb, cp_img, rb])
    cb = np.zeros((temp.shape[0], c))
    last = np.hstack([cb, temp, cb])
    cp_last = np.copy(last)
    for i in range(r, last.shape[0] - r):
        for j in range(c, last.shape[1] - c):
            cp_last[i][j] = np.median(last[i - r:i + r + 1, j - c:j + c + 1])

    return cp_last

if __name__=="__main__":
    img = cv.imread("11.png")
    img = cv.cvtColor(img, cv.COLOR_RGB2GRAY)
    
    mask_size = 3  # 表示领域窗口大小为 3x3

    median_filter_img = medianfilter(img=img,m=mask_size)
    mean_filter_img = meanfilter(img,(3,3))
    median = cv.medianBlur(img,3)

    plt.subplot(2, 2, 1)
    plt.imshow(img,cmap="gray")
    plt.axis('off')
    plt.title("original_img")

    plt.subplot(2, 2, 2)
    plt.imshow(mean_filter_img,cmap="gray")
    plt.axis('off')
    plt.title("mean_filter_img")

    plt.subplot(2, 2, 4)
    plt.imshow(median,cmap="gray")
    plt.axis('off')
    plt.title("cv_median")

    plt.subplot(2, 2, 3)
    plt.imshow(median_filter_img,cmap="gray")
    plt.axis('off')
    plt.title("median_filter_img")

    plt.show()

下面的两幅 original_img 分别是带椒盐噪声高斯噪声 的图片,经过 均值滤波器 和 中值滤波器过滤后,可以看出明显的对比效果。

平滑滤波适用于高斯噪声污染的噪声,中值滤波器适用于椒盐噪声污染的图像

在这里插入图片描述

在这里插入图片描述

椒盐噪声: 也称为脉冲噪声,是图像中经常见到的一种噪声,它是一种随机出现的白点或者黑点,可能是亮的区域有黑色像素或是在暗的区域有白色像素(或是两者皆有)。椒盐噪声的成因可能是影像讯号受到突如其来的强烈干扰而产生、类比数位转换器或位元传输错误等

高斯噪声是指它的概率密度函数服从高斯分布,即正态分布的一类噪声。常见的高斯噪声包括起伏噪声、宇宙噪声、热噪声和散粒噪声等等

统计滤波器:

  • 中值滤波器

    • 主要用途:去除噪声

    • 计算公式: R = m i d { z k ∣ k = 1 , 2 , … , 9 } R = mid \{z_k | k = 1,2,…,9\} R=mid{zkk=1,2,,9}

  • 最大值滤波器

    • 主要用途:寻找最亮点

    • 计算公式: R = m a x { z k ∣ k = 1 , 2 , … , 9 } R = max \{z_k | k = 1,2,…,9\} R=max{zkk=1,2,,9}

  • 最小值滤波器

    • 主要用途:寻找最暗点

    • 计算公式: R = m i n { z k ∣ k = 1 , 2 , … , 9 } R = min \{z_k | k = 1,2,…,9\} R=min{zkk=1,2,,9}


高斯噪声包括起伏噪声、宇宙噪声、热噪声和散粒噪声等等

统计滤波器:

  • 中值滤波器

    • 主要用途:去除噪声

    • 计算公式: R = m i d { z k ∣ k = 1 , 2 , … , 9 } R = mid \{z_k | k = 1,2,…,9\} R=mid{zkk=1,2,,9}

  • 最大值滤波器

    • 主要用途:寻找最亮点

    • 计算公式: R = m a x { z k ∣ k = 1 , 2 , … , 9 } R = max \{z_k | k = 1,2,…,9\} R=max{zkk=1,2,,9}

  • 最小值滤波器

    • 主要用途:寻找最暗点

    • 计算公式: R = m i n { z k ∣ k = 1 , 2 , … , 9 } R = min \{z_k | k = 1,2,…,9\} R=min{zkk=1,2,,9}


在这里插入图片描述

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值