opencv(5): 滤波器

滤波的作用:一幅图像通过滤波器得到另一幅图像;其中滤波器又称为卷积核,滤波的过程称为卷积。

锐化:边缘变清晰
在这里插入图片描述
低通滤波(Low-pass Filtering):

目标:去除图像中的高频成分,保留低频成分。
效果:平滑图像、去除噪声。
应用:图像平滑、模糊、去噪等。
常见滤波器:均值滤波、高斯滤波等。

高通滤波(High-pass Filtering):

目标:去除图像中的低频成分,保留高频成分。
效果:突出图像的边缘、细节。
应用:图像锐化、边缘检测等。
常见滤波器:拉普拉斯滤波、Sobel 滤波等。

在频域中,图像的低频成分对应于图像中变化缓慢的区域,而高频成分对应于图像中变化较快的区域。因此,低通滤波器通过减小图像中相邻像素之间的差异来平滑图像,而高通滤波器则通过强调相邻像素之间的差异来突出图像的边缘和细节。

低通滤波

主要是用来去噪。

均值滤波 cv2.blur

均值滤波是一种基本的图像处理技术,它通过取周围像素的平均值来模糊图像,从而减少图像中的噪声。这种滤波方法对于平滑图像、去除噪声或模糊图像中的细节很有用。

高斯滤波 cv2.GaussianBlur

高斯滤波是一种常用的图像处理技术,它通过在图像上应用高斯函数来进行平滑处理,从而降低图像的噪声并模糊图像。
cv2.GaussianBlur 函数接受三个参数:待处理的图像、高斯核的大小和标准差。高斯核的大小决定了平滑的程度,标准差越大,模糊效果越明显。在这个例子中,使用了一个 (5, 5) 的高斯核,标准差为 0,表示使用默认的标准差。

# 定义高斯核的大小,例如 (5, 5),和标准差,例如 0
kernel_size = (5, 5)
sigma = 0# 进行高斯滤波
blurred_img = cv2.GaussianBlur(img, kernel_size, sigma)

中值滤波 cv2.medianBlur

中值滤波是一种非线性滤波方法,它的原理是用窗口内的中值来代替中心像素的值,这样可以有效地去除图像中的椒盐噪声等离群值。
cv2.medianBlur 函数接受两个参数:待处理的图像和中值滤波的卷积核大小。卷积核大小必须是奇数,通常选择 3x3 或 5x5。

# 定义中值滤波的卷积核大小,必须是奇数
kernel_size = 5
# 进行中值滤波
blurred_img = cv2.medianBlur(img, kernel_size)

双边滤波 (对美颜效果好)

双边滤波是一种用于平滑图像的滤波技术,与传统的高斯滤波不同,它在平滑的同时保留了图像的边缘信息。这是通过同时考虑像素的颜色相似性和空间相似性来实现的。

cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace[, dst[, borderType]])

  • src: 输入图像(单通道或多通道图像)。
  • d: 表示滤波器的直径,也就是每个像素邻域的直径。整数类型的值,通常取正整数。
  • sigmaColor: 颜色空间的标准差,控制颜色相似性的权重。较大的值表示更广泛的颜色相似性。通常取正实数。
  • sigmaSpace: 坐标空间的标准差,控制像素空间的权重。较大的值表示更广泛的空间相似性。通常取正实数。
  • dst (可选): 输出图像,与输入图像大小和类型相同。
  • borderType (可选): 边界模式,默认为 cv2.BORDER_DEFAULT。
    返回值:如果提供了 dst 参数,则返回 dst,否则返回新创建的输出图像。
# 设置参数
d = 15  # 邻域直径
sigma_color = 75  # 颜色空间的标准差
sigma_space = 75  # 坐标空间的标准差# 进行双边滤波
bilateral_filtered_img = cv2.bilateralFilter(img, d, sigma_color, sigma_space)

高通滤波

主要是为了检测边缘。

Sobel

Sobel 算子是图像处理中常用的边缘检测算子之一,用于寻找图像中灰度变化明显的地方,通常用于边缘检测和图像梯度计算。Sobel 算子对图像进行卷积操作,分别计算水平方向和垂直方向的梯度,然后通过这两个梯度的组合来找到图像中的边缘。

