【OpenCV】-5种图像滤波的综合示例

简介: 【OpenCV】-5种图像滤波的综合示例

序言: 这一篇文章是对之前学习线性滤波和非线性滤波的回顾。之前都是分章节介绍滤波器对图片的处理,这一小节将前文介绍的知识点以代码为载体,展现给大家,用滑动条的方式来控制学习到的各种滤波(方框滤波、均值滤波、高斯滤波、中值滤波、双边滤波)的参数值。通过滚动条来控制图像在各种平滑处理下的模糊度,不仅可以与原图对比看出效果,而且也有一定的可玩性,哈哈。

话不多说,上代码

#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<iostream>
using namespace cv;
using namespace std;
//---------------------------------
//全局变量声明
//-------------------------------
Mat g_srcIamge, g_dstImage1, g_dstImage2, g_dstImage3,g_dstImage4, g_dstImage5;//存储图片的Mat类型
int g_nBoxFilterValue = 3;//方框滤波参数值
int g_nMeanBlurValue = 3;//均值滤波参数值
int g_nGaussianBlurValue = 3;//高斯滤波参数值
int g_nMedianBlurValue = 10;//中值滤波参数值
int g_nBilateralFilterValue = 10;//双边滤波参数值
//---------------------------------
//全局函数声明
//-------------------------------
static void on_BoxFilter(int, void *);//方框滤波
static void on_MeanBlur(int, void *);//均值滤波
static void on_GaussianBlur(int, void *);//高斯滤波
static void on_MedianBlur(int, void *);//中值滤波器
static void on_BilateralFilter(int, void *);//双边滤波器
int main()
{
  //改变console字体颜色
  system("color 5E");
  //载入原图
  g_srcIamge = imread("E:\\Pec\\shihao.jpg", 1);
  if (!g_srcIamge.data)
  {
    printf("读取图片错误\n");
    return false;
  }
  //复制原图到三个Mat类型中
  g_dstImage1 = g_srcIamge.clone();
  g_dstImage2 = g_srcIamge.clone();
  g_dstImage3 = g_srcIamge.clone();
  g_dstImage4 = g_srcIamge.clone();
  g_dstImage5 = g_srcIamge.clone();
  //显示原图
  namedWindow("【<0>原图窗口】", 1);
  imshow("【<0>原图窗口】", g_srcIamge);

  //=========1、方框滤波===========
  //创建窗口
  namedWindow("【<1>方框滤波】", 1);
  //创建轨迹条
  createTrackbar("内核值:", "【<1>方框滤波】", &g_nBoxFilterValue, 40, on_BoxFilter);
  on_MeanBlur(g_nBoxFilterValue, 0);


  //======2、均值滤波===========
  namedWindow("【<2>均值滤波】", 1);
  //创建轨迹条
  createTrackbar("内核值:", "【<2>均值滤波】", &g_nMeanBlurValue, 40, on_BoxFilter);
  on_MeanBlur(g_nMeanBlurValue, 0);


  //=====3、高斯滤波===============
  namedWindow("【<3>高斯滤波】", 1);
  //创建轨迹条
  createTrackbar("内核值:", "【<3>高斯滤波】", &g_nGaussianBlurValue, 40, on_BoxFilter);
  on_GaussianBlur(g_nGaussianBlurValue, 0);

  //=====4、中值滤波===============
  namedWindow("【<4>中值滤波】", 1);
  //创建轨迹条
  createTrackbar("内核值:", "【<4>中值滤波】", &g_nMedianBlurValue, 50, on_MeanBlur);
  on_MedianBlur(g_nMedianBlurValue, 0);

  
  //=====5、双边滤波===============
  namedWindow("【<5>双边滤波】", 1);
  //创建轨迹条
  createTrackbar("内核值:", "【<5>双边滤波】", &g_nBilateralFilterValue, 50, on_BilateralFilter);
  on_BilateralFilter(g_nBilateralFilterValue, 0);

  //输出一些帮助信息
  cout << endl << "请调整滚动条观察图像效果~\n\n" << "\t按下“q”键时,程序退出~\n";
  //在waitKey(1)之后输入一个值
  while (char(waitKey(1)) != 'q') {}
  return 0;
}
//----------------------
//方框滤波操作的回调函数
//---------------------------
static void on_BoxFilter(int, void *)//方框滤波
{
  boxFilter(g_srcIamge, g_dstImage1, -1, Size(g_nBoxFilterValue + 1, g_nBoxFilterValue + 1));
  imshow("【<1>方框滤波】", g_dstImage1);
}
static void on_MeanBlur(int, void *)//均值滤波
{
  blur(g_srcIamge, g_dstImage2, Size(g_nMeanBlurValue + 1, g_nMeanBlurValue + 1), Point(-1, -1));
  imshow("【<2>均值滤波】", g_dstImage2);
}
static void on_GaussianBlur(int, void *)//高斯滤波
{
  GaussianBlur(g_srcIamge, g_dstImage3,
    Size(g_nGaussianBlurValue * 2 + 1, g_nGaussianBlurValue * 2 + 1), 0, 0);
  imshow("【<3>高斯滤波】", g_dstImage3);
}
static void on_MedianBlur(int, void *)//中值滤波器
{
  medianBlur(g_srcIamge, g_dstImage4, g_nMedianBlurValue * 2 + 1);
  imshow("【<4>中值滤波】", g_dstImage4);
}
static void on_BilateralFilter(int, void *)//双边滤波器
{
  bilateralFilter(g_srcIamge, g_dstImage5, g_nBilateralFilterValue, g_nBilateralFilterValue * 2, 
  g_nBilateralFilterValue / 2);
  imshow("【<5>双边滤波】", g_dstImage5);
}

