opencv滤波技术

2023-09-20 07:57:37


前言

在OpenCV中,有多种滤波技术可以用于图像处理和图像增强。下面我将介绍五种常见的滤波技术,包括均值滤波、中值滤波、高斯滤波、双边滤波和自适应滤波,并提供相应的函数和使用方法。

一、均值滤波

均值滤波(Mean Filtering):
均值滤波是最简单的一种滤波方法,它使用邻域内像素的平均值来替代中心像素的值,从而实现图像平滑。

cv::blur(inputImage, outputImage, cv::Size(ksize, ksize));

inputImage: 输入图像
outputImage: 输出图像
ksize: 滤波器的大小,例如 3x3 或 5x5。

#include <opencv2/opencv.hpp>

int main() {
    cv::Mat srcImage = cv::imread("input.jpg", cv::IMREAD_COLOR);
    
    // 均值滤波
    cv::Mat result;
    cv::blur(srcImage, result, cv::Size(3, 3));
    
    cv::imshow("Result", result);
    cv::waitKey(0);
    
    return 0;
}

二、中值滤波

中值滤波(Median Filtering):
中值滤波通过计算邻域内像素的中位数来替代中心像素的值,从而有效地去除椒盐噪声等离群点。

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

inputImage: 输入图像
outputImage: 输出图像
ksize: 滤波器的大小,必须是正奇数,例如 3、5、7。

#include <opencv2/opencv.hpp>

int main() {
    cv::Mat srcImage = cv::imread("input.jpg", cv::IMREAD_COLOR);
    
    // 中值滤波
    cv::Mat result;
    cv::medianBlur(srcImage, result, 3);
    
    cv::imshow("Result", result);
    cv::waitKey(0);
    
    return 0;
}

三、高斯滤波

高斯滤波(Gaussian Filtering):
高斯滤波是一种线性平滑滤波方法,它根据像素值与其邻域像素值之间的距离加权平均来计算新的像素值。它在平滑图像的同时保留了图像的边缘细节。

cv::GaussianBlur(inputImage, outputImage, cv::Size(ksize, ksize), sigmaX, sigmaY);

inputImage: 输入图像
outputImage: 输出图像
ksize: 滤波器的大小,必须是正奇数,例如 3、5、7。
sigmaX 和 sigmaY: X 和 Y 方向上的标准差,控制滤波器的形状。

#include <opencv2/opencv.hpp>

int main() {
    cv::Mat srcImage = cv::imread("input.jpg", cv::IMREAD_COLOR);
    
    // 高斯滤波
    cv::Mat result;
    cv::GaussianBlur(srcImage, result, cv::Size(3, 3), 0);
    
    cv::imshow("Result", result);
    cv::waitKey(0);
    
    return 0;
}

四、双边滤波

双边滤波(Bilateral Filtering):
双边滤波是一种非线性滤波方法,它在平滑图像的同时保留了边缘信息。它不仅考虑了空间距离上的相似性,还考虑了像素值相似性。

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

inputImage: 输入图像
outputImage: 输出图像
d: 双边滤波器的邻域直径,通常为 5。
sigmaColor: 像素值空间的标准差,用于控制颜色相似性度量。
sigmaSpace: 空间距离的标准差,用于控制空间相似性度量。

#include <opencv2/opencv.hpp>

int main() {
    cv::Mat srcImage = cv::imread("input.jpg", cv::IMREAD_COLOR);
    
    // 双边滤波
    cv::Mat result;
    cv::bilateralFilter(srcImage, result, 9, 75, 75);
    
    cv::imshow("Result", result);
    cv::waitKey(0);
    
    return 0;
}

五、自适应滤波

自适应滤波(Adaptive Filtering):
自适应滤波根据邻域像素的统计信息动态调整滤波器的权重,以适应不同区域的图像特性。

cv::adaptiveBilateralFilter(inputImage, outputImage, cv::Size(ksize, ksize), sigmaSpace);

inputImage: 输入图像
outputImage: 输出图像
ksize: 滤波器的大小,必须为正奇数。
sigmaSpace: 空间距离的标准差,用于控制滤波器的自适应性。

#include <opencv2/opencv.hpp>

int main() {
    cv::Mat srcImage = cv::imread("input.jpg", cv::IMREAD_COLOR);
    
    // 自适应滤波
    cv::Mat result;
    cv::adaptiveBilateralFilter(srcImage, result, cv::Size(3, 3), 75);
    
    cv::imshow("Result", result);
    cv::waitKey(0);
    
    return 0;
}

六、滤波器大小

滤波器大小是指滤波器的尺寸或窗口大小,它是应用于图像上的局部区域进行滤波操作的参数。滤波器大小的选择对于滤波效果和计算性能都有重要的影响。

滤波器大小的作用有以下几个方面:

1.平滑程度:较大的滤波器大小可以产生更平滑的图像,因为它涉及到更广泛的像素区域。当滤波器大小增加时,平滑效果会增强,图像中的细节和噪声也会被更多地模糊或平滑掉。因此,如果需要更强的平滑效果,可以选择较大的滤波器大小。

2.边缘保留:较小的滤波器大小可以更好地保留图像的边缘信息。这是因为较小的滤波器仅涉及局部像素区域,能够更好地捕捉细节和边缘。如果你希望在平滑图像的同时保留边缘信息,可以选择较小的滤波器大小。

