博客
关于我
opencv之模糊处理
阅读量:791 次
发布时间: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/

你可能感兴趣的文章
opencv17-laplance算子
查看>>
opencv18-canny检测算法
查看>>
opencv19-霍夫直线变化
查看>>
opencv2-矩阵掩膜操作
查看>>
opencv20-霍夫圆检测
查看>>
opencv21-像素重映射
查看>>
opencv22-直方图均衡化
查看>>
opencv23-直方图计算
查看>>
opencv24-直方图比较
查看>>
opencv25-直方图反向投影
查看>>
opencv26-模板匹配
查看>>
opencv27-轮廓发现
查看>>
opencv28-凸包
查看>>
opencv29-轮廓周围绘制矩形框和圆形框
查看>>
OpenCV3 install tutorial for Mac
查看>>
opencv3-Mat对象
查看>>
opencv30-图像矩
查看>>
opencv32-基于距离变换和分水岭的图像分割
查看>>
opencv4-图像操作
查看>>
opencv5-图像混合
查看>>