基本概念
- 滤波实际上是信号处理的一个概念,图像可以看成一个二维信号,其中像素点
灰度值得高低代表信号的强弱 - 高频:图像中变化剧烈的部分
低频:图像中变化缓慢,平坦的部分 - 根据图像高低频特性,设置高通和低通滤波器
高通滤波可以检测图像中尖锐、变化明显的地方;
低通滤波可以让图像变得平滑,消除噪声干扰 - 图像滤波是OpenCV图像处理的重要部分,在图像预处理方面应用广泛,图像
滤波的好坏决定着后续处理的结果好坏 - 本节主要介绍低通滤波部分(图像平滑去噪),高通部分(边缘检测)后续介绍
- 本节主要介绍的图像滤波函数方法
线性滤波:方框滤波、均值滤波、高斯滤波
非线性滤波:中值滤波、双边滤波
整体代码
#include "mainwindow.h"
#include <opencv2/opencv.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace cv;
using namespace std;
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
Mat srcImg=imread("D:\\1\\1.png");
Mat dstImg;
/*1.方框滤波*/
//boxFilter(srcImg,dstImg,-1,Size(3,3),Point(-1,-1),true);
/*2.均值滤波*/
blur(srcImg,dstImg,Size(3,3),Point(-1,-1));
/*3.高斯滤波---最有用的滤波器,主要针对高斯噪声,服从正态分布的噪声*/
GaussianBlur(srcImg,dstImg,Size(5,5),1);
/*4.中值滤波---用于滤除脉冲噪声和椒盐噪声*/
medianBlur(srcImg,dstImg,3);
/*5.双边滤波*/
bilateralFilter(srcImg,dstImg,5,10.0,2.0);
imshow("srcImg",srcImg);
imshow("dstImg",dstImg);
}
MainWindow::~MainWindow()
{
}
方框滤波
概念
方框滤波用到的核
当normalize为true时,方框滤波也就成了均值滤波。也就是说均值滤波是方框滤波归一化后的特殊情况。归一化就是将要处理的量缩放到一定范围,比如(0, 1)
函数原型
CV_EXPORTS_W void boxFilter( InputArray src, OutputArray dst, int ddepth,
Size ksize, Point anchor = Point(-1,-1),
bool normalize = true,
int borderType = BORDER_DEFAULT );
- ddepth: 输出图像的深度, -1代表使用原图像深度,即src.depth()
- ksize: Size类型表示内核大小,一般用Size(w,h)表示内核大小, Size(3,3)表示3x3的核大小
- anchor: 表示锚点(即被平滑的那个点), 默认值Point(-1, -1),表示锚点在核中心
- normalize: 默认值true, 标识符, 表示内核是否被归一化
- borderType: 图像像素边界模式,一般用默认值即可
代码
/*1.方框滤波*/
boxFilter(srcImg,dstImg,-1,Size(3,3),Point(-1,-1),true);
均值滤波
概念
均值滤波的核
函数原型
CV_EXPORTS_W void blur( InputArray src, OutputArray dst,
Size ksize, Point anchor = Point(-1,-1),
int borderType = BORDER_DEFAULT );
代码
/*2.均值滤波*/
blur(srcImg,dstImg,Size(3,3),Point(-1,-1));
高斯滤波
概念
高斯滤波器被称为最有用的滤波器,每个像素点都是由本身和邻域内的其他像素值经过加权平均后得到的, 加权系数越靠近中心越大, 越远离中心越小, 能够很好的滤除噪
函数原型
CV_EXPORTS_W void GaussianBlur( InputArray src, OutputArray dst, Size ksize,
double sigmaX, double sigmaY = 0,
int borderType = BORDER_DEFAULT );
- ksize: 高斯内核大小,一般用Size(w,h)表示内核大小, w, h可以不同, 但是必须为正奇数或者0, 由sigma计算得来
- sigmaX: 表示高斯函数在X方向上的标准偏差
- sigmaY: 表示高斯函数在Y方向上的标准偏差, 若sigmaY=0, 就将它设置为sigmaX;
-若sigmaY=0 && sigmaX=0则由ksize.width和ksize.height计算出来 - borderType: 图像像素边界模式,一般用默认值即可
代码
/*3.高斯滤波---最有用的滤波器,主要针对高斯噪声,服从正态分布的噪声*/
GaussianBlur(srcImg,dstImg,Size(5,5),1);
中值滤波
概念
中值滤波是一种非线性滤波, 是用像素点邻域灰度值的中值代替该点的灰度值, 可以去除脉冲噪声和椒盐
median({1,2,3,3,7,5,1,8})=3
函数原型
CV_EXPORTS_W void medianBlur( InputArray src, OutputArray dst, int ksize );
代码
/*4.中值滤波---用于滤除脉冲噪声和椒盐噪声*/
medianBlur(srcImg,dstImg,3);
双边滤波
概念
双边滤波是一种非线性滤波, 是结合图像空间邻近度和像素值相似度的一种折中处理, 尽量在去噪同时保存边缘
函数原型
CV_EXPORTS_W void bilateralFilter( InputArray src, OutputArray dst, int d,
double sigmaColor, double sigmaSpace,
int borderType = BORDER_DEFAULT );
代码
/*5.双边滤波*/
bilateralFilter(srcImg,dstImg,5,10.0,2.0);