3.计算复杂度:较大的滤波器大小需要处理更多的像素,因此计算复杂度会增加。在实时应用或对计算资源要求较高的情况下,选择较小的滤波器大小可以降低计算成本。

总结

本篇文章主要讲解了opencv中的滤波技术,大家可以尝试使用滤波技术来处理图片。

更多推荐

数据分析实战│价格预测挑战【文末赠书】

文本分析是指对文本信息的表示及特征项的选取,商品文本的描述能够反映特定立场、观点、价值和利益。考虑到网上海量的商品数量,对产品的定价难度很大,因此可以使用商品描述帮助商户定价。比如,服装具有较强的季节性价格趋势,受品牌影响很大,而电子产品则根据产品规格波动。因此,根据商品提供的文本信息进行合理地定价,能够有效地帮助商家

第32节——useReducer——了解

一、概念useReducer是在reactV16.8推出的钩子函数,从用法层面来说是可以代替useState。众所周知,useState常用在单个组件中进行状态管理,但是遇到状态全局管理的时候,useState显然不能满足我们的需求,这个时候大多数的做法是利用第三方的状态管理工具,像redux,Recoil或者Mobx

IPO解读丨Arm破解市场质疑的答案,仍在AI中?

时隔7年,移动设备芯片领域霸主Arm重回二级市场。IPO进程的推进,让这家全球芯片行业的基石公司,不得不面对来自市场的全方位的密集审视。而从股价来看,投资者对于Arm的态度始终处于摇摆中,从上市首日股价大涨25%,到截至发稿前的三个交易日股价累计下跌12.5%,可以看出,Arm在二级市场面临一定质疑。但不可否认Arm在

ChatGPT技术原理

Task03ChatGPT技术原理目录阶段一:有监督微调Supervisedfine-tuning(SFT)阶段二:训练回报模型(RewardModel,RM)阶段三:使用强化学习微调SFT模型ChatGPT是由GPT-3迭代来的,原有的GPT-3可能难以从文本中学会一些更高层次的表示,这就导致了GPT-3这样的语言模

指针和数组笔试题深度解析

学习之前我们将运用到sizeof和strlen函数sizeof和strlen函数认识和区别:1.strlen是一个库函数使用时需要引用#include<string.h>这个头文件,而sizeof是一个运算符号;2.strlen计算的是'\0'之前的字符个数,sizefo计算的是所占空间内存的大小,单位是字节;3.st

【系统架构】什么是集群?为什么要使用集群架构?

什么是集群?为什么要使用集群架构?1.什么是集群?2.为什么要使用集群?2.1高性能2.2价格有效性2.3可伸缩性2.4高可用性2.5透明性2.6可管理性2.7可编程性3.集群的常见分类3.1负载均衡集群3.2高可用性集群3.3高性能计算集群3.4网格计算集群4.常用的集群软硬件介绍及选型4.1企业中常见的集群软硬件产

JSON注解和异常处理的使用

一、JSON数据返回1.1.前言JSON是一种轻量级的数据交换格式,易于阅读和编写,同时也易于机器解析和生成。JSON的常用场景包括:前后端分离的项目中,后端向前端传送数据时。Ajax异步访问数据。RPC远程调用。除了JSON,还有其他的数据传输格式,如XML等。但是由于XML格式的特点,它在Web开发中使用较少。1.

【K8S系列】深入解析k8s网络插件—Canal

序言做一件事并不难,难的是在于坚持。坚持一下也不难,难的是坚持到底。文章标记颜色说明:黄色:重要标题红色:用来标记结论绿色:用来标记论点蓝色:用来标记论点在现代容器化应用程序的世界中,容器编排平台Kubernetes已经成为标准。Kubernetes是一个分布式系统,为了支持复杂的应用和微服务架构,网络是Kuberne

汽车充电桩浪涌保护器的应用方案和作用

随着电动汽车的普及,充电桩的建设也越来越多,但是充电桩也面临着雷电等自然灾害的威胁,如果没有有效的防雷措施,可能会造成充电桩的损坏,甚至引发火灾、爆炸等严重后果。因此,为了保证充电桩的安全运行,需要在充电桩中安装浪涌保护器,以减少雷电对充电桩的影响。浪涌保护器是一种用于限制瞬态过电压和泄放电涌电流的电子装置,它可以在雷

汽车电子相关术语

SOASOA(Service-OrientedArchitecture,面向服务的架构)是一种在计算机环境中设计、开发、部署和管理离散模型的方法。是由Garnter1996年提出的概念,将应用程序的不同功能单元(称为服务)进行拆分,并通过这些服务之间定义良好的接口和协议联系起来。接口是采用中立的方式进行定义的,目的是为

.Net Core中Host的作用和用法

Host简介在ASP.NETCore中,Host是一个托管应用程序的宿主环境。它提供了一种统一的方式来启动和运行应用程序,无论是在开发环境中还是在生产环境中。Host负责处理应用程序的生命周期、配置和依赖项管理等任务,使开发人员能够专注于应用程序的业务逻辑。Host是通过使用IHostBuilder接口和Host.Cr

热文推荐