opencv图像卷积操作和常用的图像滤波函数

news2025/2/25 18:12:38

文章目录

      • opencv图像卷积操作原理,opencv中常用的图像滤波函数
      • 一、图像卷积操作原理:
        • 1、卷积操作原理图:
      • 二、opencv常用的图像滤波函数:这些函数的主要作用是对图像进行平滑处理或去除噪声(核心目的是减少图像中的噪声,使图像变得更加平滑);
        • 1、cv::blur()函数:英文全拼blur
          • (1)函数原型:
          • (2)代码示例:
        • 2、cv::boxFilter()函数:
          • (1)函数原型:
          • (2)cv.blur() 均值滤波器与cv.boxFilter() 方框滤波器的区别:
            • 核的定义:
            • 参数不同:
            • 功能略有差异:
            • 总结:
          • (3)代码示例:
        • 3、cv::GuassianBlur()函数:
          • (1)函数原型:
          • (2)代码示例:
        • 4、cv::medianBlur()函数:
          • (1)函数原型:
          • (2)代码示例:
        • 5、cv::bilateralFilter()函数:
          • (1)函数原型:
          • (2)代码示例:
        • 6、cv2::filter2D()函数:
          • (1)函数原型:
          • (2)代码示例:

opencv图像卷积操作原理,opencv中常用的图像滤波函数

一、图像卷积操作原理:

卷积是图像处理中常用的操作之一,它通过在图像上滑动一个滤波器(也称为卷积核)来实现对图像的处理,每个滤波器(卷积核)都是一个小的矩阵,它包含一组权重值;

1、卷积操作原理图:
  • 将滤波器(卷积核)与图像的一个小区域相乘;
  • 将得到的乘积相加,得到一个新的像素值;
  • 通过不断滑动滤波器(卷积核),对整幅图像进行处理,从而得到一幅经过卷积操作的图像;
    在这里插入图片描述
    计算过程图:
    在这里插入图片描述

二、opencv常用的图像滤波函数:这些函数的主要作用是对图像进行平滑处理或去除噪声(核心目的是减少图像中的噪声,使图像变得更加平滑);

1、cv::blur()函数:英文全拼blur

均值滤波器(平均滤波器),用于图像模糊(平滑)处理的函数,它将图像中的每个像素值替换为其周围像素值的平均值,从而实现图像的模糊效果;

(1)函数原型:
void cv::blur(
	InputArray src, 
	OutputArray dst, 
	Size ksize, 
	Point anchor = Point(-1,-1), 
	int borderType = BORDER_DEFAULT
);

参数解释:
src:输入图像,可以是单通道或多通道图像(如灰度图或彩色图);
dst:输出图像;
ksize:卷积核,用cv::Size(width, height)来指定,例如(3,3)表示一个3x3的卷积核,通常使用奇数大小的核;
anchor:锚点,默认为卷积核的中心,默认值Point(-1, -1);
borderType:图像边缘处的像素填充方式(
	cv::BORDER_CONSTANT:在图像边缘处的像素,用常数填充,这个常数由cv::Scalar()函数指定,默认为黑色;
	cv::BORDER_REPLICATE:在图像边缘处的像素,用最边界的像素值来填充;
	cv::BORDER_DEFAULT:根据具体情况选择最合适的边界处理方式,默认值;
)
(2)代码示例:
#include <opencv2\opencv.hpp>
#include <iostream>
#include <demo.h>

using namespace cv;
using namespace std;

int main() {

	// 读取彩色图像
	cv::Mat image = cv::imread("C:\\cpp\\image\\suzy1.jpg");

	if (image.empty()) {
		std::cerr << "Error: 无法读取图像文件." << std::endl;
		return -1;
	}

	cv::Mat outputImage;
	cv::Size kernelSize(5, 5);

	cv::blur(image, outputImage, kernelSize);

	cv::imshow("Input Image", image);
	cv::imshow("Blurred Image", outputImage);

	cv::waitKey(0);
	return 0;

}

