图像预处理-图像噪点消除
一.基本介绍
噪声:指图像中的一些干扰因素,也可以理解为有那么一些点的像素值与周围的像素值格格不入。常见的噪声类型包括高斯噪声和椒盐噪声。
滤波器:也可以叫做卷积核
- 低通滤波器是模糊,高通滤波器是锐化
- 低通滤波器就是允许低频信号通过,在图像中边缘和噪点都相当于高频部分,所以低通滤波器用于去除噪点、平滑和模糊图像。高通滤波器则反之,用来增强图像边缘,进行锐化处理。
注意:椒盐噪声可以理解为斑点,随机出现在图像中的黑点或白点;高斯噪声可以理解为拍摄图片时由于光照等原因造成的噪声。

这是高斯噪声

这是椒盐噪声,有很多黑白的或者孤立的小点
1.1 均值滤波
cv.blur(img, ksize)
参数:
- ksize:代表卷积核的大小
取的是卷积核区域内元素的均值。
对于边界的像素点,则会进行边界填充,以确保卷积核的中心能够对准边界的像素点进行滤波操作。在OpenCV中,默认的是使用BORDER_REFLECT_101的方式进行填充,下面的滤波方法中除了中值滤波使用的是BORDER_REPLICATE进行填充之外,其他默认也是使用这个方式进行填充
import cv2 as cvimg = cv.imread('../images/lvbo2.png')# 均值滤波,用3*3的卷积核
blur = cv.blur(img, (3, 3))cv.imshow('img', img)
cv.imshow('blur', blur)
cv.waitKey(0)
cv.destroyAllWindows()

1.2 方框滤波
cv.boxFilter(img, ddepth,ksize, normalize)
参数:
- ksize:代表卷积核的大小
- ddepth:输出图像的深度,-1代表使用原图像的深度。
指在每个像素点所使用的位数(bit depth),也就是用来表示图像中每一个像素点的颜色信息所需的二进制位数。图像深度决定了图像能够表达的颜色数量或灰度级。
- normalize:当normalize为True的时候,方框滤波就是均值滤波,权重就等于1/9;normalize为False的时候,每个像素权重都是1,相当于求区域内的像素和,超出部分做取模运算。
import cv2 as cvimg = cv.imread('../images/lvbo2.png')# 方框滤波,用3*3的卷积核,类似均值滤波
box = cv.boxFilter(img, -1,(3, 3),normalize=True)# 真正的方框滤波
box1 = cv.boxFilter(img, -1,(3, 3), normalize=False)cv.imshow('img', img)
cv.imshow('box', box)
cv.imshow('box1', box1)
cv.waitKey(0)
cv.destroyAllWindows()
跟均值滤波很像

可以看到这里的方框滤波显示图片是很接近白色的,因为其将像素点周围的像素权重都设为1,然后相加得到该像素的值,所以很多都超过了255而进行了取模操作。
1.2 高斯滤波
cv.GaussianBlur(img, ksize, sigmaX)
参数:
- sigmaX:
就是高斯函数里的值,σx值越大,模糊效果越明显。高斯滤波相比均值滤波效率要慢,但可以有效消除高斯噪声,能保留更多的图像细节,所以经常被称为最有用的滤波器。
通过使用高斯函数(正态分布)作为卷积核来对图像进行模糊处理。
import cv2 as cvimg = cv.imread('../images/lvbo2.png')# 高斯,用3*3的卷积核
Gauss = cv.GaussianBlur(img, (3, 3), 1)cv.imshow('img', img)
cv.imshow('Gauss', Gauss)cv.waitKey(0)
cv.destroyAllWindows()

1.3 中值滤波
cv.medianBlur(img, ksize)
中值滤波没有核值,而是在原图中从左上角开始,将卷积核区域内的像素值进行排序,并选取中值作为卷积核的中点的像素值。就是用区域内的中值来代替本像素值,所以那种孤立的斑点,如0或255很容易消除掉,适用于去除椒盐噪声和斑点噪声
import cv2 as cv# 导入椒盐噪声图片
img = cv.imread('../images/lvbo3.png')# 中值滤波,注意这里的3
median = cv.medianBlur(img, 3)cv.imshow('img', img)
cv.imshow('median', median)cv.waitKey(0)
cv.destroyAllWindows()

