Opencv4 c++ 自用笔记 04 图像滤波与边缘检测

news2025/6/6 17:08:34

图像滤波与边缘检测

直接采集到的图像可能带有噪声的干扰,因此去除噪声是图像预处理中十分重要的一步。图像滤波是图像噪声去除的重要方式。

图像卷积

卷积操作广泛应用于信号处理领域,而图像本质上可以视为一种二维信号数据。

卷积过程可以理解为一个卷积模板(卷积核)在图像上逐像素移动,对模板覆盖区域内的像素值进行加权求和,计算结果作为模板中心位置的输出值。

为避免卷积输出值超出数据表示范围,通常对卷积模板进行归一化处理,使模板中所有元素的和为1。

卷积运算所需函数如下:

filter2D(src, dst, ddepth, kernel, anchor=Point(-1, -1), delta, borderType=BORDER_DEFAULT);

srcdst为源图像和输出图像,ddepth为输出图像的数据类型(深度)
kernel为卷积模板矩阵,anchor为模板中心,(-1, -1)表示模板中心位于模板的中心元素。
delta为偏值,在计算中会将其加上
borderType为像素外推法选择标志

示例:

#include<opencv2/opencv.hpp>
#include<iostream>
#include<stdio.h>
using namespace std;
using namespace cv;

int main(void) {
    Mat img = imread("test.jpg");
    Mat gray;
    cvtColor(img, gray, COLOR_BGR2GRAY);

    Mat kernel = (Mat_<float>(3, 3) << 1, 2, 1,
    								   2, 0, 2,
    								   1, 2, 1);
    Mat kernel_norm = kernel/12; // 归一化
    Mat result, result_norm;
    filter2D(img, result,-1 , kernel);
    filter2D(img, result_norm, -1, kernel_norm);

    imshow("Original Image", img);
    imshow("Result Image", result);
    imshow("Result Image Normalized", result_norm);
    waitKey(0);
    return 0;
}

卷积提取特征原理

卷积核通过在图像上滑动,每次只关注一个小的局部区域(感受野),这使得它能够专注于图像中的小块区域,识别局部特征如边缘、角点、纹理等,同时避免全局干扰,不会被图像其他无关区域的信息干扰。

卷积过程本质上是模板匹配。卷积核与图像区域进行点乘求和,计算相似度,当图像区域与卷积核模式相似时,产生强烈的响应值,响应值的大小和位置表明了特征的强度和位置。

并且同一个卷积核在整个图像上共享权重参数,无论特征出现在图像的哪个位置,都能被同一个卷积核检测到,相比全连接层,大大减少了计算的参数数量,且对图像中目标的小幅移动具有一定的容忍度。

线性滤波

图像滤波的主要目的是去除不重要的信息,突出关键特征。主要应用包括:噪声消除和特征提取。

线性滤波操作与图像卷积操作过程相似,此时卷积模板称为滤波模板。

均值滤波

将模板中所有像素值的平均值作为模板中心的输出值。

优点:在像素值变换趋势一致时去除噪声影响。

缺点:缩小像素间的差距,使细节变模糊。

blur(src, dst, ksize, anchor=Point(-1, -1), borderType=BORDER_DEFAULT);

ksize为滤波模板大小,anchor为模板基准点
borderType为像素外推法选择标志

示例:

#include<opencv2/opencv.hpp>
#include<iostream>
#include<stdio.h>
using namespace std;
using namespace cv;

int main(void) {
    Mat img = imread("/home/bandiera/桌面/1/test.jpg");
    Mat gray;
    cvtColor(img, gray, COLOR_BGR2GRAY);
    imshow("Original Image", img);
    imshow("Gray Image", gray);
    
    Mat result1, result2;
    blur(img, result1, Size(13, 13));//size越大,结果越模糊
    blur(gray, result2, Size(13, 13));
    
    imshow("Blur Image", result1);
    imshow("Blur Gray Image", result2);
    waitKey(0);
}
方框滤波

方框滤波是均值滤波的一般形式,可以选择是否对求和结果进行归一化。

boxFilter(src, ast, ddepth, ksize, anchor, normalize, borderType);

normalize是否进行归一化,默认为true(此时等同于均值滤波)

normalize=false时,直接输出像素值的和

高斯滤波

高斯滤波主要用于去除高斯噪声,其滤波模板的权重符合高斯分布。

GaussianBlur(src, dst, ksize, sigmaX, sigmaY, borderType);

sigmaX为X方向高斯核的标准差,sigmaY为Y方向的标准差,如果为0则等同sigmaX。若二者均为0,则自动计算。

getGaussianKernel(ksize, sigma, ktype=CV_64F);