运行结果:
在这里插入图片描述

2、cv::boxFilter()函数:

方框滤波器(均值滤波器的一种变体),方框滤波器与均值滤波器类似,通过计算图像中每个像素周围邻域像素的加权平均值来减少噪声,但相比 cv::blur()cv::boxFilter()可以指定不同的归一化方式;

(1)函数原型:
void cv::boxFilter(
    cv::InputArray src,
    cv::OutputArray dst,
    int ddepth,
    cv::Size ksize,
    cv::Point anchor = cv::Point(-1,-1),
    bool normalize = true,
    int borderType = cv::BORDER_DEFAULT
);

参数解释:
src:输入图像,可以是单通道或多通道图像(如灰度图或彩色图);
dst:输出图像,与输入图像具有相同的尺寸和通道数;
ddepth:输出图像的深度,通常使用-1表示与输入相同;
ksize:卷积核,用cv::Size(width, height)来指定,例如(3,3)表示一个3x3的卷积核,通常使用奇数大小的核;
anchor:锚点,默认为卷积核的中心,默认值Point(-1, -1);
normalize:是否对结果进行归一化,默认为true;
borderType:图像边缘处的像素填充方式(
	cv::BORDER_CONSTANT:在图像边缘处的像素,用常数填充,这个常数由cv::Scalar()函数指定,默认为黑色;
	cv::BORDER_REPLICATE:在图像边缘处的像素,用最边界的像素值来填充;
	cv::BORDER_DEFAULT:根据具体情况选择最合适的边界处理方式,默认值;
)
(2)cv.blur() 均值滤波器与cv.boxFilter() 方框滤波器的区别:

cv::blur()cv::boxFilter() 都是用于图像平滑处理的滤波器,它们的核心目的是减少图像中的噪声,使图像变得更加平滑;

核的定义:
  • cv::blur() 的核是一个归一化的平均核,也就是说核内所有元素的和为1(这表示在滤波过程中,像素值被取平均值);
  • cv::boxFilter() 的核不一定是归一化的,可以通过 normalize 参数控制是否归一化(这使得方框滤波器可以对像素进行加权平均);
参数不同:
  • cv::blur() 接受一个 cv::Size 参数作为核的大小,通常使用奇数大小的核;
  • cv::boxFilter() 接受一个整数参数作为核的大小,可以使用偶数大小的核;
功能略有差异:
  • 由于 cv::boxFilter() 可以选择是否归一化,因此它可以用于一些特殊情况下的平滑处理,比如图像锐化;
  • cv::blur() 更适合通用的平滑处理;
总结:

总的来说,这两个函数都可以用于图像平滑处理,选择使用哪个取决于你的具体需求以及想要实现的效果,如果你只是需要一个简单的平滑处理,通常使用 cv::blur() 就足够了,如果你需要更多的控制,或者想要尝试一些特殊的滤波效果,可以考虑使用 cv::boxFilter()

(3)代码示例:
#include <opencv2\opencv.hpp>
#include <iostream>
#include <demo.h>

using namespace cv;
using namespace std;

int main() {

	// 读取彩色图像
	cv::Mat image = cv::imread("C:\\cpp\\image\\suzy1.jpg");

	if (image.empty()) {
		std::cerr << "Error: 无法读取图像文件." << std::endl;
		return -1;
	}

	cv::Mat outputImage;
	cv::Size kernelSize(5, 5);

	cv::boxFilter(image, outputImage, -1, kernelSize);

	cv::imshow("Input Image", image);
	cv::imshow("Box Filtered Image", outputImage);

	cv::waitKey(0);
	return 0;

}

运行结果:
在这里插入图片描述

3、cv::GuassianBlur()函数:

高斯滤波器,对输入图像中的每个像素施加一个高斯函数作为权重,从而实现平滑处理,通过应用高斯滤波器来减少图像中的噪声,会较明显地模糊边缘;

