数字图像处理:空间域滤波

1.数字图像处理:空间域滤波

1.1 滤波器核(相关核)与卷积

图像上的邻域计算

线性空间滤波的原理

滤波器核(相关核)是如何得到的?


空间域的卷积




卷积:滤波器核与window中的对应值相乘后所有值相加得到一个像素值,滑动窗口遍历整个图像




滤波器核(相关核)与卷积的区别



截图来源:【小动画】彻底理解卷积【超形象】卷的由来,小元老师



滤波器核对称时,翻转与不翻转没有影响,所以卷积等于相关性


卷积的物理实质可以通过以下几个方面进行理解,这些方面涉及到信号处理、系统响应和图像处理等领域

1.2 图像加噪

噪声点的判定标准

由灰度直方图得到概率密度函数的方法





从含噪图像中确定具体噪声模型的系统化方法?

选取实验用的实验图像,完成图像读取和显示,给图像加上高斯噪声

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt# 打开图片并转换为灰度图像
img_dir = r'D:\Document\Experiment\data\image1.jpg'
# 读取图像并转换为灰度
gray = cv.imread(img_dir, 0)
image_array = np.array(gray)# 定义高斯噪声的参数
mean = 0  # 均值
sigma = 80  # 标准差(调整噪声强度)# 生成高斯噪声
gaussian_noise = np.random.normal(mean, sigma, image_array.shape)# 将噪声加入图像
noisy_image = image_array + gaussian_noise# 将噪声后的图像剪裁到0-255范围内,并转换为uint8
noisy_image_clipped = np.clip(noisy_image, 0, 255).astype(np.uint8)# 显示原图和加入噪声后的图像
plt.figure(figsize=(10,5))
plt.subplot(1,2,1)
plt.title('Original Image')
plt.imshow(image_array, cmap='gray')plt.subplot(1,2,2)
plt.title('Noisy Image')
plt.imshow(noisy_image_clipped, cmap='gray')
plt.show()

1.3 均值滤波、高斯滤波、中值滤波

均值滤波

高斯滤波



中值滤波


为了使得卷积能够正常进行,对原图像外围进行填充(padding)