ksize为滤波器尺寸,必须为正奇数,sigma为标准差,ktype为滤波器系数数据类型。
这个函数用于生成指定尺寸的高斯滤波器。

可分离滤波

此前的滤波函数使用的滤波器都是固定形式的滤波器,需要手动去调整滤波模板。故opencv4给出了根据根自定义滤波器实现滤波的函数。

滤波过程中不会对原图像进行修改,故滤波是一个并行过程。并且往不同方向分别滤波的结果与整体滤波的结果一致,故有可分离性。

对于某些滤波器,可以将二维滤波分解为两个一维滤波的组合,从而提高计算效率。

opencv4提供了可根据两个方向的滤波器进行联合滤波的函数,如下:

sepFilter2D(src, dst, ddepth. kernelX, kernelY, anchor, delta, borderType);

kernelX为x方向的滤波器,kernelY为y方向的滤波器

非线性滤波

非线性滤波的计算结果不是由滤波器内的像素值通过线性组合计算得到的,其过程可能包含排序、逻辑运算等。线性滤波只是令噪声更柔和,而不会完全去除噪声,此时使用非线性滤波的效果可能更好。

非线性滤波主要包含中值滤波和双边滤波。

中值滤波

中值滤波使用滤波器覆盖区域内所有像素值的中位数作为输出,对椒盐噪声具有良好的去除效果。

以滤波器范围内的所有像素值的中值作为输出。由于涉及排序,其处理时间较大。

medianBlur(src, dst, ksize);

ksize为滤波器大小,只能为大于1的奇数
不能用于两通道和五通道及以上的Mat

双边滤波

双边滤波能够在去除噪声的同时保持边缘信息,是一种边缘保持滤波器。

bilateralFilter(src, dst, d, sigaColor, sigmaSpace, borderType);

d为滤波过程中每个像素领域的直径,若为非正数,则由sigmaSpace决定。建议为5
sigmaColor为颜色空间滤波器的标准差值,参数越大,产生的半相等颜色区域越大。
sigmaSpace为空间坐标滤波器的标准差值,参数越大,越远的像素会相互影响。

两个差值小于10时滤波效果弱,大于150时过强。

缺点:性能较差

边缘检测

边缘指像素灰度值突然发生变化的地方,可通过计算图像梯度寻找边缘。

计算得到的梯度可能是正数,也可能是负数。以下给出了求矩阵各元素绝对值的函数:

convertScaleAbs(src, dst, alpha = 1, bats = 0);

alpha为缩放因子,默认参数为1,即不进行缩放
bats为偏值,默认为不添加

Sobel算子

Sobel算子是经典的边缘检测算子,可以检测水平和垂直方向的边缘。

Sobel(src, dst, ddepth, dx, dy, ksize=3, scale=1, delta=0, borderType);

dx为X方向的差分阶数,dy为Y方向的差分阶数
ksize为算子大小,必须为1、3、5、7
scale为缩放因子,delta为偏置
一般情况下,差分阶数为1,ksize为3;阶数为2,ksize为5

Scharr算子

Sobel对图像中较弱的边缘提取效果较差,故需要加宽像素间的差距
Scharr算子对弱边缘的检测效果优于Sobel算子,能够提供更高的检测精度。Scharr滤波器尺寸固定为3*3。

Scharr(src, dst, ddepth, dx, dy, scale, delta, borderType);

Sobeldxdy不能同时为0

生成边缘检测滤波器

可以通过以下函数获得不同尺寸和阶次的Sobel或Scharr滤波器:

getDerivKernels(kx, ky, dx, dy, ksize, normalize, ktype);

kxkydxdy分别为行滤波器的输出矩阵、列滤波器的输出矩阵、X方向的导数阶次、Y方向的导数阶次
ksize为滤波器大小,可选参数为FILTER_SCHARR、1、3、5、7
normalize为归一化
ktype为滤波器系数类型

Laplacian算子(各项同性)

使用Laplacian算子提取边缘可以不分别检测X方向和Y方向,只需要一次边缘检测。Laplacian是一种二阶导数算子,对噪声敏感,故须配合高斯滤波。
L a p l a c i a n ( f ) = ∂ 2 f ∂ x 2 + ∂ 2 f ∂ y 2 Laplacian(f)=\frac{\partial^2 f}{\partial x^2}+\frac{\partial^2 f}{\partial y^2} Laplacian(f)=x22f+y22f

Laplacian(src, dst, ddepth, kssize=1, scale, delta, borderType);

ddepth为输出图像深度,-1为自动设置
ksize必须为正奇数

Canny算法(常用)

