博客
关于我
opencv之模糊处理
阅读量:800 次
发布时间:2023-02-23

本文共 3217 字,大约阅读时间需要 10 分钟。

OpenCV 滤波方法实用指南

在学习 OpenCV 开发过程中,开发者常常会遇到滤波操作的困惑,不知道该使用哪种滤波方法。表面上看,OpenCV 提供了众多滤波函数,实则是对不同滤波方法应用场景的认知问题。以下将从应用场景和项目需求出发,分析常见的 OpenCV 滤波方法及其适用场景。


一:模糊函数 (blur)

参数说明

  • InputArray:输入图像 Mat 对象
  • OutputArray:模糊后输出的 Mat 对象
  • Size:卷积核大小,决定模糊程度,需为奇数
  • Point:卷积核中心位置,默认为 (-1, -1)
  • 边缘处理方法:默认值为 4

示例代码

#include 
#include
int main() { cv::Mat m1 = cv::imread("D:/640.jpg", 4); cv::Mat m2; cv::namedWindow("windows", CV_WINDOW_AUTOSIZE); cv::imshow("windows", m1); cv::blur(m1, m2, cv::Size(5,5), cv::Point(-1,-1), 4); cv::namedWindow("windows1", CV_WINDOW_AUTOSIZE); cv::imshow("windows1", m2); cv::waitKey(0); return 0;}

应用场景

模糊函数主要用于去除图像噪声,常用于边缘提取和特征提取前的预处理。通过设置较小的卷积核(如 3x3),可以有效去除干扰和噪声。


二:高斯模糊函数 (GaussianBlur)

参数说明

  • InputArray:输入图像 Mat 对象
  • OutputArray:模糊后输出的 Mat 对象
  • Size:卷积核大小,需为奇数
  • SigmaX:高斯方差,根据 Size 计算
  • SigmaY:高斯方差,根据 SigmaX 计算
  • 边缘处理方法:默认值为 4

示例代码

#include 
#include
int main() { cv::Mat m1 = cv::imread("D:/640.jpg", 4); cv::Mat m2; cv::namedWindow("windows", CV_WINDOW_AUTOSIZE); cv::imshow("windows", m1); cv::GaussianBlur(m1, m2, cv::Size(5,5), 0, 0); cv::namedWindow("windows1", CV_WINDOW_AUTOSIZE); cv::imshow("windows1", m2); cv::waitKey(0); return 0;}

应用场景

高斯模糊常用于去除随机噪声,作为 Canny 边缘检测的第一步,能有效减少噪声干扰。


三:中值滤波函数 (medianBlur)

参数说明

  • InputArray:输入图像 Mat 对象
  • OutputArray:滤波后输出的 Mat 对象
  • ksize:卷积核大小,需为大于 1 的奇数(如 3、5、7)

示例代码

#include 
#include
int main() { cv::Mat m1 = cv::imread("D:/640.jpg", 4); cv::Mat m2; cv::namedWindow("windows", CV_WINDOW_AUTOSIZE); cv::imshow("windows", m1); cv::medianBlur(m1, m2, 5); cv::namedWindow("windows1", CV_WINDOW_AUTOSIZE); cv::imshow("windows1", m2); cv::waitKey(0); return 0;}

应用场景

中值滤波适用于去除椒盐噪声,通过取像素中值来平衡图像亮度,效果在去噪方面表现优异。


四:双边模糊函数 (bilateralFilter)

参数说明

  • InputArray:输入图像 Mat 对象
  • OutputArray:滤波后输出的 Mat 对象
  • d:中心到周围像素距离
  • sigmaColor:颜色标准方差
  • sigmaSpace:空间标准方差
  • borderType:边缘处理方式

示例代码

#include 
#include
int main() { cv::Mat m1 = cv::imread("D:/640.jpg", 4); cv::Mat m2; cv::namedWindow("windows", CV_WINDOW_AUTOSIZE); cv::imshow("windows", m1); cv::bilateralFilter(m1, m2, 15, 120, 10, 4); cv::namedWindow("windows1", CV_WINDOW_AUTOSIZE); cv::imshow("windows1", m2); cv::waitKey(0); return 0;}

应用场景

双边模糊常用于图像美化,特别是高斯磨皮算法中,通过平滑图像细节并保留边缘信息,效果显著。


五:滤波函数 (filter2D)

参数说明

  • InputArray:输入图像 Mat 对象
  • OutputArray:滤波后输出的 Mat 对象
  • d:输出图像深度
  • kernel:自定义卷积核
  • Point:卷积核中心位置
  • delta:卷积处理后的值调整常量
  • borderType:边缘像素处理方式

示例代码

#include 
#include
int main() { cv::Mat m1 = cv::imread("D:/640.jpg", 4); cv::Mat m2; cv::namedWindow("windows", CV_WINDOW_AUTOSIZE); cv::imshow("windows", m1); int ksize = 15; cv::Mat kernel = cv::Mat_
(3, 3) << -1, -1, -1, -1, 8, -1, -1, -1, -1; cv::filter2D(m1, m2, -1, kernel, cv::Point(-1, -1), 0.0, 4); cv::namedWindow("windows1", CV_WINDOW_AUTOSIZE); cv::imshow("windows1", m2); cv::waitKey(0); return 0;}

应用场景

filter2D 函数非常灵活,支持自定义卷积核,适用于模糊、锐化、边缘提取等多种操作。通过定义不同卷积核,可以实现多种滤波效果。


总结

OpenCV 提供了五种主要的滤波函数,每种函数适用于不同的场景。掌握这些滤波方法及其应用场景,是 OpenCV 开发的关键能力。

转载地址:http://ersfk.baihongyu.com/

你可能感兴趣的文章
Objective-C实现获取文件头的50个字符(附完整源码)
查看>>
Objective-C实现随机图生成器算法(附完整源码)
查看>>
OJ中常见的一种presentation error解决方法
查看>>
OK335xS UART device registe hacking
查看>>
ok6410内存初始化
查看>>
OKR为什么到今天才突然火了?
查看>>
ollama本地部署DeepSeek(Window图文说明)
查看>>
onCreate()方法中的参数Bundle savedInstanceState 的意义用法
查看>>
one_day_one--mkdir
查看>>
ONI文件生成与读取
查看>>
oobbs开发手记
查看>>
OpenCV 中的图像转换
查看>>
opencv&Python——多种边缘检测
查看>>
OpenCV-Python接口、cv和cv2的性能比较
查看>>
opencv26-模板匹配
查看>>
OpenCV3 install tutorial for Mac
查看>>
opencv32-基于距离变换和分水岭的图像分割
查看>>
opencv4-图像操作
查看>>
opencv5-图像混合
查看>>
opencv9-膨胀和腐蚀
查看>>