(1)函数原型:
void cv::GaussianBlur(
    cv::InputArray src,  
    cv::OutputArray dst,  
    cv::Size ksize,  
    double sigmaX,  
    double sigmaY = 0,   
    int borderType = cv::BORDER_DEFAULT
);

参数解释:
src:输入图像,可以是单通道或多通道图像(如灰度图或彩色图);
dst:输出图像,与输入图像具有相同的尺寸和通道数;
ksize:卷积核,用cv::Size(width, height)来指定,例如(3,3)表示一个3x3的卷积核,通常使用奇数大小的核;
sigmaX:X方向的高斯核标准差;
sigmaY:Y方向的高斯核标准差,如果为零则默认与sigmaX相同;
borderType:图像边缘处的像素填充方式(
	cv::BORDER_CONSTANT:在图像边缘处的像素,用常数填充,这个常数由cv::Scalar()函数指定,默认为黑色;
	cv::BORDER_REPLICATE:在图像边缘处的像素,用最边界的像素值来填充;
	cv::BORDER_DEFAULT:根据具体情况选择最合适的边界处理方式,默认值;
)
(2)代码示例:
#include <opencv2\opencv.hpp>
#include <iostream>
#include <demo.h>

using namespace cv;
using namespace std;

int main() {

	// 读取彩色图像
	cv::Mat inputImage = cv::imread("C:\\cpp\\image\\suzy1.jpg");

	if (inputImage.empty()) {
		std::cerr << "Error: 无法读取图像文件." << std::endl;
		return -1;
	}

	cv::Mat outputImage;
	cv::Size kernelSize(5, 5);
	double sigmaX = 1.5;

	cv::GaussianBlur(inputImage, outputImage, kernelSize, sigmaX);

	cv::imshow("Input Image", inputImage);
	cv::imshow("Gaussian Blurred Image", outputImage);

	cv::waitKey(0);
	return 0;

}

运行结果:
在这里插入图片描述

4、cv::medianBlur()函数:

中值滤波器,对输入图像进行平滑处理,通过用邻域像素的中值来替代当前像素的值,从而减少图像中的噪声,是一种常用于去除图像中的椒盐噪声(salt-and-pepper noise)的非线性滤波器;

(1)函数原型:
void cv::medianBlur(
    cv::InputArray src,         
    cv::OutputArray dst,        
    int ksize                   
);

参数解释:
src:输入图像,可以是单通道或多通道图像(如灰度图或彩色图);
dst:输出图像,与输入图像具有相同的尺寸和通道数;
ksize:卷积核,通常为奇数,用cv::Size(width, height)来指定,通常使用奇数大小的核;

(2)代码示例:
#include <opencv2\opencv.hpp>
#include <iostream>
#include <demo.h>

using namespace cv;
using namespace std;

int main() {

	// 读取彩色图像
	cv::Mat inputImage = cv::imread("C:\\cpp\\image\\suzy1.jpg");

	if (inputImage.empty()) {
		std::cerr << "Error: 无法读取图像文件." << std::endl;
		return -1;
	}


	cv::Mat outputImage;
	int kernelSize = 5; // 选择一个奇数大小的核

	cv::medianBlur(inputImage, outputImage, kernelSize);

	cv::imshow("Input Image", inputImage);
	cv::imshow("Median Blurred Image", outputImage);

	cv::waitKey(0);
	return 0;

}


运行结果:
在这里插入图片描述

5、cv::bilateralFilter()函数:

双边滤波器,双边滤波器顾名思义比高斯滤波多了一个高斯方差sigma-d,所以在边缘附近,离的较远的像素不会太多影响到边缘上的像素值,这样就保证了边缘附近像素值的保存;