其实你会注意到,中值滤波的ksize为啥是个整数呢,前面的都是(x,x)。因为中值滤波是非线性的,且没有核值不依赖卷积核权重。
1.4 双边滤波
cv.bilateralFilter(img,ksize,d,sigmaColor,sigmaSpace)
参数:
- d:过滤时周围每个像素领域的直径,这里已经设置了核大小。d=9===>9x9
- sigmaColor:在color space(值域空间)中过滤sigma。参数越大,那些颜色足够相近的的颜色的影响越大。较大的sigmaColor意味着更大的颜色差异将被允许参与到加权平均中.
- sigmaSpace:在coordinate space(坐标空间)中过滤sigma。这个参数是坐标空间中的标准差,决定了像素位置对滤波结果的影响程度。
双边滤波的基本思路是同时考虑将要被滤波的像素点的空域(空间)信息(周围像素点的位置的权重)和值域信息(周围像素点的像素值的权重)。因为在边缘处,临近的像素点差异会比较大,如果只是使用空域信息来进行滤波的话,得到的结果必然是边缘被模糊了,这样我们就丢掉了边缘信息。这也是一种非线性滤波。
import cv2 as cvimg = cv.imread('../images/lvbo2.png')# 双边滤波
sb = cv.bilateralFilter(img, 9, 100, 100)cv.imshow('img', img)
cv.imshow('sb', sb)cv.waitKey(0)
cv.destroyAllWindows()

注意:
关于2个sigma参数:
简单起见,可以令2个sigma的值相等;
如果他们很小(小于10),那么滤波器几乎没有什么效果;
如果他们很大(大于150),那么滤波器的效果会很强,使图像显得非常卡通化。
关于参数d:
过大的滤波器(d>5)执行效率低。
对于实时应用,建议取d=5;
对于需要过滤严重噪声的离线应用,可取d=9;
二.图像梯度处理
2.1 图像梯度
把图片想象成连续函数,因为边缘部分的像素值是与旁边像素有明显区别,所以对图片局部求极值,就可以得到整幅图片的边缘信息了。不过图片是二维的离散函数,导数就变成了差分,这个差分就称为图像的梯度。
2.2 垂直边缘提取

这个核是用来提取图片中的垂直边缘(右侧边缘,若提取左边缘卷积核中正负号换一下就好)的,中间像素就是这个卷积核卷积的结果。
当前列左右两侧的元素进行差分,由于边缘(当前列)的值明显小于(或大于)周边像素,所以边缘(当前列)的差分结果会明显不同,这样就提取出了垂直边缘。简单理解,就是在‘1’位置右边的像素值相对于‘-1’位置左边的像素值的差距会显示在中间的像素中,所以中间的列就是旁边两列的垂直差分。
来介绍一下二维卷积函数:
cv2.filter2D(src, ddepth, kernel)
- src: 输入图像,一般为numpy数组。
- ddepth: 输出图像的深度,可以是负值(表示与原图相同)、正值或其他特定值(常用-1 表示输出与输入具有相同的深度)。
- kernel: 卷积核,一个二维数组(通常为奇数大小的方形矩阵),用于计算每个像素周围邻域的加权和。
import cv2 as cv
import numpy as np# 模拟一张图像,灰度图
img=np.array([[100,102,109,110,98,20,19,18,21,22],[109,101,98,108,102,20,21,19,20,21],[109,102,105,108,98,20,22,19,19,18],[109,98,102,108,102,20,23,19,20,22],[109,102,105,108,98,20,22,19,20,18],[100,102,108,110,98,20,19,18,21,22],[109,101,98,108,102,20,22,19,20,21],[109,102,108,108,98,20,22,19,19,18],],dtype=np.float32)
# 定义卷积核,
kernel=np.array([[-1,0,1],[-2,0,2],[-1,0,1]],dtype=np.float32)
# 二维卷积操作
img2=cv.filter2D(img,-1,kernel)
# 打印卷积后的图
print(img2)
[[ 0. -4. 30. -14. -356. -320. -6. 2. 12. 0.]
[ 0. -17. 28. -10. -354. -317. -5. -3. 7. 0.]
[ 0. -26. 29. -10. -352. -312. -4. -10. 3. 0.]
[ 0. -22. 32. -14. -352. -310. -4. -11. 4. 0.]
[ 0. -7. 30. -24. -354. -310. -5. -5. 5. 0.]
[ 0. 1. 29. -23. -356. -314. -6. 0. 9. 0.]
[ 0. -15. 28. -12. -354. -315. -5. -5. 7. 0.]
[ 0. -24. 26. -12. -352. -312. -4. -10. 2. 0.]]
这里的值就是用上面的卷积核计算的,其中边缘由于使用边界反射101进行填充,左右两边的差分为0,也就是无梯度变化。然后中间两列有着超出255的最大数值,这就会作为边缘被提取出来。
差分后值的符号正负代表梯度的方向,差分值实际应该取绝对值,毕竟我们只是想看数值大小来提取边缘。值超过了255都算(+-)255,即使是负号。
如果使用的是一张真正的图片进行特征提取,建议转化为灰度图(单通道)方便计算。
2.3 水平边缘提取
把上面的卷积矩阵进行转置进行操作就可以了。
2.4 Sobel算子
上面的两个卷积核都叫做Sobel算子,只是方向不同。这个算子可以两方向上特征结合提取
总梯度是:

sobel_image = cv2.Sobel(src, ddepth, dx, dy, ksize)
- src:通常应该是一个单通道图像,因为 Sobel 算子是基于像素亮度梯度计算的。
- dx,dy:当组合为dx=1,dy=0时求x方向的一阶导数,在这里,设置为1意味着垂直特征提取,因为其做的是水平方向梯度。(若同时为1,通常得不到想要的结果,两个方向的处理不是太好)
- ksize:Sobel算子的大小,可选择3、5、7,默认为3。
import cv2 as cvpig = cv.imread('../images/pig.png', cv.IMREAD_GRAYSCALE)# 选择垂直特征提取
sobel_img1 = cv.Sobel(pig, -1, 1, 0, 3)# 选择水平特征提取
sobel_img2 = cv.Sobel(pig, -1, 0, 1, 3)# 两特征提取
sobel = cv.Sobel(pig, -1, 1, 1, 3)cv.imshow('pig', pig)
cv.imshow('sobel_img1', sobel_img1)
cv.imshow('sobel_img2', sobel_img2)
cv.imshow('sobel', sobel)
cv.waitKey(0)
cv.destroyAllWindows()

2.5 Laplacian算子
其用的是二阶导
也将两个方向的梯度结合在一起计算,下面是其卷积核:

有些时候考虑斜对角元素就会变成:

cv2.Laplacian(src, ddepth)
Laplacian算子是二阶边缘检测的典型代表,一/二阶边缘检测各有优缺点。
import cv2 as cvpig = cv.imread('../images/pig.png', cv.IMREAD_GRAYSCALE)La = cv.Laplacian(pig, -1)
cv.imshow('Original', pig)
cv.imshow('Laplacian', La)
cv.waitKey(0)
cv.destroyAllWindows()

