【数字图像处理】空间滤波

1. 概述

图像空间滤波是一种常用的图像处理技术,用于改变图像的亮度、对比度、锐度、噪声等特性。它是一种直接在图像空间进行像素操作的处理方法,与频域滤波不同,频域滤波是通过对图像进行傅里叶变换,然后在频域进行滤波处理。本文仅对常用的低通和高通空间滤波进行概括和总结。

2 低通(平滑)滤波

2.1 均值滤波

假设均值滤波器的大小为 n × n n\times n n×n,则该卷积核可以表示为如下的 n × n n\times n n×n 矩阵:
1 n 2 ( 1 1 ⋯ 1 1 1 ⋯ 1 ⋮ ⋮ ⋱ ⋮ 1 1 ⋯ 1 ) \frac{1}{n^2} \begin{pmatrix} 1 & 1 & \cdots & 1 \\ 1 & 1 & \cdots & 1 \\ \vdots & \vdots & \ddots & \vdots \\ 1 & 1 & \cdots & 1 \\ \end{pmatrix} n21 111111111
其中,矩阵中的每个元素都是 1 / n 2 1/n^2 1/n2,表示该像素点的权重值等于周围所有像素点的权重之和的平均值。这样,在卷积操作时,该卷积核将对图像中的每个像素点取周围像素点的平均值,从而实现平滑处理。

需要注意的是,均值滤波器的大小 n n n 越大,滤波器的平滑程度越强,但也可能会导致图像细节的丢失。因此,在实际应用中需要根据具体的需求和图像特点选择合适的滤波器大小。

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

# 读取彩色图像
img = cv2.imread('example.jpg')

# 添加高斯噪声
mean = 0
var = 0.5
sigma = var ** 0.5
gaussian = np.random.normal(mean, sigma, img.shape)
noisy_img = np.clip((img/255.0 + gaussian)*255, 0, 255).astype(np.uint8)

# 使用不同大小的卷积核进行均值滤波
k_sizes = [3, 13, 23, 33]  # 卷积核大小
fig, axs = plt.subplots(1, 6, figsize=(12, 3))
axs[0].imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
axs[0].set_title("Original")
axs[1].imshow(cv2.cvtColor(noisy_img, cv2.COLOR_BGR2RGB))
axs[1].set_title("Noisy")

for i, ksize in enumerate(k_sizes):
    # 使用均值滤波器进行处理
    denoised_img = cv2.blur(noisy_img, (ksize, ksize))

    # 显示处理后的图像
    axs[i+2].imshow(cv2.cvtColor(denoised_img, cv2.COLOR_BGR2RGB))
    axs[i+2].set_title(f"Denoised (ksize={
      
      ksize})")

plt.tight_layout()
plt.show()

在这里插入图片描述
从实验结果可以看出,均值滤波器的卷积核尺寸越大,去噪强度越高,但同时图像也越模糊。

2.2 中值滤波

中值滤波的原理是将像素点周围的邻域中的像素灰度值排序,然后取中间值作为该像素的灰度值。由于中值滤波是一种非线性滤波方法,其不受噪声分布的影响,可以有效地去除图像中的椒盐噪声和斑点噪声,并且可以保留图像的边缘信息和细节信息。

中值滤波的具体操作步骤如下:

  1. 选定滤波器的大小,通常取一个奇数的正整数,如 3 × 3 3 \times 3 3×3 5 × 5 5 \times 5 5×5 等。
  2. 针对每个像素点,将其周围的邻域像素点的灰度值排序,从小到大排列。
  3. 取排序后的中间值作为该像素点的新灰度值。
  4. 对于边缘上的像素,可以选择对其不做处理或者根据需要进行特殊处理。
import numpy as np
import matplotlib.pyplot as plt
import cv2
import random

# 添加椒盐噪声
def pepper_and_salt(img, percentage):
    num = int(percentage * img.shape[0] * img.shape[1])  # 椒盐噪声点数量
    img2 = img.copy()
    for _ in range(num):
        X = random.randint(0, img2.shape[0] - 1)
        Y = random.randint(0, img2.shape[1] - 1)
        if random.randint(0, 1) == 0:  # 黑白色概率55开
            img2[X, Y] = (255, 255, 255)
        else:
            img2[X, Y] = (0, 0, 0)
    return img2