Sobel 算子的具体形式如下:

水平方向 Sobel 算子:
在这里插入图片描述
垂直方向 Sobel 算子:
在这里插入图片描述
算法步骤:

  • 将图像与水平方向 Sobel 算子进行卷积,得到水平方向的梯度。
  • 将图像与垂直方向 Sobel 算子进行卷积,得到垂直方向的梯度。
  • 将水平和垂直梯度的幅值进行合并,得到边缘强度。

cv2.Sobel(src, ddepth, dx, dy, ksize[, dst[, scale[, delta[, borderType]]]])
参数说明:

  • src: 输入图像,灰度图像(单通道)。
  • ddepth: 输出图像的深度,通常使用 cv2.CV_64F。
  • dx: x 方向的导数阶数。
  • dy: y 方向的导数阶数。
  • ksize: Sobel 算子的大小,可以为 1、3、5、7。
  • dst (可选): 输出图像。
  • scale (可选): 缩放导数的比例因子,默认为1。
  • delta (可选): 添加到结果的值,默认为0。
  • borderType (可选): 边界模式,默认为 cv2.BORDER_DEFAULT。

Sobel 算子的优点是简单易实现,对于一些基本的边缘检测任务效果较好。在 OpenCV 中,可以使用 cv2.Sobel 函数来应用 Sobel 算子。例如:

import cv2
import numpy as np# 读取图像
image = cv2.imread('input_image.jpg', cv2.IMREAD_GRAYSCALE)# 水平方向 Sobel 算子
sobel_x = cv2.Sobel(image, cv2.CV_64F, 1, 0, ksize=3)# 垂直方向 Sobel 算子
sobel_y = cv2.Sobel(image, cv2.CV_64F, 0, 1, ksize=3)# 计算梯度幅值
gradient_magnitude = np.sqrt(sobel_x**2 + sobel_y**2)# 显示结果
cv2.imshow('Original Image', image)
cv2.imshow('Sobel X', sobel_x)
cv2.imshow('Sobel Y', sobel_y)
cv2.imshow('Gradient Magnitude', gradient_magnitude)
cv2.waitKey(0)
cv2.destroyAllWindows()

拉普拉斯算子

拉普拉斯算子是一种用于图像处理的算子,用于检测图像中的边缘和细节。在离散形式下,拉普拉斯算子通常定义为一个二阶导数的模板。在二维图像处理中,常见的拉普拉斯算子有以下几种形式:
在这里插入图片描述
cv2.Laplacian(src, ddepth[, ksize[, scale[, delta[, borderType]]]])

相比于 sobel,不需要分别计算水平和垂直。缺点是对噪音比较敏感,所以一般先进行平滑去噪。

ddepth

常见的深度值包括:

cv2.CV_8U: 无符号8位整数(0-255)。
cv2.CV_16U: 无符号16位整数。
cv2.CV_16S: 有符号16位整数。
cv2.CV_32F: 单精度浮点数。
cv2.CV_64F: 双精度浮点数。
选择适当的深度取决于应用程序的需求。如果图像中的边缘强度较大且可能为负值,则使用浮点数类型(如 cv2.CV_64F)可能更合适。

Canny 边缘检测

Canny边缘检测是一种经典的边缘检测算法,具有很好的性能和鲁棒性。以下是Canny边缘检测的基本步骤:

  • 灰度转换: 首先,将输入图像转换为灰度图像。这是因为Canny算法通常应用于灰度图像,而不是彩色图像。
  • 高斯滤波: 对灰度图像进行高斯滤波,以平滑图像并减小噪声。这有助于确保在边缘检测过程中不受到噪声的干扰。
  • 计算梯度: 使用Sobel等算子计算图像的梯度。这一步将得到图像中每个像素点的梯度幅值和方向。方向包括
  • 非极大值抑制: 对梯度图进行非极大值抑制,以保留局部梯度最大的像素,而抑制其他非极大值的像素。
  • 双阈值检测: 使用双阈值来标记图像中的强边缘和弱边缘。根据梯度幅值,像素被分类为强边缘、弱边缘或非边缘。一般来说,强边缘具有较大的梯度值,而弱边缘具有较小的梯度值。超过强阈值,一定是边缘,低于弱阈值,一定不是,中间的则看与已经确定的边缘的连接性。
  • 边缘跟踪: 根据强边缘的连通性,将弱边缘中与强边缘相连的部分保留作为最终的边缘。
    在这里插入图片描述