相关文章:
图像预处理-图像噪点消除
一.基本介绍 噪声:指图像中的一些干扰因素,也可以理解为有那么一些点的像素值与周围的像素值格格不入。常见的噪声类型包括高斯噪声和椒盐噪声。 滤波器:也可以叫做卷积核 - 低通滤波器是模糊,高通滤波器是锐化 - 低通滤波器就…...
6.数据手册解读—运算放大器(二)
目录 6、细节描述 6.1预览 6.2功能框图 6.3 特征描述 6.3.1输入保护 6.3.1 EMI抑制 6.3.3 温度保护 6.3.4 容性负载和稳定性 6.3.5 共模电压范围 6.3.6反相保护 6.3.7 电气过载 6.3.8 过载恢复 6.3.9 典型规格与分布 6.3.9 散热焊盘的封装 6.3.11 Shutdown 6.4…...
用 Deepseek 写的uniapp油耗计算器
下面是一个基于 Uniapp 的油耗计算器实现,包含 Vue 组件和页面代码。 1. 创建页面文件 在 pages 目录下创建 fuel-calculator 页面: <!-- pages/fuel-calculator/fuel-calculator.vue --> <template><view class"container"…...
thinkphp实现图像验证码
示例 服务类 app\common\lib\captcha <?php namespace app\common\lib\captcha;use think\facade\Cache; use think\facade\Config; use Exception;class Captcha {private $im null; // 验证码图片实例private $color null; // 验证码字体颜色// 默认配置protected $co…...
【k8s系列4】工具介绍
1、虚拟机软件 vmware workstation 2、shell 软件 MobaXterm 3、centos7.9 下载地址 (https://mirrors.aliyun.com/centos/7.9.2009/isos/x86_64/?spma2c6h.25603864.0.0.374bf5adOaiFPW) 4、上网软件...
微博辐射源和干扰机
微波辐射源和干扰机是电子战和通信领域中的两个重要概念,它们在军事、民用及科研中具有广泛应用。以下是两者的详细解析及其相互关系: 1. 微波辐射源 定义: 微波辐射源是指能够主动发射微波(频率范围通常为 300 MHz&…...
计算机网络——网络模型
一、OSI七层模型 (1)客户端发送请求时 OSI 七层模型的运作流程 应用层(Application Layer) 用户通过浏览器输入URL(如https://example.com),根据协议类型(HTTP/HTTPS)确…...
Spark-SQL核心编程2
路径问题 相对路径与绝对路径:建议使用绝对路径,避免复制粘贴导致的错误,必要时将斜杠改为双反斜杠。 数据处理与展示 SQL 风格语法:创建临时视图并使用 SQL 风格语法查询数据。 DSL 风格语法:使用 DSL 风格语法查询…...
Java 序列化与反序列化终极解析
Java 序列化与反序列化终极解析 1. 核心概念 (1) 什么是序列化? 定义:将对象转换为字节流的过程(对象 → 字节) 目的: 持久化存储(如保存到文件) 网络传输(如RPC调用)…...
STM32单片机入门学习——第41节: [12-1] Unix时间戳
写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难,但我还是想去做! 本文写于:2025.04.18 STM32开发板学习——第41节: [12-1] Unix时间戳 前言开发板说明引用解答和科普一…...
无人机自主导航与路径规划技术要点!
一、自主导航与路径规划技术要点 1. 传感器融合 GPS/北斗定位:提供全局定位,但在室内或遮挡环境下易失效。 惯性测量单元(IMU)**:通过加速度计和陀螺仪实时追踪姿态,弥补GPS信号丢失时的定位空缺。 …...
AI绘画SD中,如何保持生成人物角色脸部一致?Stable Diffusion精准控制AI人像一致性两种实用方法教程!
在AI绘画StableDiffusion中,一直都有一个比较困难的问题,就是如何保证每次出图都是同一个人。今天就这个问题分享一些个人实践,大家和我一起来看看吧。 一. 有哪些实现方式 方式1:固定Seed种子值。 固定Seed种子值出来的图片人…...
java 设计模式 策略模式
简介 策略模式(Strategy Pattern)是一种行为设计模式,旨在定义一系列算法,并将每一个算法封装起来,使它们可以互相替换。策略模式让算法的变化独立于使用算法的客户端。换句话说,策略模式通过将不同的算法…...
std::set (C++)
std::set 1. 概述定义特点 2. 内部实现3. 性能特征4. 常用 API5. 使用示例6. 自定义比较器7. 注意事项与优化8. 使用建议 1. 概述 定义 template<class Key,class Compare std::less<Key>,class Allocator std::allocator<Key> > class std::set;特点 有…...
STM32 HAL 通用定时器延时函数
使用通用定时器TIM3,实现ms、us延时。 delay.c #include "delay.h" #include "stm32f1xx_hal.h"TIM_HandleTypeDef htim3;/*** brief 初始化定时器3用于延时* param 无* retval 无*/ void Delay_Init(void) {TIM_ClockConfigTypeDef sClock…...
RK3588S开发板将SPI1接口改成GPIO
参考官方教程:ROC-RK3588S-PC 一.基本知识: 1.GPIO引脚计算: ROC-RK3588S-PC 有 5 组 GPIO bank:GPIO0~GPIO4,每组又以 A0~A7, B0~B7, C0~C7, D0~D7 作为编号区分,常用以下公式计算引脚:GPIO…...
PLOS ONE:VR 游戏扫描揭示了 ADHD 儿童独特的大脑活动
在孩子的成长过程中,总有那么一些“与众不同”的孩子。他们似乎总是坐不住,课堂上小动作不断,注意力难以集中,作业总是拖拖拉拉……这些行为常常被家长和老师简单地归结为“淘气”“不听话”。然而,他们可能并不只是“…...
DemoGen:用于数据高效视觉运动策略学习的合成演示生成
25年2月来自清华、上海姚期智研究院和上海AI实验室的论文“DemoGen: Synthetic Demonstration Generation for Data-Efficient Visuomotor Policy Learning”。 视觉运动策略在机器人操控中展现出巨大潜力,但通常需要大量人工采集的数据才能有效执行。驱动高数据需…...
极狐GitLab 账号限制有哪些?
极狐GitLab 是 GitLab 在中国的发行版,关于中文参考文档和资料有: 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 账户和限制设置 (BASIC SELF) 默认项目限制 您可以配置新用户能在其个人命名空间中创建的默认最大项目数。此限制仅影响更改…...
@JsonView + 单一 DTO:如何实现多场景 JSON 字段动态渲染
JsonView 单一 DTO:如何实现多场景 JSON 字段动态渲染 JsonView 单一 DTO:如何实现多场景 JSON 字段动态渲染1、JsonView 注解产生的背景2、为了满足不同场景下返回对应的属性的做法有哪些?2.1 最快速的实现则是针对不同场景新建不同的 DTO…...
JVM之经典垃圾回收器
一、垃圾回收算法 1. 标记-清除(Mark-Sweep) 步骤: 标记:遍历对象图,标记所有存活对象。清除:回收未被标记的垃圾对象。 特点:简单,但会产生内存碎片。 2. 标记-复制(…...
15 nginx 中默认的 proxy_buffering 导致基于 http 的流式响应存在 buffer, 以 4kb 一批次返回
前言 这也是最近碰到的一个问题 直连 流式 http 服务, 发现 流式响应正常, 0.1 秒接收到一个响应 但是 经过 nginx 代理一层之后, 就发现了 类似于缓冲的效果, 1秒接收到 10个响应 最终 调试 发现是 nginx 的 proxy_buffering 配置引起的 然后 更新 proxy_buffering 为…...
人工智能学习框架完全指南(2025年更新版)
一、核心框架分类与适用场景 人工智能框架根据功能可分为深度学习框架、机器学习框架、强化学习框架和传统工具库,以下是主流工具及选型建议: 1. 深度学习框架 (1)PyTorch 核心优势:动态计算图、灵活性强,适合科研与快速原型开发,支持多模态任务(如NLP、CV) 。技术生…...
安卓手机万能遥控器APP推荐
软件介绍 安卓手机也能当“家电总控台”?这款小米旗下的万能遥控器APP,直接把遥控器做成“傻瓜式操作”——不用配对,不连蓝牙,点开就能操控电视、空调、机顶盒,甚至其他品牌的电器!雷总这波操作直接封神&…...
颚式破碎机的设计
一、引言 颚式破碎机作为矿山、建材等行业的重要破碎设备,其性能优劣直接影响物料破碎效率与质量。随着工业生产规模的扩大和对破碎效率要求的提高,设计一款高效、稳定、节能的颚式破碎机具有重要意义。 二、设计需求分析 处理能力:根据目…...
PH热榜 | 2025-04-18
1. Wiza Monitor 标语:跟踪工作变动,接收Slack和电子邮件的提醒。 介绍:Wiza Monitor是一款用于追踪职位变动的工具,可以实时跟踪客户和潜在客户的工作变动,还可以通过电子邮件和Slack发送提醒,让你的客户…...
Android平台 Hal AIDL 系列文章目录
目录 1. Android Hal AIDL 简介2. AIDL 语言简介3. Android 接口定义语言 (AIDL)4. 定义AIDL 接口5. AIDL 中如何传递 Parcelable 对象6. 如何使用AIDL 定义的远程接口进行跨进程通信7. 适用于 HAL 的 AIDL8. Android Hal AIDL 编译调试9. 高版本Android (AIDL HAL) 沿用HIDL方…...
十、数据库day02--SQL语句01
文章目录 一、新建查询1.查询窗口的开启方法2. 单语句运行方法 二、数据库操作1.创建数据库2. 使用数据库3. 修改数据库4. 删除数据库和查看所有数据库5. 重点:数据库备份5.1 应用场景5.2 利用工具备份备份操作还原操作 5.3 扩展:使用命令备份 三、数据表…...
基于Atlas 800I A2 + Ubuntu 22.04 LTS 离线部署神州鲲泰问学一体机平台
一.环境信息 1.1.硬件信息 Atlas 800I A2 1.2.操作系统 版本: cat /etc/os-release PRETTY_NAME"Ubuntu 22.04 LTS" NAME"Ubuntu" VERSION_ID"22.04" VERSION"22.04 (Jammy Jellyfish)" VERSION_CODENAMEjammy IDubun…...
Shell脚本-变量是什么
在Shell脚本编程中,变量是一个非常基础且重要的概念。它们用于存储数据,并可以在整个脚本中引用这些数据来执行各种操作。理解如何定义、使用和管理变量是编写有效Shell脚本的关键。本文将详细介绍Shell脚本中的变量,包括其基本概念、类型以及…...
