空间滤波基础

news2024/11/15 10:58:21

  空间滤波是一种图像处理技术,它通过对每个像素周围的像素进行加权平均来平滑图像。这个过程的基本思想是,将每个像素的灰度值与它周围像素的灰度值进行加权平均,然后用平均值来替换原来的像素值。空间滤波器的大小和形状决定了每个像素的加权因子,这些因子决定了每个像素对最终结果的贡献程度。通常使用矩形或方形的空间滤波器,但也可以使用其他形状的滤波器,如圆形或椭圆形。

  空间滤波可以用来去除图像中的噪点或平滑图像,但是它也会模糊图像的细节。因此,在使用空间滤波时,必须权衡滤波器的大小和形状以及要达到的效果之间的平衡。

空间滤波的机理

  空间滤波的机理就是在待处理图像上逐像素地移动模板,在每个像素点,滤波器的响应通过事先定义的关系计算。若滤波器在图像像素上执行的是线性操作,则称为线性滤波器,否则为非线性滤波器。

  均值滤波器求解的是模板内像素灰度值的平均值,是典型的线性滤波器。统计排序滤波器是通过给定邻域内的灰度值大小实现的,原始数据与滤波结果是一种逻辑关系。

    对于一幅m*n的模板,假设m=2*a+1,n=2*b+1,a,b均为正整数,使用m*n大小的模板K对M*N大小的图像S进行线性空间滤波,得到T图像。

   

     其中(x,y)表示图像某一像素点。

 

 

  假设我们有一幅图像,其中一个像素的灰度值为 200,它周围的四个像素的灰度值分别为 100、150、180 和 220。如果我们使用大小为 3x3 的方形空间滤波器来平滑这幅图像,那么我们会将每个像素的灰度值与它周围像素的灰度值进行加权平均,然后用平均值来替换原来的像素值。在这种情况下,每个像素的加权因子都是相同的,因此我们将所有像素的灰度值除以周围像素的数量(也就是 4),得到的平均值就是新的像素值。在这种情况下,中心像素的新灰度值为(100+150+180+220+200)/ 5=178。

空间滤波器的大小和形状可以改变加权因子的计算方式,例如,我们可以使用更大的滤波器来平滑图像,或者使用更复杂的形状来保留更多的细节。

  实现空间滤波邻域处理时,需要考虑的一个问题是滤波中心靠近图像边界时如何计算空间滤波器的响应。

  

当滤波器的中心靠近图像边界时,可以使用边界处理来计算空间滤波器的响应。 边界处理可以帮助您在图像的边界处正确处理滤波器,使滤波器能够正常工作。

具体来说,可以采用以下几种方法之一来处理边界:

  1. 填充:在图像的边界外增加一圈像素,并使用某些方法(例如反射、循环、常量填充等)填充这些像素。 这样,就可以在边界外使用滤波器,而无需担心边界问题。

  2. 截断:在滤波器的中心超出图像边界的情况下,将滤波器的大小截断为与图像大小相同。 这样,就可以在图像内使用滤波器,而无需担心边界问题。

  3. 边界复制:将图像的边界像素复制到图像的外部,以便滤波器可以在边界外使用。 这种方法通常不太常用,因为它可能会导致边界处的伪影。

哪种方法最好取决于应用场景和需求。 通常来说,填充和截断是比较常用的边界处理方法。

  考虑一个大小为m*n的一个模板,当模板中心距离左边界或右边界为(n-1)/2个图像时,该模板一条边与图像左或右边界重合;当模板中心距离上边界或下边界为(m-1)/2个图像时,该模板一条边与图像上或下边界重合,如果继续向边界靠近,那么模板的行或者列就会处于图像平面之外。较为简单的方法就是将中心点限制不让模板出图像以外。这种解决方法处理后图像比原始图像小,可以将未被处理的灰度值直接复制到滤波结果处,保持滤波结果和原图像一致。另一种是在图像左右边界补上灰度为(n-1)/2,上下边界补上灰度为(m-1)/2灰度为0的像素点,再进行滤波处理。

import numpy as np