# 进行Canny边缘检测
edges = cv2.Canny(image, threshold1, threshold2, apertureSize=3, L2gradient=False)# 参数说明:
# - image: 输入的灰度图像
# - threshold1, threshold2: 用于进行边缘检测的双阈值,低阈值和高阈值之间的区域会被认为是边缘。
# - apertureSize: Sobel算子的孔径大小,默认为3。
# - L2gradient: 一个布尔值,如果为True,则使用更精确的L2范数进行梯度计算,否则使用L1范数。默认为False。

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

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

相关文章

Ubuntu22.04 部署Mqtt服务器

1、打开Download EMQX (www.emqx.io)下载mqtt服务器版本 2、Download the EMQX repository curl -s https://assets.emqx.com/scripts/install-emqx-deb.sh | sudo bash 3.Install EMQX sudo apt-get install emqx 4.Run EMQX sudo systemctl start…

软件测试面试-如何定位线上出现bug

其实无论是线上还是在测试出现bug,我们核心的还是要定位出bug出现的原因。 定位出bug的步骤: 1,如果是必现的bug,尽可能的复现出问题,找出引发问题的操作步骤。很多时候,一个bug的产生,很多时…

【案例】可视化大屏

人狠话不多,直接上效果图 这里放的地图自己去实现吧,如果也想实现3D地球话,等笔者那天有心情写篇文章; 说明:script中methods部分代码是没用,可以直接删掉,根据个人情况去写, 内容:笔者也就对页面布局进行了设计,内容的填充就靠个人了 <template><div :sty…

微机原理_12