(1)函数原型:
void cv::bilateralFilter(
    cv::InputArray src,         
    cv::OutputArray dst,        
    int d,                      
    double sigmaColor,          
    double sigmaSpace,         
    int borderType = cv::BORDER_DEFAULT  
);

参数解释:

src:输入图像,可以是单通道或多通道图像(如灰度图或彩色图);
dst:输出图像,与输入图像具有相同的尺寸和通道数;
d:控制在颜色空间中滤波器的直径,通常在3-5之间;
sigmaColor:控制颜色相似性的标准差,值越大,颜色差异越大;
sigmaSpace:控制空间相似性的标准差,值越大,范围内像素权重越大;
borderType:图像边缘处的像素填充方式(
	cv::BORDER_CONSTANT:在图像边缘处的像素,用常数填充,这个常数由cv::Scalar()函数指定,默认为黑色;
	cv::BORDER_REPLICATE:在图像边缘处的像素,用最边界的像素值来填充;
	cv::BORDER_DEFAULT:根据具体情况选择最合适的边界处理方式,默认值;
)
(2)代码示例:
#include <opencv2\opencv.hpp>
#include <iostream>
#include <demo.h>

using namespace cv;
using namespace std;

int main() {

	// 读取彩色图像
	cv::Mat inputImage = cv::imread("C:\\cpp\\image\\suzy1.jpg");

	if (inputImage.empty()) {
		std::cerr << "Error: 无法读取图像文件." << std::endl;
		return -1;
	}

	cv::Mat outputImage;

	int d = 9; // 直径
	double sigmaColor = 75; // 颜色相似性标准差
	double sigmaSpace = 75; // 空间相似性标准差

	cv::bilateralFilter(inputImage, outputImage, d, sigmaColor, sigmaSpace);

	cv::imshow("Input Image", inputImage);
	cv::imshow("Bilateral Filtered Image", outputImage);

	cv::waitKey(0);
	return 0;

}


运行结果:
在这里插入图片描述

6、cv2::filter2D()函数:

对输入图像进行二维卷积操作,通过将一个核应用于图像的每个像素,从而实现特定的图像处理效果,如边缘检测、模糊等;

(1)函数原型:
void cv::filter2D(
    cv::InputArray src,       
    cv::OutputArray dst,  
    int ddepth,          
    cv::InputArray kernel,  
    cv::Point anchor = cv::Point(-1,-1),
    double delta = 0,   
    int borderType = cv::BORDER_DEFAULT  
);

参数解释:
src:输入图像,可以是单通道或多通道图像(如灰度图或彩色图);
dst:输出图像,与输入图像具有相同的尺寸和通道数;
ddepth:输出图像的深度,通常使用-1表示与输入相同;
kernel:卷积核,用于定义卷积操作的权重矩阵;
anchor:锚点,默认为卷积核的中心,默认值Point(-1, -1);
delta:可选参数,用于调节卷积结果的偏移值,默认为0;
borderType:图像边缘处的像素填充方式(
	cv::BORDER_CONSTANT:在图像边缘处的像素,用常数填充,这个常数由cv::Scalar()函数指定,默认为黑色;
	cv::BORDER_REPLICATE:在图像边缘处的像素,用最边界的像素值来填充;
	cv::BORDER_DEFAULT:根据具体情况选择最合适的边界处理方式,默认值;
)

(2)代码示例:
#include <opencv2\opencv.hpp>
#include <iostream>
#include <demo.h>

using namespace cv;
using namespace std;

int main() {

	// 读取彩色图像
	cv::Mat inputImage = cv::imread("C:\\cpp\\image\\suzy1.jpg");

	if (inputImage.empty()) {
		std::cerr << "Error: 无法读取图像文件." << std::endl;
		return -1;
	}

	cv::Mat kernel = (cv::Mat_<float>(3, 3) <<
		0, -1, 0,
		-1, 5, -1,
		0, -1, 0);

	cv::Mat outputImage;
	cv::filter2D(inputImage, outputImage, -1, kernel);

	cv::imshow("Input Image", inputImage);
	cv::imshow("Filtered Image", outputImage);

	cv::waitKey(0);
	return 0;

}

