图像预处理-图像噪点消除

一.基本介绍

噪声:指图像中的一些干扰因素,也可以理解为有那么一些点的像素值与周围的像素值格格不入。常见的噪声类型包括高斯噪声和椒盐噪声。

滤波器:也可以叫做卷积核

- 低通滤波器是模糊,高通滤波器是锐化

- 低通滤波器就是允许低频信号通过,在图像中边缘噪点都相当于高频部分,所以低通滤波器用于去除噪点、平滑和模糊图像。高通滤波器则反之,用来增强图像边缘,进行锐化处理。

注意:椒盐噪声可以理解为斑点,随机出现在图像中的黑点或白点;高斯噪声可以理解为拍摄图片时由于光照等原因造成的噪声。

这是高斯噪声


这是椒盐噪声,有很多黑白的或者孤立的小点


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:当normalizeTrue的时候,方框滤波就是均值滤波,权重就等于1/9;normalizeFalse的时候,每个像素权重都是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.]]

        这里的值就是用上面的卷积核计算的,其中边缘由于没有左侧的值无法做左右两边的差分,所以是0,也就是无梯度变化。然后中间两列有着超出255的最大数值,这就会作为边缘被提取出来。

        差分后值的符号正负代表梯度的方向,差分值实际应该取绝对值,毕竟我们只是想看数值大小来提取边缘。值超过了255都算(+-)255,即使是负号。

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

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

相关文章

安卓手机如何改ip地址教程

对于安卓手机用户而言,ip修改用在电商、跨境电商、游戏搬砖、社交软件这些需要开多个账号的项目。因为多个设备或账号又不能在同一ip网络下,所以修改手机的IP地址防检测成为一个必要的操作。以下是在安卓手机上更改IP地址的多种方法及详细步骤&#xff0…

对象池模式在uniapp鸿蒙APP中的深度应用

文章目录 对象池模式在uniapp鸿蒙APP中的深度应用指南一、对象池模式核心概念1.1 什么是对象池模式?1.2 为什么在鸿蒙APP中需要对象池?1.3 性能对比数据 二、uniapp中的对象池完整实现2.1 基础对象池实现2.1.1 核心代码结构2.1.2 在Vue组件中的应用 2.2 …

本地部署大模型实现扫描版PDF文件OCR识别!

在使用大模型处理书籍 PDF 时,有时你会遇到扫描版 PDF,也就是说每一页其实是图像形式。这时,大模型需要先从图片中提取文本,而这就需要借助 OCR(光学字符识别)技术。 像 Gemini 2.5 这样的强大模型&#x…

《Operating System Concepts》阅读笔记:p700-p732

《Operating System Concepts》学习第 60 天,p700-p732 总结,总计 33 页。 一、技术总结 1.Virtual machine manager (VMM) The computer function that manages the virtual machine; also called a hypervisor. VMM 也称为 hypervisor。 2.types …

软件项目验收报告模板

软件项目验收报告 一、项目基本信息 项目名称XX智能仓储管理系统开发单位XX科技有限公司验收单位XX物流集团合同签订日期2023年3月15日项目启动日期2023年4月1日验收日期2024年1月20日 二、验收范围 入库管理模块(包含RFID识别、库存预警)出库调度模…

深度学习笔记39_Pytorch文本分类入门

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 | 接辅导、项目定制 一、我的环境 1.语言环境:Python 3.8 2.编译器:Pycharm 3.深度学习环境: torch1.12.1cu113torchvision…

二分查找-LeetCode

题目 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。 示例 1: 输入: nums [-1,0,3,5,9,12], target 9 输出: 4 解释: …

从 Ext 到 F2FS,Linux 文件系统与存储技术全面解析

与 Windows 和 macOS 操作系统不同,Linux 是由爱好者社区开发的大型开源项目。它的代码始终可供那些想要做出贡献的人使用,任何人都可以根据个人需求自由调整它,或在其基础上创建自己的发行版本。这就是为什么 Linux 存在如此多的变体&#x…

leetcode:3210. 找出加密后的字符串(python3解法)

难度:简单 给你一个字符串 s 和一个整数 k。请你使用以下算法加密字符串: 对于字符串 s 中的每个字符 c,用字符串中 c 后面的第 k 个字符替换 c(以循环方式)。 返回加密后的字符串。 示例 1: 输入&#xff…