一、单项选择题(本大题共15小题,每小题3分&#xff0c;共45分。在每小题给出的四个备选项中&#xff0c;选出一个正确的答案。〕 十进制正数56的 8位二进制补码是()。 A. 00011001 B. 10100110 C. 10011001 D. 00100110 若栈顶的物理地址为20100H&#xff0c;当执行完指令PUSH…

【计算机网络学习之路】网络基础1

文章目录 前言一. 计算机网络发展局域网和广域网 二. 网络协议三. OSI七层模型四. TCP/IP四层&#xff08;五层&#xff09;模型五. 计算机体系结构与网络协议栈六. 协议形式及局域网通信数据包封装与分用 七. 跨网络通信八. MAC地址与网络通信的理解结束语 前言 本系列文章是…

【漏洞复现】泛微e-Weaver SQL注入

漏洞描述 泛微e-Weaver&#xff08;FANWEI e-Weaver&#xff09;是一款广泛应用于企业数字化转型领域的集成协同管理平台。作为中国知名的企业级软件解决方案提供商&#xff0c;泛微软件&#xff08;广州&#xff09;股份有限公司开发和推广了e-Weaver平台。 泛微e-Weaver旨在…

centos7中安装Nginx和使用Nginx详细操作

环境&#xff1a; 准备了三台centos7虚拟机:192.168.213.4、192.168.213.5、192.168.213.6。 一、安装 三台虚拟机都安装下面的步骤执行&#xff0c;安装Nginx&#xff0c;为后面的使用演示使用。 1、安装必备组件: sudo yum install yum-utils2、配置yum源 在下面的文件目录…

毕业设计1784 ASP.NET停车场管理系统

摘要 本文设计了一个停车场管理系统&#xff0c;该系统分为超级管理员和管理员两种用户。系统实现了车位管理、停车卡管理、停车管理、统计报表、系统管理等功能。管理员可以添加、查看、编辑或删除车位信息、停车卡信息、停车记录等&#xff0c;同时可以按日、月、年统计进场…

〖大前端 - 基础入门三大核心之JS篇㊲〗- DOM改变元素节点的css样式、HTML属性

说明&#xff1a;该文属于 大前端全栈架构白宝书专栏&#xff0c;目前阶段免费&#xff0c;如需要项目实战或者是体系化资源&#xff0c;文末名片加V&#xff01;作者&#xff1a;不渴望力量的哈士奇(哈哥)&#xff0c;十余年工作经验, 从事过全栈研发、产品经理等工作&#xf…

【c++】——类和对象(中)——实现完整的日期类(优化)万字详细解疑答惑

作者:chlorine 专栏:c专栏 赋值运算符重载()()():实现完整的日期类(上) 我走的很慢&#xff0c;但我从不后退。 【学习目标】 日期(- - --)天数重载运算符 日期-日期 返回天数 对日期类函数进行优化(不符合常理的日期&#xff0c;负数&#xff0c;const成员)c中重载输入cin和输…

长虹智能电视使用123

1、开机 在接通电源的情况下&#xff0c;长虹智能电视开机有两种方式。 方式1&#xff1a; 按电视右下角开机按钮 方式2&#xff1a; 按电视遥控器开机按钮 长虹智能电视开机后会进入其操作系统&#xff08;安卓&#xff09;。 屏幕左右双箭头图表&#xff0c;手指点击会…

选硬币该用动态规划

选硬币&#xff1a; 现有面值分别为1角1分&#xff0c;5分&#xff0c;1分的硬币&#xff0c;请给出找1角5分钱的最佳方案。 #include <iostream> #include <vector>std::vector<int> findChange(int amount) {std::vector<int> coins {11, 5, 1}; /…

UniApp中的数据存储与获取指南

目录 介绍 数据存储方案 1. 本地存储 2. 数据库存储 3. 网络存储 实战演练 1. 本地存储实例 2. 数据库存储实例 3. 网络存储实例 注意事项与最佳实践 结语 介绍 在移动应用开发中&#xff0c;数据的存储和获取是至关重要的一部分。UniApp作为一款跨平台应用开发框架…

PyCharm 远程连接服务器并使用服务器的 Jupyter 环境

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

idea显示pom.xml文件漂黄警告 Dependency maven:xxx:xxx is vulnerable

场景&#xff1a; idea警告某些maven依赖包有漏洞或者依赖传递有易受攻击包&#xff0c;如下&#xff1a; 解决&#xff1a; 1、打开idea设置&#xff0c;找到 File | Settings | Editor | Inspections 2、取消上述两项勾选即可

计算机网络———ipv6简解

文章目录 1.前言&#xff1a;2. ipv6简单分析&#xff1a;2.1.地址长度对比2.2. ipv6包头分析2.3. ipv6地址的压缩表示&#xff1a;2.3. NDP&#xff1a;2.4. ipv6地址动态分配&#xff1a; 1.前言&#xff1a; 因特网地址分配组织)宣布将其最2011年2月3日&#xff0c;IANA (In…

Sentinel浅层介绍(上)

一、概述 Sentinel是阿里开源的一款面向分布式、多语言异构化服务架构的流量治理组件。 主要以流量为切入点&#xff0c;从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。 二、核心概念 1、资源 资…

MATLAB Simulink和S7-1200PLC MOBUSTCP通信

MATLAB Simulink和SMART PLC OPC通信详细配置请查看下面文章链接: MATLAB和西门子SMART PLC OPC通信-CSDN博客文章浏览阅读749次,点赞26次,收藏2次。西门子S7-200SMART PLC OPC软件的下载和使用,请查看下面文章Smart 200PLC PC Access SMART OPC通信_基于pc access smart的…

97.qt qml-自定义Table之实现ctrl与shift多选

我们之前实现了:93.qt qml-自定义Table优化(新增:水平拖拽/缩放自适应/选择使能/自定义委托)-CSDN博客 实现选择使能的时候,我们只能一行行去点击选中,非常麻烦,所以本章我们实现ctrl多选与shift多选、 所以在Table控件新增两个属性: 1.实现介绍 ctrl多选实现原理:当我…

AWS实战(一)-创建S3 存储桶

1&#xff09;登录AWS账号&#xff0c;选择服务—>存储—>S3。 2&#xff09;查看存储桶列表 3&#xff09;点击"创建存储桶"创建bucket。 4&#xff09;设置跨域 点击编辑&#xff0c;修改跨域设置即可。