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

news2024/10/5 15:22:58

文章目录

  • 1. 概述
  • 2 低通(平滑)滤波
    • 2.1 均值滤波
    • 2.2 中值滤波
    • 2.3 高斯低通滤波
    • 2.4 双边滤波
    • 2.5 导向滤波
  • 3 高通(锐化)滤波
    • 3.1 Laplacian滤波器
    • 3.3 Sobel滤波器

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 高斯低通滤波

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/421331.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于OpenCV的人脸识别

目录 🥩 前言 🍖 环境使用 🍖 模块使用 🍖 模块介绍 🍖 模块安装问题: 🥩 OpenCV 简介 🍖 安装 OpenCV 模块 🥩 OpenCV 基本使用 🍖 读取图片 🍗 【…

【Pytorch】利用PyTorch实现图像识别

本文参加新星计划人工智能(Pytorch)赛道:https://bbs.csdn.net/topics/613989052 这是目录使用torchvision库的datasets类加载常用的数据集或自定义数据集使用torchvision库进行数据增强和变换,自定义自己的图像分类数据集并使用torchvision库加载它们使…

安卓渐变的背景框实现

安卓渐变的背景框实现1.背景实现方法1.利用PorterDuffXfermode进行图层的混合,这是最推荐的方法,也是最有效的。2.利用canvas裁剪实现,这个方法有个缺陷,就是圆角会出现毛边,也就是锯齿。3.利用layer绘制边框1.背景 万…

Python 爬虫进阶必备 | 某电影站视频采集加密参数逻辑分析

点击上方“咸鱼学Python”,选择“加为星标”第一时间关注Python技术干货!今日网站aHR0cHM6Ly96MS5tMTkwNy5jbi8/ang9JUU1JTkzJTg4JUU1JTg4JUE5JUMyJUI3JUU2JUIzJUEyJUU3JTg5JUI5JUU0JUI4JThFJUU1JUFGJTg2JUU1JUFFJUE0加密定位与分析分析的网站是一个电影…

强化学习分类与汇总介绍

1.强化学习(Reinforcement Learning, RL) 强化学习把学习看作试探评价过程,Agent选择一个动作用于环境,环境接受该动作后状态发生变化,同时产生一个强化信号(奖或惩)反馈给Agent,Agent根据强化信号和环境当…

记一次 .NET 某医疗住院系统 崩溃分析

一:背景 1. 讲故事 最近收到了两起程序崩溃的dump,查了下都是经典的 double free 造成的,蛮有意思,这里就抽一篇出来分享一下经验供后面的学习者避坑吧。 二:WinDbg 分析 1. 崩溃点在哪里 windbg 带了一个自动化分…

Ubuntu上搭建网站【建立数据隧道,降低开支】

上篇:Ubuntu搭建web站点并发布公网访问 目录 1.安装WordPress 2.创建WordPress数据库 3.安装相对URL插件 4.内网穿透将网站发布上线 1.命令行方式: 2.图形化操作方式 5.图书推荐 cpolar官网 1.安装WordPress 在前面的介绍中,我们为大…

Spring Cloud Alibaba全家桶(八)——Sentinel规则持久化

前言 本文小新为大家带来 Sentinel规则持久化 相关知识,具体内容包括,Sentinel规则推送三种模式介绍,包括:原始模式,拉模式,推模式,并对基于Nacos配置中心控制台实现推送进行详尽介绍~ 不积跬步…

【K8S系列】Pod详解

目录 序言 1 前言 2 为什么需要pod 3 什么是Pod? 3.1 Pod的组成 3.2 Pod的用途 3.3 Pod的生命周期 3.4 Pod的特点 4 Pod的使用 5 结论 序言 任何一件事情,只要坚持六个月以上,你都可以看到质的飞跃。 今天学习一下K8s-Pod相关内容&…

SQL Server的页面(pages )和盘区(extents)体系结构