Canny边缘检测算法是目前最优秀的边缘检测算法之一,能够识别强边缘和弱边缘,并基于连通性给出完整的边缘信息,抗噪声能力强。

其原理分为五个步骤:

1.使用高斯滤波平滑图像。

2.通过Sobel算子计算各个方向的梯度,随后计算梯度的方向和幅值。

3.应用非极大值抑制算法消除边缘检测带来的杂散影响。

4.应用双阈值法划分强边缘和弱边缘。

5.消除孤立的弱边缘。

Canny(image,edges, threshold1, threshold2, apertureSize=3, L2gradient=false);

image 输入图像,必须是CV_8U的单通道或三通道图像
edges 输出图像
threshold 滞后阈值
apertureSize Sobel算子的直径
L2gradient 计算图像梯度幅值的方法

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

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

相关文章

流媒体基础解析:音视频封装格式与传输协议

在视频处理与传输的完整流程中&#xff0c;音视频封装格式和传输协议扮演着至关重要的角色。它们不仅决定了视频文件的存储方式&#xff0c;还影响着视频在网络上的传输效率和播放体验。今天&#xff0c;我们将深入探讨音视频封装格式和传输协议的相关知识。 音视频封装格式 什…

一个html实现数据库自定义查询

使用场景 应用上线后甲方频繁的找开发查询数据库数据&#xff0c;且没有固定的查询规律&#xff0c;产品经理也没有规划报表需求。 实现方案 后端开放自定义sql查询&#xff0c;屏蔽所有数据库的高危操作&#xff0c;将常用查询的sql放在一个html中的js中直接查询&#xff0…

鸿蒙电脑会在国内逐渐取代windows电脑吗?

点击上方关注 “终端研发部” 设为“星标”&#xff0c;和你一起掌握更多数据库知识 10年内应该不会 用Windows、MacOS操作系统的后果是你的个人信息可能会被美国FBI看到&#xff0c;但绝大多数人的信息FBI没兴趣去看 你用某家公司的电脑系统,那就得做好被某些人监视的下场,相信…

持续领跑中国异地组网路由器市场,贝锐蒲公英再次登顶销量榜首

作为国产远程连接SaaS服务的创领者&#xff0c;贝锐持续引领行业发展&#xff0c;旗下贝锐蒲公英异地组网路由器&#xff0c;凭借出色的技术实力和市场表现&#xff0c;斩获2024年线上电商平台市场销量份额中国第一的佳绩&#xff0c;充分彰显了其在网络解决方案与异地组网领域…

Spring AI 系列3: Promt提示词

一、Promt提示词 Promt提示是引导 AI 模型生成特定输出的输入&#xff0c; 提示的设计和措辞会显著影响模型的响应。 在 Spring AI 中与 AI 模型交互的最低层级&#xff0c;处理提示有点类似于在 Spring MVC 中管理”视图”。 这涉及创建带有动态内容占位符的大段文本。 这些占…

Redis:安装与常用命令

&#x1f308; 个人主页&#xff1a;Zfox_ &#x1f525; 系列专栏&#xff1a;Redis &#x1f525; 安装 Redis 使⽤apt安装 apt install redis -y⽀持远程连接 修改 /etc/redis/redis.conf 修改 bind 127.0.0.1 为 bind 0.0.0.0 修改 protected-mode yes 为 protected-mo…

Mac 芯片系列 安装cocoapod 教程

安装声明&#xff1a; 本人是在搭梯子的环境下安装成功&#xff0c;前提是必须安装好安装homebrew环境。 1.检测rudy的源 2.查看源(目的:检测rudy的源) gem sources - l 3.移除源(目的:移除rudy自带的源) gem sources --remove https://rubygems.org/ 4.更换源(目的:替换成国…

智启未来:AI重构制造业供应链的五大革命性突破

一、需求预测&#xff1a;让供应链“未卜先知” 1.1 从经验判断到数据预言 传统供应链依赖人工分析历史数据&#xff0c;但面对市场波动、设备突发故障等不确定性&#xff0c;往往反应滞后。AI通过整合工业物联网&#xff08;IIoT&#xff09;传感器数据、生产排程、供应商交…

Linux进程间通信----简易进程池实现

进程池的模拟实现 1.进程池的原理&#xff1a; 是什么 进程池是一种多进程编程模式&#xff0c;核心思想是先创建好一定数量的子进程用作当作资源&#xff0c;这些进程可以帮助完成任务并且重复利用&#xff0c;避免频繁的进程的创建和销毁的开销。 下面我们举例子来帮助理…

解锁Java多级缓存:性能飞升的秘密武器

