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

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

在这里插入图片描述
从实验结果可以看出,相比均值

### 数字图像处理空间滤波的原理与实现 #### 空间滤波的概念 空间域图像处理主要包括灰度变换和空间滤波两种操作[^1]。其中,空间滤波通过利用像素及其邻近区域的信息来修改图像特性。它广泛应用于去噪、边缘检测和平滑等领域。 #### 空间滤波的工作机制 空间滤波的核心思想是对目标像素周围的局部区域应用一个特定的操作函数。具体而言,使用大小为 \( m \times n \) 的滤波器对一幅尺寸为 \( M \times N \) 的图像进行线性空间滤波时,滤波器响应 \( g(x, y) \) 可定义为滤波器系数与覆盖区域内相应像素值乘积的总和[^4]。这一过程可以描述如下: - 将滤波器放置于图像上的每一个像素位置; - 计算滤波器掩模内的权重与对应像素值的乘积并求和; - 把得到的结果赋予当前像素作为新的灰度值。 #### 类型及其实现方式 根据功能的不同,空间滤波可分为平滑(低通)滤波和锐化(高通)滤波两大类。 ##### 平滑滤波 平滑滤波主要用于减少图像中的高频成分,比如随机噪声或细节纹理。常见的有均值滤波器和高斯滤波器等。以下是采用Python实现的一个简单例子——均值滤波器的应用: ```python import numpy as np from scipy.ndimage import convolve def mean_filter(image, kernel_size=3): """ 应用均值滤波器到输入图像。 参数: image (numpy.ndarray): 输入二维灰度图像数组。 kernel_size (int): 滤波窗口大小,默认为3x3。 返回: filtered_image (numpy.ndarray): 经过均值滤波后的图像。 """ # 创建一个全一矩阵作为卷积核 kernel = np.ones((kernel_size, kernel_size)) / (kernel_size ** 2) # 使用convolve执行卷积操作 filtered_image = convolve(image, kernel, mode='constant', cval=0.0) return filtered_image ``` 上述代码片段展示了如何构建一个简单的均值滤波器,并将其作用于给定的图像数据上[^2]。 ##### 锐化滤波 为了突出图像边界或者增加对比度,通常会运用锐化技术。一种典型的代表就是拉普拉斯算子。其基本形式涉及二阶导数计算,在实际编程过程中可通过离散模板完成: \[ H(u,v)=\delta(u,v)-kG(u,v), k>0 \] 这里不再赘述具体的数学表达式推导过程,而是给出一段基于OpenCV库的实际编码案例供参考: ```python import cv2 import matplotlib.pyplot as plt # 加载原始图片 original_img = cv2.imread('example.jpg', cv2.IMREAD_GRAYSCALE) # 定义Laplacian内核 laplacian_kernel = np.array([[0, 1, 0], [1,-4, 1], [0, 1, 0]]) # 执行卷积运算 sharpened_img = cv2.filter2D(original_img, -1, laplacian_kernel) plt.figure(figsize=(8,4)) plt.subplot(121); plt.imshow(original_img,cmap="gray"); plt.title("Original Image") plt.subplot(122); plt.imshow(sharpened_img,cmap="gray"); plt.title("Sharpened Image") plt.show() ``` 此脚本读取一张黑白照片后施加了一个标准的四方向差分逼近方案来进行增强效果展示[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值