(1)原图与方框滤波对比

(2)原图与均值滤波对比

(3)原图与高斯滤波对比

(4)原图与中值滤波对比

(5)原图与双边滤波对比

综上:观察发现:方框滤波和均值滤波效果相似,中值滤波对原图颠覆较大,双边滤波几乎和原图没有差别。

相关文章
|
4月前
|
机器学习/深度学习 数据可视化 算法
深度学习模型结构复杂、参数众多,如何更直观地深入理解你的模型?
深度学习模型虽应用广泛,但其“黑箱”特性导致可解释性不足,尤其在金融、医疗等敏感领域,模型决策逻辑的透明性至关重要。本文聚焦深度学习可解释性中的可视化分析,介绍模型结构、特征、参数及输入激活的可视化方法,帮助理解模型行为、提升透明度,并推动其在关键领域的安全应用。
384 0
|
存储 编译器 程序员
【C语言】auto 关键字详解
`auto` 关键字用于声明局部变量的自动存储类,其作用主要体现在变量的生命周期上。尽管现代C语言中 `auto` 的使用较少,理解其历史背景和作用对于掌握C语言的存储类及变量管理仍然很重要。局部变量默认即为 `auto` 类型,因此在实际编程中,通常不需要显式声明 `auto`。了解 `auto` 关键字有助于更好地理解C语言的存储类及其在不同场景中的应用。
598 1
|
存储 C++
c++的指针完整教程
本文提供了一个全面的C++指针教程,包括指针的声明与初始化、访问指针指向的值、指针运算、指针与函数的关系、动态内存分配,以及不同类型指针(如一级指针、二级指针、整型指针、字符指针、数组指针、函数指针、成员指针、void指针)的介绍,还提到了不同位数机器上指针大小的差异。
455 1
|
机器学习/深度学习 数据可视化 Python
使用最小二乘法进行线性回归(Python)
【10月更文挑战第28天】本文介绍了使用Python实现最小二乘法进行线性回归的步骤,包括数据准备、计算均值、计算斜率和截距、构建线性回归方程以及预测和可视化结果。通过示例代码展示了如何从创建数据点到最终绘制回归直线的完整过程。
437 2
|
Kubernetes 网络协议 网络安全
Pod之间的通信问题
【10月更文挑战第6天】
517 4
基于模糊PID控制器的的无刷直流电机速度控制simulink建模与仿真
本课题基于模糊PID控制器对无刷直流电机(BLDCM)进行速度控制的Simulink建模与仿真。该系统融合了传统PID控制与模糊逻辑的优势,提高了BLDCM的速度动态响应、抗干扰能力和稳态精度。通过模糊化、模糊推理和解模糊等步骤,动态调整PID参数,实现了对电机转速的精确控制。适用于多种工况下的BLDCM速度控制应用。
PR曲线、ROC曲线、AUC能干个啥
评判二分类分类器性能的指标有那么多,为什么PR曲线、ROC曲线、AUC值这几个用的比较多。本文从概念、代码实现方面着手进行分享。
PR曲线、ROC曲线、AUC能干个啥
|
算法 计算机视觉
图像处理之角点检测算法(Harris Corner Detection)
图像处理之角点检测算法(Harris Corner Detection)
534 3
用图直观上理解梯度算子(一阶)与拉普拉斯算子(二阶)的区别,线检测与边缘检测的区别
用图直观上理解梯度算子(一阶)与拉普拉斯算子(二阶)的区别,线检测与边缘检测的区别
724 1
|
计算机视觉
[QT5&OpenCV] 边缘检测、轮廓提取及轮廓跟踪
[QT5&OpenCV] 边缘检测、轮廓提取及轮廓跟踪
925 0

热门文章

最新文章