运行结果:
在这里插入图片描述

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

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

相关文章

PG14归档失败解决办法archiver failed on wal_lsn

问题描述 昨晚RepmgrPG14主备主库因wal日志撑爆磁盘&#xff0c;删除主库过期wal文件重做备库后上午进行主备状态巡查&#xff0c;主库向备库发送wal文件正常&#xff0c;但是查主库状态时发现显示有1条归档失败的记录。 postgres: archiver failed on 000000010000006F000000…

spring自动装配byType和@Autowired依赖注入源码分析(史上最详细的Spring源码分析系列一)

写在前面&#xff1a;阅读spring源码需要读者对Java反射和动态代理有一定了解。关于这部分内容&#xff0c;可以参考这篇博客&#xff1a;Spring源码分析准备工作及java知识补充 一、Spring依赖注入的方式 关于spring的依赖注入&#xff0c;可以参考官方文档&#xff1a;Spring…

分享一下公众号怎么添加在线挂号功能

公众号添加在线挂号功能 一、准备阶段 在开始之前&#xff0c;你需要了解公众号在线挂号的基本流程和需求。在线挂号需要实现以下功能&#xff1a;患者可以通过公众号预约挂号、填写个人信息、选择医生和时间等。在公众号上添加在线挂号功能&#xff0c;需要结合医疗资源、时…

android 与 flutter 之间的通信

文章目录 前言集成 flutter 混合开发android 与 flutter 之间的通信总结 一、前言 因为flutter 具有跨平台的属性&#xff0c;既可以在android上跑&#xff0c;也能在ios 上跑&#xff0c;所以为了节约开发的成本&#xff0c;减少人力&#xff0c;势必就会用到它。然而已有的…

跨语言深入探讨如何实现方法增强:Java Go的多策略实现

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

YB4014是可以对单节磷酸铁锂电池进行恒流/恒压充电管理的集成电路。

概述&#xff1a; YB4014是可以对单节磷酸铁锂电池进行恒流/恒 压充电管理的集成电路。该器件内部包括功率晶 体管&#xff0c;不需要外部的电流检测电阻和阻流二极管 YB4014只需要极少的外围元器件&#xff0c;非常适合于 便携式应用的领域。热调制电路可以在器件的功 耗比较大…

基于SSM的在线教育平台的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

用获取手机号归属地详情,精准高效的API接口服务为标题

获取企业联系人网站API接口是一种非常有用的工具&#xff0c;它可以帮助我们快速获取企业的联系人信息。在这篇博文中&#xff0c;我们将介绍如何使用这个API接口&#xff0c;并讲解其原理和功能。 一、什么是API接口&#xff1f; API是“应用程序编程接口”的缩写&#xff0c…

瑞芯微RK3568核心板在边缘服务器产品中的应用-迅为电子

迅为RK3568核心板在边缘服务器产品中可以发挥关键作用&#xff0c;为边缘计算应用提供高性能的计算和多媒体处理能力。边缘服务器通常用于处理和存储数据&#xff0c;执行本地计算任务&#xff0c;并支持与远程云服务的通信。以下是RK3568核心板在边缘服务器产品中的应用方案&a…

Red Giant Trapcode Suite 红巨星粒子插件

Red Giant Trapcode Suite是一款用于在After Effects中模拟和建模3D粒子和效果的软件&#xff0c;由Red Giant Software公司开发。 该软件包包含11种不同的工具&#xff0c;可以帮助用户模拟火、水、烟、雪等粒子效果&#xff0c;以及创建有机视觉效果和3D元素。它还支持在AE与…

【mysql】 bash: mysql: command not found