JVM详解(曼波脑图版)

(✪ω✪)ノ 好哒!曼波会用最可爱的比喻给小白同学讲解JVM,准备好开启奇妙旅程了吗?(๑˃̵ᴗ˂̵)و 📌 思维导图 ━━━━━━━━━━━━━━━━━━━ 🍎 JVM是什么?(苹果式比…

ZStack文档DevOps平台建设实践

(一)前言 对于软件产品而言,文档是不可或缺的一环。文档能帮助用户快速了解并使用软件,包括不限于特性概览、用户手册、API手册、安装部署以及场景实践教程等。由于软件与文档紧密耦合,面对业务的瞬息万变以及软件的飞…

Git创建分支操作指南

1. 创建新分支但不切换&#xff08;仅创建&#xff09; git branch <分支名>示例&#xff1a;创建一个名为 new-feature 的分支git branch new-feature2. 创建分支并立即切换到该分支 git checkout -b <分支名> # 传统方式 # 或 git switch -c <分支名&g…

package.json 中的那些版本数字前面的符号是什么意思?

1. 语义化版本&#xff08;SemVer&#xff09; 语义化版本的格式是 MAJOR.MINOR.PATCH&#xff0c;其中&#xff1a; MAJOR&#xff1a;主版本号&#xff0c;表示不兼容的 API 修改。MINOR&#xff1a;次版本号&#xff0c;表示新增功能但保持向后兼容。PATCH&#xff1a;修订号…

如何有效防止服务器被攻击

首先&#xff0c;我们要明白服务器被攻击的危害有多大。据不完全统计&#xff0c;每年因服务器遭受攻击而导致的经济损失高达数十亿。这可不是一个小数目&#xff0c;就好比您辛苦积攒的财富&#xff0c;瞬间被人偷走了一大半。 要有效防止服务器被攻击&#xff0c;第一步就是…

Chainlit 快速构建Python LLM应用程序

背景 chainlit 是一款简单易用的Web UI goggle&#xff0c;它支持使用 Python 语言快速构建 LLM 应用程序&#xff0c;提供了丰富的功能&#xff0c;包括文本分析&#xff0c;情感分析等。 这里我们以官网openai提供的例子&#xff0c;快速的开发一个带有UI的聊天界面&#xf…

华为OD机试真题——硬件产品销售方案(2025A卷:100分)Java/python/JavaScript/C++/C语言/GO六种最佳实现

2025 A卷 100分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析&#xff1b; 并提供Java、python、JavaScript、C、C语言、GO六种语言的最佳实现方式&#xff01; 2025华为OD真题目录全流程解析/备考攻略/经验分享 华为OD机试真题《硬件产品…

【数据结构_6】双向链表的实现

一、实现MyDLinkedList&#xff08;双向链表&#xff09; package LinkedList;public class MyDLinkedList {//首先我们要创建节点&#xff08;因为双向链表和单向链表的节点不一样&#xff01;&#xff01;&#xff09;static class Node{public String val;public Node prev…

做Data+AI的长期主义者,加速全球化战略布局

在Data与AI深度融合的新纪元&#xff0c;唯有秉持长期主义方能真正释放数智化的深层价值。2025年是人工智能从技术爆发转向规模化落地的关键节点&#xff0c;也是标志着袋鼠云即将迎来十周年的重要里程碑。2025年4月16日&#xff0c;袋鼠云成功举办了“做DataAI的长期主义者——…

构建基于PHP和MySQL的解梦系统:设计与实现

引言 梦境解析一直是人类心理学和文化研究的重要领域。随着互联网技术的发展,构建一个在线的解梦系统能够帮助更多人理解自己梦境的含义。本文将详细介绍如何使用PHP和MySQL构建一个功能完整的解梦系统,包括系统架构设计、数据库模型、核心功能实现以及优化策略。 本文源码下…

【桌面】【系统应用】Samba共享文件夹

目录 场景一&#xff1a;银河麒麟桌面与银河麒麟桌面之间共享文件夹 环境准备 实现目标 操作步骤 &#xff08;一&#xff09;配置主机A共享文件夹 1、环境准备 2、在主机A创建共享文件夹 3、设置共享文件密码 &#xff08;二&#xff09;主机B访问主机A 场景二&…