# 读取彩色图像
img = cv2.imread('example.jpg')
noisy_img = pepper_and_salt(img, 1.0)

blur_mean = cv2.blur(noisy_img, ksize=(5, 5))
blur_median = cv2.medianBlur(noisy_img, ksize=5)

# 显示原始图像、噪声图像和滤波后的图像
fig, axs = plt.subplots(1, 4)
axs[0].imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
axs[0].set_title('Original')
axs[1].imshow(cv2.cvtColor(noisy_img, cv2.COLOR_BGR2RGB))
axs[1].set_title('Noisy')
axs[2].imshow(cv2.cvtColor(blur_mean, cv2.COLOR_BGR2RGB))
axs[2].set_title('Mean Filtered')
axs[3].imshow(cv2.cvtColor(blur_median, cv2.COLOR_BGR2RGB))
axs[3].set_title('Median Filtered')
plt.show()

在这里插入图片描述
从实验结果可以看出,相比均值滤波,中值滤波能够更有效地去除椒盐噪声。

2.3 高斯低通滤波

通常我们使用的高斯模糊指的是高斯低通滤波,高斯滤波是一种线性平滑滤波方法,常用于图像降噪、模糊和平滑处理。高斯滤波的核心思想是对图像进行加权平均,其中每个像素的权重由高斯分布函数确定。由于高斯分布函数具有平滑性,因此高斯滤波可以在保持图像边缘信息的同时,减小图像的噪声和细节。

高斯滤波的具体操作步骤如下:

扫描二维码关注公众号,回复: 15249297 查看本文章
  1. 选定高斯核大小,通常取一个奇数的正整数,如 3 × 3 3 \times 3 3×3 5 × 5 5 \times 5 5×5 等,并计算出高斯分布函数。
  2. 对于每个像素点,在其周围的邻域内应用高斯核,并将每个像素点的值与其邻域内像素点的加权平均值进行替换。
  3. 对于边缘上的像素,可以选择对其不做处理或者根据需要进行特殊处理。

高斯滤波的公式可以表示为:
I ′ ( x , y ) = 1 2 π σ 2 ∑ i = − ⌊ k / 2 ⌋ ⌊ k / 2 ⌋ ∑ j = − ⌊ k / 2 ⌋ ⌊ k / 2 ⌋ I ( x + i , y + j ) ⋅ exp ⁡ ( − i 2 + j 2 2 σ 2 ) I'(x,y) = \frac{1}{2\pi\sigma^2}\sum_{i=-\lfloor k/2 \rfloor}^{\lfloor k/2 \rfloor}\sum_{j=-\lfloor k/2 \rfloor}^{\lfloor k/2 \rfloor}I(x+i,y+j) \cdot \exp\left(-\frac{i^2+j^2}{2\sigma^2}\right) I(x,y)=2πσ21i=k/2k/2j=k/2k/2I(x+i,y+j)exp(2σ2i2+j2)其中, I ( x , y ) I(x,y) I(x,y) 表示原始图像中坐标为 ( x , y ) (x,y) (x,y) 的像素点的灰度值, I ′ ( x , y ) I'(x,y) I(x,y) 表示滤波后图像中坐标为 ( x , y ) (x,y) (x,y) 的像素点的灰度值, k k k 表示高斯核的大小, σ \sigma σ 表示高斯核的标准差。

2.4 双边滤波