一、引言 文末有彩蛋 在当今高并发、低延迟的应用场景中&#xff0c;传统的单级缓存策略往往难以满足性能需求。随着系统规模扩大&#xff0c;数据访问的瓶颈逐渐显现&#xff0c;如何高效管理缓存成为开发者面临的重大挑战。多级缓存架构应运而生&#xff0c;通过分层缓存设…

(纳芯微)NCA9548- DTSXR 具有复位功能的八通道 I²C 开关、所有I/O端子均可承受5.5V输入电压

深圳市润泽芯电子有限公司 推荐NOVOSENSE(纳芯微)品牌 NCA9548- DTSXR TSSOP-24封装 NCA9548- DTSXR 具有复位功能的八通道 IC 开关、所有I/O端子均可承受5.5V输入电压 产品描述 NCA9548是通过I2C总线控制的八路双向转换开关。 SCL / SDA上行数据分散到八对下行数据或通道。…

013旅游网站设计技术详解:打造一站式旅游服务平台

旅游网站设计技术详解&#xff1a;打造一站式旅游服务平台 在互联网与旅游业深度融合的时代&#xff0c;旅游网站成为人们规划行程、预订服务的重要工具。一个功能完备的旅游网站&#xff0c;通过用户管理、订单管理等核心模块&#xff0c;实现用户与管理员的高效交互。本文将…

2024 CKA模拟系统制作 | Step-By-Step | 12、题目搭建-创建多容器Pod

目录 免费获取题库配套 CKA_v1.31_模拟系统 一、题目 二、考点分析 1. 多容器 Pod 的理解 2. YAML 配置规范 3. 镜像版本控制 三、考点详细讲解 1. 多容器 Pod 的工作原理 2. 容器端口冲突处理 3. 资源隔离机制 四、实验环境搭建步骤 总结 免费获取题库配套 CKA_v…

优化 Spring Boot API 性能:利用 GZIP 压缩处理大型有效载荷

引言 在构建需要处理和传输大量数据的API服务时&#xff0c;响应时间是一个关键的性能指标。一个常见的场景是&#xff0c;即使后端逻辑和数据库查询已得到充分优化&#xff0c;当API端点返回大型数据集&#xff08;例如&#xff0c;数千条记录的列表&#xff09;时&#xff0…

【C盘瘦身】给DevEco Studio中HarmonyOSEmulator(鸿蒙模拟器)换个地方,一键移动给C盘瘦身

文章目录 一、HarmonyOSEmulator的安装路径二、修改路径 一、HarmonyOSEmulator的安装路径 之前安装了华为的DevEco Studio&#xff0c;当时没注意&#xff0c;后来C盘告急&#xff0c;想着估计是鸿蒙的模拟器占用空间比较大&#xff0c;一检查还真是躺在C盘。路径如下&#x…

ORACLE 缺失 OracleDBConsoleorcl服务导致https://xxx:port/em 不能访问

这个原因是&#xff0c;操作过一下 ORCL的服务配置变更导致的。 再PATH中添加个环境变量&#xff0c;路径如下 管理员权限运行cmd 等待创建完成 大概3分钟 查看服务 点击第一个访问&#xff0c;下图登录后的截图

VScode自动添加指定内容

在 VS Code 中&#xff0c;可以通过配置 用户代码片段&#xff08;User Snippets&#xff09; 或使用 文件模板扩展 来实现新建指定文件类型时自动添加指定内容。以下是具体方法&#xff1a; 方法 1&#xff1a;使用 VS Code 内置的「用户代码片段」 适用场景&#xff1a;适用…

Ubuntu 22.04 安装 Nacos 记录

Ubuntu 22.04 安装 Nacos 记录 本文记录了在 Ubuntu 22.04 系统上安装 Nacos 的完整过程&#xff0c;适用于本地测试或生产部署的基础搭建。 一、官方资源 官网下载地址&#xff1a;https://nacos.io/download/nacos-server/官网文档&#xff1a;https://nacos.io/docs/lates…

相机--RGBD相机

教程 分类原理和标定 原理 视频总结 双目相机和RGBD相机原理 作用 RGBD相机RGB相机深度&#xff1b; RGB-D相机同时获取两种核心数据&#xff1a;RGB彩色图像和深度图像&#xff08;Depth Image&#xff09;。 1. RGB彩色图像 数据格式&#xff1a; 标准三通道矩阵&#…

记一次idea中lombok无法使用的解决方案

在注解处理器下&#xff0c;一般 Default 为“启用注解处理”和“从项目类路径获取处理器”&#xff0c;但是我的项目中的为选择“处理器路径”&#xff0c;导致了无法识别lombok&#xff0c;因此&#xff0c;需要改为使用“从项目类路径获取处理器”这个选项。如下图所示&…