用自己编写的滤波函数分别对实验图像进行滤波;

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt# 读取图像并转换为灰度
img_dir = r'D:\Document\Experiment\data\image1.jpg'  # 图像路径
gray = cv.imread(img_dir, 0)  # 读取图像,并将其转换为灰度图像# 定义高斯噪声的参数
mean = 0  # 高斯噪声的均值
sigma = 80  # 高斯噪声的标准差,用于控制噪声强度# 生成高斯噪声并添加到图像
gaussian_noise = np.random.normal(mean, sigma, gray.shape)  # 生成与图像相同大小的高斯噪声
noisy_image = gray + gaussian_noise  # 将生成的噪声添加到图像
noisy_image_clipped = np.clip(noisy_image, 0, 255).astype(np.uint8)  # 将噪声叠加后的图像值限制在0到255,并转换为uint8类型# 均值滤波实现
# 其中,均值滤波一般的具体实现步骤是:
# .选择一个(2n+l) x (2n+l)的窗口(通常为3 x 3或5 x 5),并用该窗口沿图像数据进行行或列的滑动;
# .读取窗口下各对应像素的灰度值;
# .求取这些像素的灰度平均值替代窗口中心位置的原始像素灰度值。
def mean_filter(image, kernel_size=3):# 填充大小# 根据传入的窗口大小 kernel_size 计算需要的填充尺寸# 因为均值滤波会涉及到窗口的滑动,所以为了保持输出图像的尺寸与输入图像相同,需要在图像的边缘进行填充。对于 3x3 的窗口,pad_size 为 1;对于 5x5 的窗口,pad_size 为 2pad_size = kernel_size // 2  # 根据核大小计算需要的填充尺寸# 使用 np.pad 函数将原始图像进行填充,pad_size 为填充的边界大小,mode='constant' 指定使用常数值填充,constant_values=0 表示用 0 填充。这使得在处理图像边缘时能够避免索引超出边界的错误。padded_image = np.pad(image, pad_size, mode='constant', constant_values=0)  # 用常数0填充图像边缘# 创建一个与输入图像 image 形状相同的全零数组 output_image,用于存储均值滤波后的结果。output_image = np.zeros_like(image)  # 初始化输出图像,大小与原图一致# 滑动窗口进行均值滤波# 外层循环:通过 for 循环遍历填充后的图像的行,从 pad_size 开始到 padded_image.shape[0] - pad_size 结束。这样做是为了避免在处理图像边缘时出现越界for i in range(pad_size, padded_image.shape[0] - pad_size):# 内层循环:同样通过 for 循环遍历填充后的图像的列,范围与行的处理相同。这两个嵌套循环用于对图像的每一个像素进行处理for j in range(pad_size, padded_image.shape[1] - pad_size):# 获取窗口内的像素:通过切片操作从填充后的图像中获取当前窗口的像素值。窗口的大小为 (kernel_size, kernel_size),即从 (i-pad_size, j-pad_size) 到 (i+pad_size, j+pad_size) 的区域window = padded_image[i-pad_size:i+pad_size+1, j-pad_size:j+pad_size+1]  # 获取窗口内的像素# 使用 np.mean(window) 计算窗口中像素值的平均值,并将结果赋值给输出图像 output_image 的对应位置。为了保持位置一致性,索引使用 i-pad_size 和 j-pad_sizeoutput_image[i-pad_size, j-pad_size] = np.mean(window)  # 计算窗口像素的平均值,并赋给输出图像的对应位置return output_image  # 返回滤波后的图像# 高斯滤波实现
# 高斯滤波一般的具体实现步骤是:
# .选择一个(2n+l) x (2n+l)的窗口(通常为3 x 3或5 x 5),生成二维高斯模板,并用该窗口沿图像数据进行行或列的滑动;
# .读取窗口下各对应像素的灰度值;
# .求取这些像素与二维高斯模板对应位置元素的乘积再求和,用该值替代窗口中心位置的原始像素灰度值。
def gaussian_kernel(kernel_size=3, sigma=1.0):k = kernel_size // 2  # 计算高斯核中心的偏移gaussian_kernel = np.zeros((kernel_size, kernel_size), dtype=np.float32)  # 初始化高斯核for x in range(-k, k + 1):  # 遍历核的行坐标for y in range(-k, k + 1):  # 遍历核的列坐标gaussian_kernel[x + k, y + k] = np.exp(-(x**2 + y**2) / (2 * sigma**2))  # 根据高斯公式计算权重gaussian_kernel /= (2 * np.pi * sigma**2)  # 归一化常数gaussian_kernel /= gaussian_kernel.sum()  # 对高斯核进行归一化,使其所有元素的和为1return gaussian_kernel  # 返回生成的高斯核def gaussian_filter(image, kernel_size=3, sigma=1.0):pad_size = kernel_size // 2  # 计算填充大小padded_image = np.pad(image, pad_size, mode='constant', constant_values=0)  # 用常数0填充图像边缘output_image = np.zeros_like(image)  # 初始化输出图像kernel = gaussian_kernel(kernel_size, sigma)  # 生成高斯核# 滑动窗口进行高斯滤波for i in range(pad_size, padded_image.shape[0] - pad_size):for j in range(pad_size, padded_image.shape[1] - pad_size):window = padded_image[i-pad_size:i+pad_size+1, j-pad_size:j+pad_size+1]  # 获取窗口内的像素output_image[i-pad_size, j-pad_size] = np.sum(window * kernel)  # 计算窗口像素与高斯核的加权和return output_image  # 返回滤波后的图像# 中值滤波实现
# 中值滤波一般的具体实现步骤是:
# .选择一个(2n+l)x(2n+l)的窗口(通常为3x3或5x5),并用该窗口沿图像数据进行行或列的滑动;
# .读取窗口下各对应像素的灰度值;
# .将这些灰度值从小到大排成一列,用排序所得的中值替代窗口中心位置的原始像素灰度值;
def median_filter(image, kernel_size=3):pad_size = kernel_size // 2  # 计算填充大小padded_image = np.pad(image, pad_size, mode='constant', constant_values=0)  # 用常数0填充图像边缘output_image = np.zeros_like(image)  # 初始化输出图像# 滑动窗口进行中值滤波for i in range(pad_size, padded_image.shape[0] - pad_size):for j in range(pad_size, padded_image.shape[1] - pad_size):# 获取窗口内的像素window = padded_image[i-pad_size:i+pad_size+1, j-pad_size:j+pad_size+1]  output_image[i-pad_size, j-pad_size] = np.median(window)  # 计算窗口像素的中值,并赋给输出图像的对应位置return output_image  # 返回滤波后的图像# 进行均值滤波、高斯滤波、中值滤波
mean_filtered_img = mean_filter(noisy_image_clipped, kernel_size=3)  # 应用均值滤波,使用3x3窗口
gaussian_filtered_img = gaussian_filter(noisy_image_clipped, kernel_size=3, sigma=1.0)  # 应用高斯滤波,使用3x3窗口,sigma为1.0
median_filtered_img = median_filter(noisy_image_clipped, kernel_size=3)  # 应用中值滤波,使用3x3窗口# 定义运算及其标题
operations = [("Original", gray),  # 原始图像("Noised", noisy_image_clipped),  # 添加噪声后的图像("Mean Filter", mean_filtered_img),  # 均值滤波后的图像("Gaussian Filter", gaussian_filtered_img),  # 高斯滤波后的图像("Median Filter", median_filtered_img)  # 中值滤波后的图像
]# 绘图
plt.figure(figsize=(15, 7))  # 设置绘图窗口大小
for i, (title, result) in enumerate(operations, 1):  # 遍历运算结果plt.subplot(2, 3, i)  # 创建子图,2行3列plt.title(title)  # 设置子图标题plt.imshow(result, cmap='gray')  # 显示图像,使用灰度颜色映射plt.axis('off')  # 关闭坐标轴显示plt.tight_layout()  # 自动调整子图布局,使之不重叠
plt.show()  # 显示图像