在linux 服务器上安装了mysql 也可以正常运行。 但是执行命令&#xff0c;系统提示&#xff1a;bash: mysql: command not found bash:mysql:找不到命令 执行的命令是&#xff1a; mysql -u root -h 127.0.0.1 -p由于系统默认会查找的 /usr/bin/ 中下的命令&#xff0c;如…

Mysql8在Windows上离线安装时忘记root密码

场景 Mysql在Windows上离线安装与配置&#xff1a; Mysql在Windows上离线安装与配置_mysql 离线包 配置 及 自动启动 windows_霸道流氓气质的博客-CSDN博客 基于以上离线安装Msyql后&#xff0c;服务器重新做了系统&#xff0c;但是没有格式化磁盘或者说从 别的服务器将安装…

Jetson Orin NX 开发指南(9): MAVROS 的安装与配置

一、前言 由于 Jetson 系列开发板常作为自主无人机的机载电脑&#xff0c;而无人机硬件平台如 PX4 和 ArduPilot 等通过 MAVLink 进行发布无人机状态和位姿等信息&#xff0c;要实现机载电脑与 MAVLink 的通信&#xff0c;必须借助 Mavros 功能包&#xff0c;因此&#xff0c;…

二叉树的直径

题目链接 二叉树的直径 题目描述 注意点 二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 解答思路 最长路径可能经过也可能不经过根节点 root &#xff0c;在遍历至任意节点时&#xff0c;需要找到其左右子树对应的路径&#xff0c;两棵子树的路径之和就是经过该…

严格按照1.5到3倍来设置虚拟内存大小是不科学的,最好通过性能监视器

虚拟内存是一种通过使用硬件和软件来实现的存储器管理技术。它使应用程序认为它有一个连续的可用存储空间或地址空间。然而&#xff0c;事实上&#xff0c;虚拟内存通常被划分为几个物理内存片段&#xff0c;其中一些存储在外部磁盘存储器上&#xff0c;可以在需要时用于交换数…

初学者必看,前端 Debugger 调试学习

1.文章简介&#xff1a; 报错和Bug&#xff0c;是贯穿程序员整个编程生涯中&#xff0c;无法回避的问题。而调试&#xff0c;就是帮助程序员定位问题、解决问题的重要手段&#xff0c;因此调试是每个程序员必备技能。 调试本身可分为两个过程: 定位问题 和 解决问题&#xff0…

[开源]多功能、高效率、低代码的前后端一体化、智能化的开发工具

一、开源项目简介 多功能、高效率、低代码的前后端一体化、智能化的开发工具 mdp-sys-ui-web旨在为企业开发管理类的业务系统提供一个模板工程&#xff0c;该模板工程具有高效率、低代码、功能丰富等特点。企业可以在该工程之上&#xff0c;加入更多其它业务功能&#xff1b;也…

VScode Invoke-Expression: 无法将参数绑定到参数“Command”,因为该参数为空字符串

打开vscode时发生错误&#xff1a;Invoke-Expression : 无法将参数绑定到参数“Command”&#xff0c;因为该参数为空字符串。 解决办法&#xff1a;在anaconda prompt base中输入&#xff1a; conda upgrade -n base -c defaults --override-channels conda

【MultiOTP】Docker安裝MultiOTP, 让Windows登入更安全(MFA)

序 在当前数字时代&#xff0c;网络安全成为了一个非常重要的话题。随着越来越多的人和组织依赖于计算机系统来进行工作和存储敏感信息&#xff0c;确保身份验证安全变得至关重要。双因素身份验证&#xff08;2FA&#xff09;是一种强大的安全措施&#xff0c;可在传统的用户名…

UDP通信:快速入门

UDP协议通信模型演示 UDP API DatagramPacket&#xff1a;数据包对象&#xff08;韭菜盘子&#xff09; public DatagramPacket(byte[] buf, int length, InetAddress address, int port)创建发送端数据包对象 buf&#xff1a;要发送的内容&#xff0c;字节数组 length&…