双边滤波的基本原理是将每个像素周围的像素按照它们的像素值和像素间距离进行加权平均。这里的像素间距离是指像素之间的欧几里得距离或者曼哈顿距离等。在加权平均的过程中,距离较近且像素值相似的像素将被赋予更大的权重,距离远或像素值不相似的像素将被赋予较小的权重。
I filtered ( x , y ) = 1 W p ∑ i = − k k ∑ j = − k k w i j ( x , y ) f ( i + x , j + y ) w i j ( x , y ) = ω i j ( x , y ) ⋅ ϕ i j ( x , y ) ω i j ( x , y ) = exp ( − ( i 2 + j 2 ) 2 σ d 2 ) ϕ i j ( x , y ) = exp ( − ( f ( i + x , j + y ) − f ( x , y ) ) 2 2 σ r 2 ) W p = ∑ i = − k k ∑ j = − k k ω i j ( x , y ) ⋅ ϕ i j ( x , y ) \begin{aligned} I_{\text{filtered}}(x,y) = \frac{1}{W_p}\sum_{i=-k}^{k}\sum_{j=-k}^{k}w_{ij}(x,y)f(i+x,j+y)\\ w_{ij}(x,y) = \omega_{ij}(x,y)\cdot\phi_{ij}(x,y) \\ \omega_{ij}(x,y) = \text{exp}\left(\frac{-(i^2+j^2)}{2\sigma_d^2}\right) \\ \phi_{ij}(x,y) = \text{exp}\left(\frac{-(f(i+x,j+y)-f(x,y))^2}{2\sigma_r^2}\right) \\ W_p = \sum_{i=-k}^{k}\sum_{j=-k}^{k}\omega_{ij}(x,y)\cdot\phi_{ij}(x,y) \end{aligned} Ifiltered(x,y)=Wp1i=kkj=kkwij(x,y)f(i+x,j+y)wij(x,y)=ωij(x,y)ϕij(x,y)ωij(x,y)=exp(2σd2(i2+j2))ϕij(x,y)=exp(2σr2(f(i+x,j+y)f(x,y))2)Wp=i=kkj=kkωij(x,y)ϕij(x,y)
其中, I filtered ( x , y ) I_{\text{filtered}}(x,y) Ifiltered(x,y)是双边滤波后的像素值, f ( i + x , j + y ) f(i+x,j+y) f(i+x,j+y)是在位置 ( i + x , j + y ) (i+x,j+y) (i+x,j+y)处的原始像素值, w i j ( x , y ) w_{ij}(x,y) wij(x,y)是像素 ( i + x , j + y ) (i+x,j+y) (i+x,j+y)对像素 ( x , y ) (x,y) (x,y)的权重, ω i j ( x , y ) \omega_{ij}(x,y) ωij(x,y)是距离权重, ϕ i j ( x , y ) \phi_{ij}(x,y) ϕij(x,y)是像素值相似性权重, W p W_p Wp是归一化因子, k k k是滤波器的半径, σ d \sigma_d σd σ r \sigma_r σr分别是距离和像素值相似性的标准差。

距离权重 ω i j ( x , y ) \omega_{ij}(x,y) ωij(x,y)用于衡量像素 ( i + x , j + y ) (i+x,j+y) (i+x,j+y)与像素 ( x , y ) (x,y) (x,y)之间的距离,距离越近,权重越大。像素值相似性权重 ϕ i j ( x , y ) \phi_{ij}(x,y) ϕij(x,y)用于衡量像素 ( i + x , j + y ) (i+x,j+y) (i+x,j+y)和像素 ( x , y ) (x,y) (x,y)之间的像素值相似性,像素值越相似,权重越大。最后,归一化因子 W p W_p Wp用于将所有像素的权重加起来归一化到 [ 0 , 1 ] [0,1] [0,1]的范围内,确保滤波后的像素值仍然在原始像素值的范围内。

2.5 导向滤波

导向滤波(guided filter)是一种非线性滤波方法,旨在平滑图像并保留其细节。导向滤波是双边滤波的一种扩展,它使用一张辅助图像作为滤波器的导向信息,这张图像应当与待处理的原始图像在一定程度上相关。导向滤波器的输出是输入图像的加权平均值,其中权重由导向图像和滤波器参数决定。

以下是导向滤波的数学公式:

I I I 是待处理的原始图像, p p p 是该图像中的像素点, I p I_p Ip 表示该像素的亮度值。设 p ′ p' p 是导向图像中的像素点, P p ′ P_{p'} Pp 表示该像素的亮度值。那么在导向滤波中,滤波器的输出 q p q_p qp 可以表示为:
q p = 1 ω p ∑ p ′ ∈ N p f ( I p ′ , P p ′ ) I p ′ q_p=\frac{1}{\omega_p}\sum_{p'\in\mathcal{N}_p}f(I_{p'}, P_{p'})I_{p'} qp=ωp1pNpf(Ip,Pp)Ip其中, N p \mathcal{N}_p Np 表示像素点 p p p 周围的邻域, ω p \omega_p ωp 是归一化的权重系数,可以表示为:
ω p = ∑ p ′ ∈ N p f ( I p ′ , P p ′ ) \omega_p=\sum_{p'\in\mathcal{N}_p}f(I_{p'}, P_{p'}) ωp=pNpf(Ip,Pp)函数 f f f 可以使用以下的高斯函数:
f ( I p ′ , P p ′ ) = 1 2 π σ s exp ( − ∥ p − p ′ ∥ 2 2 σ s 2 ) ⋅ 1 2 π σ r exp ( − ∥ I p − I p ′ ∥ 2 2 σ r 2 ) f(I_{p'}, P_{p'})=\frac{1}{\sqrt{2\pi}\sigma_s}\text{exp}\left(-\frac{\lVert p-p'\rVert^2}{2\sigma_s^2}\right)\cdot\frac{1}{\sqrt{2\pi}\sigma_r}\text{exp}\left(-\frac{\lVert I_p-I_{p'}\rVert^2}{2\sigma_r^2}\right) f(Ip,Pp)=2π σs1exp(2σs2pp2)2π σr1exp(2σr2IpIp2)其中, N p \mathcal{N}_p Np 表示像素点 p p p 周围的邻域, σ s \sigma_s σs σ r \sigma_r σr 是两个参数,分别控制空间距离和亮度差异对滤波结果的影响。

可以看出,导向滤波的核心思想是使用辅助图像来调整卷积核的权重,从而在滤波过程中保留图像的结构信息和纹理信息,同时抑制噪声。

辅助图像通常可以是:原始图像、模糊图像、边缘图像、梯度图像或者是以上图像的自适应组合。

3 高通(锐化)滤波

3.1 Laplacian滤波器

拉普拉斯滤波器是一种常用的图像处理滤波器,它可以增强图像中的边缘特征,同时抑制图像中的高频噪声。其数学原理基于拉普拉斯算子,其作用类似于对图像进行二阶微分,从而提取出图像中的高频信息。

具体来说,拉普拉斯滤波器对于图像中的每个像素,会将其周围像素与自身像素的加权和减去自身像素的权重,从而得到该像素的滤波结果。这个权重矩阵通常是一个3x3或5x5的矩阵,例如:
[ 0 1 0 1 − 4 1 0 1 0 ] \begin{bmatrix}0 & 1 & 0 \\ 1 & -4 & 1\\ 0 & 1 & 0\end{bmatrix} 010141010 这是一个3x3的拉普拉斯核,其中中心像素的权重是-4,周围像素的权重为1。这个核可以用于对图像进行边缘检测,因为它会强调图像中的高频分量,即图像中的边缘。

另外,拉普拉斯滤波器还可以通过对原始图像和滤波后的图像求差来实现图像锐化。这是因为拉普拉斯滤波器可以增强图像中的高频分量,从而使图像的细节更加明显。

3.3 Sobel滤波器

Sobel滤波器采用两个3×3的卷积核,一个用于检测水平边缘,另一个用于检测垂直边缘。

卷积核如下所示:
G x = [ − 1 0 1 − 2 0 2 − 1 0 1 ] ,   G y = [ − 1 − 2 − 1 0 0 0 1 2 1 ] G_{x} = \begin{bmatrix} -1 & 0 & 1 \\ -2 & 0 & 2 \\ -1 & 0 & 1 \end{bmatrix},\ G_{y} = \begin{bmatrix} -1 & -2 & -1 \\ 0 & 0 & 0 \\ 1 & 2 & 1 \end{bmatrix} Gx= 121000121 , Gy= 101202101

其中,Gx卷积核用于检测水平边缘,Gy卷积核用于检测垂直边缘。卷积核中的数字表示像素的权重,该权重决定了卷积核与图像的卷积结果。

Sobel算子算法的优点是计算简单,速度快。但是由于只采用了两个方向的模板,只能检测水平和垂直方向的边缘,因此这种算法对于纹理较为复杂的图像,其边缘检测效果就不是很理想。

猜你喜欢

转载自blog.csdn.net/zxdd2018/article/details/130140299