def corre12d(img, window):
    m = window.shape[0]
    n = window.shape[1]
    # 边界通过0灰度值填充
    img1 = np.zeros((img.shape[0] + m - 1, img.shape[1] + n - 1))
    img1[(m - 1) // 2:(img.shape[0] + (m - 1) // 2), (n - 1) // 2:(img.shape[1] + (n - 1) // 2)] = img
    img2 = np.zeros(img.shape)
    for i in range(img2.shape[0]):
        for j in range(img2.shape[1]):
            tmp = img1[i:i + m, j:j + n]
            img2[i, j] = np.sum(np.multiply(tmp, window))
    return (img1, img2)


# window表示滤波模板 img原始矩阵
window = np.array([[1, 0, 0], [0, 0, 0], [0, 0, 2]])
img = np.array(np.array([[1, 2, 1, 0, 2, 3], [0, 1, 1, 2, 0, 1],
                         [3, 0, 2, 1, 2, 2], [0, 1, 1, 0, 0, 1],
                         [1, 1, 3, 2, 2, 0], [0, 0, 1, 0, 1, 0]]))
# img1表示边界填充后矩阵,img2表示空间滤波结果
img1, img2 = corre12d(img, window)
print(img1)
print()
print(img2)

控制台:

[[0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 1. 2. 1. 0. 2. 3. 0.]
 [0. 0. 1. 1. 2. 0. 1. 0.]
 [0. 3. 0. 2. 1. 2. 2. 0.]
 [0. 0. 1. 1. 0. 0. 1. 0.]
 [0. 1. 1. 3. 2. 2. 0. 0.]
 [0. 0. 0. 1. 0. 1. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0.]]

[[2. 2. 4. 0. 2. 0.]
 [0. 5. 4. 5. 4. 2.]
 [2. 2. 1. 1. 4. 0.]
 [2. 9. 4. 6. 1. 2.]
 [0. 2. 1. 3. 0. 0.]
 [0. 1. 1. 3. 2. 2.]]

空间滤波器模板

  空间滤波器是一种在图像处理中常用的工具,它可以对图像进行平滑、锐化、边缘检测等操作。滤波器的模板是指用于滤波的系数矩阵,其中的每个元素都有特定的意义。常用的空间滤波器模板有以下几种:

  1. 均值滤波器:模板中的所有元素都相等,常用于图像平滑。

  2. 高斯滤波器:模板中的元素满足高斯分布,常用于图像平滑。

  3. 中值滤波器:模板中的所有元素都相等,但是元素的值是图像中某一点的像素值的中值,常用于去除图像中的椒盐噪声。

  4. Sobel滤波器:模板中的元素为一个3x3的系数矩阵,常用于图像边缘检测。

  5. Prewitt滤波器:模板中的元素为一个3x3的系数矩阵,常用于图像边缘检测。

  6. Laplacian滤波器:模板中的元素为一个3x3的系数矩阵,常用于图像边缘检测。

  7. Canny滤波器:模板中的元素为一个5x5的系数矩阵,常用于图像边缘检测。

  若空间滤波器模板系数从1开始进行索引,从左向右索引值递增,先索引第一行每个模板系数,再依次索引下一行每个模板系数。w向量表示滤波模板,z向量表示模板覆盖像素灰度值,3*3滤波模板响应R表示为:

       R=w_{1}z_{1}+w_{2}z_{2}+....+w_{mn}z_{mn}=\sum_{i=1}^{mn}w_{i}z_{i}=w^{T}z

例:3*3滤波模板

  空间滤波器是指在图像空间中进行卷积运算的滤波器,它是图像处理中常用的工具之一。通常,空间滤波器是用一个模板来进行卷积运算的,模板就是一个矩阵,称为卷积核(或者称为滤波器核)。

模板的大小和形状通常是固定的,常用的模板大小包括3x3、5x5、7x7等,形状包括圆形、方形、长条等。模板中的数值可以是实数或者整数,由于卷积运算是基于图像的像素进行计算的,所以模板中的数值通常与图像的像素值有关。

空间滤波器的模板可以是手动设计的,也可以是使用特定算法自动生成的。在实际应用中,使用现成的模板是一种比较常见的做法,这样可以节省设计时间,同时也可以保证模板的质量。常用的模板包括高斯模板、均值模板、中值模板、Sobel模板等。

  这里我们使用skimage库:

使用skimage中的空间滤波器模板,需要先导入skimage库和skimage.filters模块。然后,可以使用skimage.filters模块中的相应函数来调用模板。

from matplotlib import pyplot as plt
from skimage import  io ,filters,util


# 读入待处理的图像
image = io.imread('Test_Gray.jpg')
#加噪
noise=util.random_noise(image,mode='s&p',amount=0.1)
# 使用高斯模板进行空间滤波
filtered_image = filters.gaussian(image)
plt.subplot(121)
plt.title("noise")
plt.imshow(noise,cmap='gray')
plt.subplot(122)
plt.title("filtered_image")
plt.imshow(filtered_image,cmap='gray')
plt.show()

 

  除了高斯模板,skimage还提供了许多其他的空间滤波器模板,包括均值模板、中值模板、Sobel模板等。使用方法都类似,只需要替换相应的函数即可。

  你也可以使用matplotlib库中的imshow函数显示自定义图像滤波模板

 

import scipy.signal
import matplotlib.pyplot as plt
import numpy as np
from skimage import io

# 读入待处理的图像
image = io.imread("Test_Gray.jpg")

# 自定义滤波模板
template = np.ones((20, 20)) / (20 ** 2)

# 使用自定义滤波模板进行卷积运算
filtered_image = scipy.signal.convolve(image, template, mode='same')

# 使用matplotlib.pyplot.imshow函数显示结果图像
plt.subplot(121)
plt.title("Original")
plt.imshow(image, cmap='gray')
plt.subplot(122)
plt.title("filtered_image")
plt.imshow(filtered_image, cmap='gray')
plt.show()

 

  template变量是自定义的滤波模板,是一个3x3的矩阵。mode参数指定了卷积运算的模式,这里使用了'same'模式,表示输出图像的尺寸和输入图像的尺寸相同。

然后使用matplotlib.pyplot.imshow函数显示结果图像,cmap参数指定了使用的色彩映射类型,这里使用了灰度色彩映射

 

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

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

相关文章

如何用 Redis 统计用户访问量?

本文已经收录到Github仓库,该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构等核心知识点,欢迎star~ Github地址:https://github.com/Tyson0314/Java-…

DCN v1 可变形卷积v1解析(修正篇)

在两年前的这篇文章Deformable Convolution(可变形卷积)代码解析(有错误,修改中)中,当时对可变形卷积进行了代码解读,后来被网友指出其中的解释是错的,里面引用的keras版本的代码实现…

002、捕鱼和分鱼问题

002、【题目】捕鱼和分鱼问题 捕鱼和分鱼:A、B、C、D、E 五个人在某天夜里合伙去捕鱼, 到第二天凌晨时都疲惫不堪,于是各自找地方睡觉。 日上三杆,A第一个醒来,他将鱼分为五份,把多余的一条鱼 扔掉&…

C语言-数据的存储-整形的存储(8.1)

目录 思维导图: 1.数据类型的基本归类 1.1类型的意义 1.2整形家族 1.3浮点数家族 1.4构造类型 1.5指针类型 1.6空类型 2. 整形在内存中的存储 2.1 原码、反码、补码 2.2 大小端介绍 2.3 练习、巩固、提高 写在最后: 思维导图: 1…

视觉slam中的相机类型

作者:朱金灿 来源:clever101的专栏 为什么大多数人学不会人工智能编程?>>> 顾名思义,视觉 SLAM(又称 vSLAM)使用从相机和其他图像传感器采集的图像。视觉 SLAM 可以使用普通相机(广角…

【UnLua】深入理解 UnLua

【UnLua】深入理解 UnLua 从 UnLua 框架层面讨论真正值得关注的关键点 UnLua 架构UnLua 内存管理UnLua 性能 大纲 UnLua 静态导出UnLua 架构UnLua 内存管理UnLua 性能 静态导出 静态导出,这是标准的 Lua 用法,已经非常完善了,就一种标准…

qemu virtio设备模拟与初始化流程

文章目录VirtIO设备模拟及初始化流程Virtio设备的创建参数解析virtio 设备初始化流程pci_bus_matchpci_match_devicepci_device_probevirtio_pci_proberegister_virtio_devicevirtio_dev_matchvirtio_dev_probe参考VirtIO设备模拟及初始化流程 qemu设备虚拟机化的路线可以概括…

C++之智能指针

文章目录一、为什么需要智能指针?二、智能指针的使用及原理1. RAII2.智能指针的原理3. auto_ptr4. unique_ptr5. shared_ptr6. weak_ptr7.删除器一、为什么需要智能指针? 如果在 div() 输入的 b 0,那么就会抛出一个异常,被 main…

Redis面试题总结

一、Redis概述 1.什么是Redis? Redis是一个key-value存储系统,它支持存储的value类型相对更多,包括string、list、set、zset(sorted set --有序集合)和hash。这些数据结构都支持push/pop、add/remove及取交集并集和…

[程序设计]-基于人工智能博弈树,极大极小(Minimax)搜索算法并使用Alpha-Beta剪枝算法优化实现的可人机博弈的AI智能五子棋游戏。

绪论-五子棋的特点与规则 五子棋是两方之间进行的竞技活动,专用棋盘为15*15,五连子的方向为横、竖、斜;任一方在棋盘上形成横向、竖向、斜向的连续的相同颜色的五个(含五个以上)时即为该方胜利;在棋盘上以…

Intel OneApi Developer Tools

“英特尔OneApi开发人员工具”是一组工具和库,用于为Internet发布的各种处理建筑开发高速应用程序。oneAPI是一个完全开放的编写程序模型,支持具有不同架构的各种制造商。使用此工具,其他开发人员需要为每个架构师使用特定的代码,…

【小程序】视图与逻辑

文章目录页面导航声明式导航编程式导航导航传参页面事件下拉刷新事件上拉触底事件生命周期WXS 脚本wxs 和 JavaScript 的关系基础语法页面导航 页面导航指的是页面之间的相互跳转。例如&#xff0c;浏览器中实现页面导航的方式有如下两种&#xff1a; ① <a> 链接② lo…

前端工程师leetcode算法面试必备-二叉树的构造和遍历

一、前言 上一篇中介绍了如何采用 DFS 和 BFS 的搜索思想去实现二叉树的前序遍历、中序遍历、后序遍历以及分层遍历。 这一节主要介绍 Medium 难度中比较常见的一种题型&#xff1a;根据各种遍历构造二叉树。 二、1008. 先序遍历构造二叉树 返回与给定先序遍历 preorder 相匹…

2022阅读数据分析报告

零、前言 晃晃悠悠,又至年尾。翻阅新的书籍五十有余,得到读书和樊登讲书,累计或许在千余小时,或跑步,或骑行,或徒步,偶或地铁,都做耳旁音。回首年初扶起的flag,细思存量不存质。暂且延续2021年的阅读记录方式1,简单可视化本年阅读数据,收尾第二年的阅读小结。 图1 年…

WeNet开源社区介绍

本文是由张彬彬在第二届SH语音技术研讨会和第七届Kaldi技术交流会上对WeNet开源社区的一些工作上的整理&#xff0c;内容涵盖了 WeNet 的最新进展、新项目WeKws&#xff0c;WeSpeeker和WeTextProcessing的介绍&#xff0c;以及去年发布的两个数据集Opencpop和WenetSpeech在今年…

11矩阵空间、秩1矩阵

矩阵空间 知识概要 ​ 从矩阵空 间谈起&#xff0c;介绍矩阵空间的维数&#xff0c;基等问题。渗透一些微分方程与线性代数之间的 联系&#xff0c;并介绍秩为 1 的矩阵特点。 矩阵空间 对角阵D不是很理解。 &#xff08;1&#xff09;基与维数 再看对角阵 D&#xff0c;明…

Hudi学习03 -- Spark操作hudi(Spark-shell 和 PySpark)

文章目录Spark环境准备Spark-shell 方式启动命令&#xff0c;需要显示指定一些参数插入数据查询数据时间旅行&#xff08;Time Travel Query&#xff09;更新数据增量查询&#xff08;Incremental query&#xff09;删除数据&#xff08;Delete Data&#xff09;覆盖分区数据&a…

阴道菌群——贯穿女性一生

阴道微生物组是一个复杂而动态的微生态系统&#xff0c;在女性月经周期和女性的一生中不断发生波动。 在过去几年中&#xff0c;对阴道微生物群关注随着测序技术的发展和应用逐渐广泛和突出&#xff0c;有关以往传统正常和异常阴道微生物组的知识也发生了变化。培养技术可能不再…

Bandit算法学习[网站优化]01——Multiarmed Bandit 算法引入

Bandit算法学习[网站优化]01——Multiarmed Bandit 算法引入 参考资料 White J. Bandit algorithms for website optimization[M]. " O’Reilly Media, Inc.", 2013.https://github.com/johnmyleswhite/BanditsBookeasy-rl 一、探索与利用&#xff08;exploration…

Next.js i18n国际化实现方案(支持ReactNode类型、可传参)

前言 抛开Next.js框架不谈&#xff0c;想必其他项目也经常会遇到国际化方案&#xff0c;大概逻辑都是差不多的&#xff0c;只是说这次本人碰巧在Next上的项目有这样的需求&#xff0c;并记录下来。 实现思路&#xff1a; 其实不从代码角度上讲的话&#xff0c;无非是引入一个…