用OpenCV自带的滤波函数对实验图像分别进行滤波;

# (4)用OpenCV自带的滤波函数对实验图像分别进行滤波;
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt# 读取图像并转换为灰度
img_dir = r'D:\Document\Experiment\data\image1.jpg'
gray = cv.imread(img_dir, 0)# 灰度加噪(添加高斯噪声)
mean = 0  # 均值
sigma = 80  # 标准差(调整噪声强度)
gaussian_noise = np.random.normal(mean, sigma, gray.shape)  # 生成高斯噪声
noisy_image = gray + gaussian_noise  # 将噪声加入图像
noisy_image_clipped = np.clip(noisy_image, 0, 255).astype(np.uint8)  # 剪裁到0-255范围并转换为uint8# 均值滤波实现
def mean_filter(image, kernel_size=5):# 使用cv2的blur函数进行均值滤波return cv.blur(image, (kernel_size, kernel_size))# 高斯滤波实现
def gaussian_filter(image, kernel_size=5, sigma=1.0):# 使用cv2的GaussianBlur函数进行高斯滤波return cv.GaussianBlur(image, (kernel_size, kernel_size), sigma)# 中值滤波实现
def median_filter(image, kernel_size=5):# 使用cv2的medianBlur函数进行中值滤波return cv.medianBlur(image, kernel_size)# 进行均值滤波、高斯滤波、中值滤波
mean_filtered_img = mean_filter(noisy_image_clipped)
gaussian_filtered_img = gaussian_filter(noisy_image_clipped)
median_filtered_img = median_filter(noisy_image_clipped)# 定义运算及其标题
operations = [("Original", gray),("Noised", noisy_image_clipped),("Mean Filter", mean_filtered_img),("Gaussian Filter", gaussian_filtered_img),("Median Filter", median_filtered_img)
]# 绘图
plt.figure(figsize=(15, 7))
for i, (title, result) in enumerate(operations, 1):plt.subplot(2, 3, i)plt.title(title)plt.imshow(result, cmap='gray')plt.axis('off')  # 关闭坐标轴显示plt.tight_layout()
plt.show()

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Echarts】折线图和柱状图如何从后端动态获取数据?

