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

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.mzph.cn/pingmian/55022.shtml

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

相关文章

SpringBoot实现学科竞赛管理:最佳实践

摘 要 随着国家教育体制的改革,全国各地举办的竞赛活动数目也是逐年增加,面对如此大的数目的竞赛信息,传统竞赛管理方式已经无法满足需求,为了提高效率,竞赛管理系统应运而生。 本学科竞赛管理系统以实际运用为开发背景…

SpringBoot--为什么Controller是串行的?怎样才能并行?

原文网址:SpringBoot--为什么Controller是串行的?怎样才能并行?-CSDN博客 简介 本文介绍SpringBoot为什么Controller是串行的?在什么场景下才能并行执行? 大家都知道,SpringBoot的Controller按理是并行执…

React学习笔记(四)——React 组件生命周期

目录 1. 生命周期-概览 2. 生命周期-挂载阶段 3. 生命周期-更新阶段 4. 生命周期-卸载阶段 5. setState扩展-发现问题 6. setState扩展-更多用法 7. setState扩展-异步 1. 生命周期-概览 了解react类组件生命周期整体情况 大致步骤: 什么是生命周期React类组…

Python3自带HTTP服务:轻松开启与后台管理

Python3自带有http服务,可以在服务器,也可以在本地启动,并运行一些常用的网页程序。比如:我们可以把streamlit框架编写的网页放到服务器上,开启http服务,就可以通过网页来调用这个pythont程序了&#xff0c…

Java SE 总结

Java SE(Standard Edition)是Java编程语言的标准版本,提供了基础的编程环境和API,适用于开发和运行Java应用程序。下面是Java SE的几个重要方面的知识回顾与总结。 1. Java环境基础 具体可参考这里对三者的介绍 传送门 1.1 JVM…

C++【类和对象】(取地址运算符重载与实现Date类)

文章目录 取地址运算符重载const成员函数取地址运算符重载 Date类的实现Date.hDate.cpp1.检查日期合法性2. 构造函数/赋值运算符重载3.得到某月的天数4. Date类 - 天数的操作4.1 日期 天数4.2 日期 天数4.3 日期 - 天数4.4 日期 - 天数 5. Date的前后置/--5.1 前置5.2 后置5.…

ORM的了解

什么是ORM?为什么要用ORM?-CSDN博客 C高级编程(99)面向资源的设计思想(ORM)_c orm-CSDN博客 ORM:Object-Relational-Mapping 对象关系映射 -------------------------- 我想对数据库中的表A进行增删改…

天龙八部怀旧单机微改人面桃花+安装教程+GM工具+虚拟机一键端

今天给大家带来一款单机游戏的架设:天龙八部怀旧单机微改人面桃花。 另外:本人承接各种游戏架设(单机联网) 本人为了学习和研究软件内含的设计思想和原理,带了架设教程仅供娱乐。 教程是本人亲自搭建成功的&#xf…

【Mybatis篇】动态SQL的详细带练

🧸安清h:个人主页 🎥个人专栏:【计算机网络】 🚦作者简介:一个有趣爱睡觉的intp,期待和更多人分享自己所学知识的真诚大学生。 文章目录 🎯一.动态SQL简单介绍 🚦动态S…

【深度】为GPT-5而生的「草莓」模型!从快思考—慢思考到Self-play RL的强化学习框架

原创 超 超的闲思世界 2024年09月11日 19:17 北京 9月11日消息,据外媒The Information昨晚报道,OpenAI的新模型「草莓」(Strawberry),将在未来两周内作为ChatGPT服务的一部分发布。 「草莓」项目是OpenAI盛传已久的…

全网最全软件测试面试题(含答案解析+文档)

一、软件测试基础面试题 1、阐述软件生命周期都有哪些阶段? 常见的软件生命周期模型有哪些? 软件生命周期是指一个计算机软件从功能确定设计,到开发成功投入使用,并在使用中不断地修改、增补和完善,直到停止该软件的使用的全过程(从酝酿到…

YOLO V8半自动标注工具设计

前提: 对于某些边界不明确的小目标,要是目标由比较多的话,标注起来就会非常麻烦。 如何利用已有训练模型,生成框,进行预标注。再通过调节预标注框的方式,提高标注的效率。 1 通过预先训练的模型生成yolo 格…

一文上手SpringSecurity【七】

之前我们在测试的时候,都是使用的字符串充当用户名称和密码,本篇将其换成MySQL数据库. 一、替换为真实的MySQL 1.1 引入依赖 <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.33</v…

Jenkins Pipeline 中通过勾选参数来控制是否构建 Docker 镜像

1.定义参数&#xff1a; 使用 booleanParam 定义一个布尔参数&#xff0c;示例如下 booleanParam(name: BUILD_DOCKER, description: 是否构建Docker镜像, defaultValue: false)2.使用参数&#xff1a; 在 stage 中&#xff0c;根据参数的值决定构建方式&#xff1a; stage(编…

python基础库

文章目录 1.研究目的2.platform库介绍3.代码4.结果展示 1.研究目的 最近项目中需要利用python获取计算机硬件的一些基本信息,查阅资料,.于是写下这篇简短的博客,有问题烦请提出,谢谢-_- 2.platform库介绍 platform 库是 Python 的一个内置库&#xff0c;可以让我们轻松地获取…

spring boot 项目中redis的使用,key=value值 如何用命令行来查询并设置值。

1、有一个老项目&#xff0c;用到了网易云信&#xff0c;然后这里面有一个AppKey&#xff0c;然后调用的时候要在header中加入这些标识&#xff0c;进行与服务器进行交互。 2、开发将其存在了redis中&#xff0c;一开始的时候&#xff0c;我们测试用的老的key&#xff0c;然后提…

ValueError: Out of range float values are not JSON compliant

可能原因一 可能原因二 数据里面有NaN

算法: 滑动窗口题目练习

文章目录 滑动窗口长度最小的子数组无重复字符的最长子串最大连续1个个数 III将x减到0的最小操作数水果成篮找到字符串中所有字母异位词串联所有单词的子串最小覆盖子串 总结 滑动窗口 长度最小的子数组 做这道题时,脑子里大概有个印象,知道要用滑动窗口,但是对于滑动窗口为什…

2016年国赛高教杯数学建模D题风电场运行状况分析及优化解题全过程文档及程序

2016年国赛高教杯数学建模 D题风电场运行状况分析及优化 风能是一种最具活力的可再生能源&#xff0c;风力发电是风能最主要的应用形式。我国某风电场已先后进行了一、二期建设&#xff0c;现有风机124台&#xff0c;总装机容量约20万千瓦。请建立数学模型&#xff0c;解决以下…

探索私有化聊天软件:即时通讯与音视频技术的结合

在数字化转型的浪潮中&#xff0c;企业对于高效、安全、定制化的通讯解决方案的需求日益迫切。鲸信&#xff0c;作为音视频通信技术的佼佼者&#xff0c;凭借其强大的即时通讯与音视频SDK&#xff08;软件开发工具包&#xff09;结合能力&#xff0c;为企业量身打造了私有化聊天…