pages 和 extents 体系结构一、背景二、页面和盘区2.1、页面2.2、大行支持2.3、行溢出注意事项2.4、盘区(extents)三、管理扩展数据块分配和可用空间3.1、管理扩展数据块分配3.2、跟踪可用空间四、管理对象使用的空间五、追踪修改后的盘区总结一、背景 …

Spring Cloud Alibaba全家桶(九)——分布式事务组件Seata

前言 本文小新为大家带来 分布式事务组件Seata 相关知识,具体内容包括分布式事务简介(包括:事务简介,本地事务,分布式事务典型场景,分布式事务理论基础,分布式事务解决方案)&#xf…

PyTorch 之 基于经典网络架构训练图像分类模型

文章目录一、 模块简单介绍1. 数据预处理部分2. 网络模块设置3. 网络模型保存与测试二、数据读取与预处理操作1. 制作数据源2. 读取标签对应的实际名字3. 展示数据三、模型构建与实现1. 加载 models 中提供的模型,并且直接用训练的好权重当做初始化参数2. 参考 pyto…

可视化CNN和特征图

卷积神经网络(cnn)是一种神经网络,通常用于图像分类、目标检测和其他计算机视觉任务。CNN的关键组件之一是特征图,它是通过对图像应用卷积滤波器生成的输入图像的表示。 理解卷积层 1、卷积操作 卷积的概念是CNN操作的核心。卷积是一种数学运算&#x…

当深度学习遇上Web开发:Spring和OpenAI如何实现图片生成?

文章目录一、简介1. 什么是Spring和OpenAI2. 生成图像的意义和应用场景二、相关技术介绍1. 深度学习模型2. GAN模型3. TensorFlow框架四、简单的Spring应用1. 搭建Spring项目2. 添加相关依赖3. 编写简单的控制器五、OpenAI API1. 介绍OpenAI API2. 搭建OpenAI API环境3. 配置AP…

Pytorch实现GCN(基于Message Passing消息传递机制实现)

文章目录前言一、导入相关库二、加载Cora数据集三、定义GCN网络3.1 定义GCN层3.1.1 消息传递阶段(message)3.1.2 消息聚合阶段(aggregate)3.1.3 节点更新阶段(update)3.1.4 定义传播过程(propag…

AI时代来临,如何把握住文档处理及数据分析的机遇

AI时代来临,如何把握住文档处理及数据分析的机遇前言一、生成式人工智能与元宇宙二、面向图像文档的复杂结构建模研究三、大型语言模型的关键技术和实现ChatGPT 介绍ChatGPT的三个关键技术四、ChatGPT与文档处理未来总结前言 在3月18日,由中国图象图形协…

【CVPR 2023】FasterNet论文详解

论文名称:Run, Don’t Walk: Chasing Higher FLOPS for Faster Neural Networks 论文地址:https://arxiv.org/abs/2303.03667 作者发现由于效率低下的每秒浮点运算,每秒浮点运算的减少并不一定会导致类似水平的延迟减少。提出通过同时减少冗…

YOLOv2论文解读/总结

本章论文: YOLOv2论文(YOLO9000: Better, Faster, Stronger)(原文+解读/总结+翻译) 系列论文: YOLOv1论文解读/总结_yolo论文原文_耿鬼喝椰汁的博客-CSDN博客 前言 在YOLOv1推出一…

k8s 部署nginx 实现集群统一配置,自动更新nginx.conf配置文件 总结

k8s 部署nginx 实现集群统一配置,自动更新nginx.conf配置文件 总结 大纲 1 nginx镜像选择2 创建configmap保存nginx配置文件3 使用inotify监控配置文件变化4 Dockerfile创建5 调整镜像原地址使用阿里云6 创建deploy部署文件部署nginx7 测试使用nginx配置文件同步&…

ETL 与 ELT的关键区别

ETL 和 ELT 之间的主要区别在于数据转换发生的时间和地点 — 这些变化可能看起来很小,但会产生很大的影响! ETL 和 ELT 是数据团队引入、转换并最终向利益干系人公开数据的两种主要方式。它们是与现代云数据仓库和 ETL 工具的开发并行发展的流程。 在任…