🚀个人主页:一颗小谷粒 🚀所属专栏:Web前端开发 很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~ 目录 1.1 前端数据分析 1.2 数据库表分析 1.3 后端数据处理 1.4 前端接收数据 继上一篇文章&…

MySQL 查询优化器

文章目录 控制查询计划optimizer_prune_leveloptimizer_search_depth 优化器参数优化器提示索引提示成本模型server_costcost_name engine_cost 控制查询计划 https://dev.mysql.com/doc/refman/8.4/en/controlling-query-plan-evaluation.html 在执行SQL前会根据优化器选择执…

C++_智能指针详解

什么是智能指针?为什么要有智能指针?到目前为止,我们编写的程序所使用的对象都有着严格定义的生命周期。比如说,全局对象在程序启动时分配,在程序结束时销毁;再比如说局部static对象在第一次使用前分配&…

electron-builder 首次执行报错问题解决

假日想研究一下 react electron 的使用,结果发现首次打包疯狂报错,研究了一下之后才发现是第一次的话 electron-builder 会从外面下载依赖包到我们系统中,由于某种力量导致压缩包无法下载或者是下载过慢导致失败,要解决其实也简单…

初学51单片机之I2C总线与E2PROM二

总结下上篇博文的结论: 1:ACK信号在SCL为高电平期间会一直保持。 2:在字节数据传输过程中如果发送电平跳变,那么电平信号就会变成重复起始或者结束的信号。(上篇博文的测试方法还是不能够明确证明这个结论&#xff0…

【C++】入门基础介绍(上)C++的发展历史与命名空间

文章目录 1. 前言2. C发展历史2. 1 C版本更新特性一览2. 2 关于C23的一个小故事: 3. C的重要性3. 1 编程语言排行榜3. 2 C在工作领域中的应用 4. C学习建议和书籍推荐4. 1 C学习难度4. 2 学习书籍推荐 5. C的第一个程序6. 命名空间6. 1 namespace的价值6. 2 namespace的定义6. …

首届中美可持续发展峰会在加州圆满举行,引领国际绿色发展新方向

现场嘉宾与(部分)与会人员大合影 2024年8月18日,由美国领创商业联盟(Youth Entrepreneur Business Alliance, YEBA)主办的首届中美可持续发展峰会(Sino-American Symposium on Sustainable Development)在加州森林湖市(Lake Forest)盛大举行。此次峰会吸引了数百名来自中美两国…

HTML+CSS之表格(15个案例+代码+效果图+素材)

目录 1.table标签的border属性 案例:制作一个带边框的表格 1.代码 2.效果 2.table标签的cellspacing属性 案例:制作一个带边距的表格 1.代码 2.效果 3.table标签的cellpadding属性 1.代码 2.效果 4.table标签的width和height属性 案例:指定宽高的表格 1.代码 2.效果 5.table标签…

全新芒果YOLOv10改进135:最新注意力机制EMA:即插即用,具有跨空间学习的高效多尺度注意力模块,ICCASSP 2023

💡本篇内容:芒果YOLOv10改进135:最新注意力机制EMA:即插即用,具有跨空间学习的高效多尺度注意力模块,ICCASSP 2023 **具有跨空间学习的高效多尺度注意力模块EMA | 即插即用 该模块通常包括多个并行的注意力子模块,每个子模块关注于输入数据的不同尺度或分辨率。这些子模块…

HTML+CSS表单控件(11个案例+代码+效果图)

目录 单行文本框 (text) 案例:制作一个单行文本框 1.代码 2.效果 密码输入框 (password) 案例:制作密码输入框 1.代码 2.效果 单选按钮 (radio) 案例:制作单选按钮 1.代码 2.效果 复选框 (checkbox) 案例:制作一个复选框 1.代码 2.效果 普通按钮 (button) 案例:制作一个普通按钮…

Java毕业设计实战项目之基于SSM框架的民宿预定系统

项目技术架构: 该SSMVue的民宿预定系统,后端采用SSM架构,前端采用VueElementUI实现页面的快速开发,并使用关系型数据库MySQL存储系统运行数据。本系统分为三种角色,分别是系统管理员,用户,房主…

RD-Agent Windows安装教程

RD-Agent Windows安装教程 QuantML QuantML 2024年09月23日 18:30 Content RD-Agent 是微软亚洲研究院推出的一款自动化研究与开发工具,能够通过LLMs自动构建因子和策略,相关介绍见我们之前的文章:RD-Agent :自动化Quant工厂 然…

10.5二分专练,二分边界情况,+1不加1的判断,方向判断,各种DEBUG

5 https://leetcode.cn/problems/minimum-speed-to-arrive-on-time/submissions/570242512/ 就是说总时间是 前n-1量汽车的运行时间,向上取整,然后再加上最后一辆列车的运行时间 最快的话是需要n-1个小时 搜索空间就是时速,左边界是1&#x…

windows中下载、安装、配置JDK/JDK环境配置/Java配置环境变量/Linux中安装配置JDK环境

JDK下载(官网)、安装、配置(包括系统、idea、eclipse)一篇就够了 1、问题概述? Java开发者必须掌握的JDK下载、安装、配置过程。 包括在Eclipse及IDEA中的配置使用 2、下载JDK 【注册Oracle官网账号】 下载的前天是注册orcle官网账号,作为开发者,这个必须有,随时关注…

VBA信息获取与处理第三个专题第三节:工作薄在空闲后自动关闭

《VBA信息获取与处理》教程(版权10178984)是我推出第六套教程,目前已经是第一版修订了。这套教程定位于最高级,是学完初级,中级后的教程。这部教程给大家讲解的内容有:跨应用程序信息获得、随机信息的利用、电子邮件的发送、VBA互…

Web安全 - 路径穿越(Path Traversal)

文章目录 OWASP 2023 TOP 10导图定义路径穿越的原理常见攻击目标防御措施输入验证和清理避免直接拼接用户输入最小化权限日志监控 ExampleCode漏洞代码:路径穿越攻击案例漏洞说明修复后的安全代码代码分析 其他不同文件系统下的路径穿越特性Windows系统类Unix系统&a…

记录|Modbus-TCP产品使用记录【摩通传动】

目录 前言一、摩通传动实验图1.1 配置软件 IO_Studio1.2 测试软件Modbus Poll1.2.1 读写设置测试1.2.2 AI信号的读取 1.3 对应的C#连接Modbus的测试代码如下【自制,仅供参考】1.4 最终实验图 更新时间 前言 参考文章: 自己需要了解和对比某些产品的Modbu…

【MySQL】服务器管理与配置

MySQL服务器 服务器默认配置 查看服务器默认选项和系统变量 mysqld --verbose --help 查看运行时的系统变量,可以通过like去指定自己要查询的内容 状态变量的查看 系统变量和状态变量的作用域 全局作用域: 对于每个会话都会生效当前会话:只…

初识算法 · 滑动窗口(1)

目录 前言: 长度最小的子数组 题目解析 算法原理 算法编写 无重复长度的最小字符串 题目解析 算法原理 算法编写 前言: 本文开始,介绍的是滑动窗口算法类型的题目,滑动窗口本质上其实也是双指针,但是呢&#…

异常处理【C++提升】(基本思想,重要概念,异常处理的函数机制、异常机制,栈解旋......你想要的全都有)

更多精彩内容..... 🎉❤️播主の主页✨😘 Stark、-CSDN博客 本文所在专栏: C系列语法知识_Stark、的博客-CSDN博客 座右铭:梦想是一盏明灯,照亮我们前行的路,无论风雨多大,我们都要坚持不懈。 异…