目录
掩膜操作
图像滤波的主要目的是为了在保留图像细节的情况下尽量的对图像的噪声进行消除,从而是后来的图像处理变得更加的方便.
图像的滤波效果要满足两个条件:
1.不能损坏图像的轮廓和边缘这些重要的特征信息.
2.图像的视觉效果更好
opencv支持图像滤波,提供了五个基本算法,分别是方框滤波,均值滤波,高斯滤波,中值滤波以及双边滤波,前三种为线性滤波算法,后两种为非线性滤波算法。
参考链接: https://www.cnblogs.com/dengxiaojun/p/5249044.html
1. 方框滤波
/*、1.方框滤波:boxFilter函数(注:均值滤波是归一化后的方框滤波)*/
/*函数原型: void boxFilter(InputArray src,
OutputArray dst,
int ddepth,
Size ksize,
Point anchor=Point(-1,-1),
boolnormalize=true,
int boderType=BORDER_DEFAULT) */
/*参数详解:
InputArray src-----源图像
OutputArray dst----目标图像
int ddepth----输出图像深度,输出图像深度,“-1”代表使用原图深度,即src.depth()
Size ksize----内核的大小,写法size(5x5),就表示5x5的内核大小
Point anchor-----表示锚点,默认值Point(-1,-1),坐标为负值,表示取核的中心
boolnormalize-----表示内核是否被其区域归一化,默认值为true
boderType----用于推断图像外部像素的某种边界模式,默认值BORDER_DEFAULT*/
示例代码:
#include <opencv2/core/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv; //使用命名空间cv下的资源
using namespace std;
const int g_boxFilterMax = 100;//最大的邻域取值
int g_nboxFilterValue;
Mat boxFilterImage;
Mat srcImage;
void onBoxFilterTrackBar(int pos, void* userData);
int main(int argc, char** args)
{
//2020.7.13 滤波 ------------------------------------------------------------
g_nboxFilterValue = 5;
srcImage = imread("E:/DevelopMents/opencv/opencvTest1/girl.jpg", IMREAD_COLOR);
if (!srcImage.data)
{
cout << "could not find the image resource..." << std::endl;
return -1;
}
//创建一个名为 "My Image"窗口
namedWindow("box filter");
//创建滑动条,初始值(同时记录滑块以后的位置)为g_nboxFilterValue,最大值为g_boxFilterMax,回调函数为onBoxFilterTrackBar
createTrackbar("size value ", "box filter", &g_nboxFilterValue, g_boxFilterMax, onBoxFilterTrackBar, 0);
//调用回调函数
onBoxFilterTrackBar(g_nboxFilterValue, 0);
imshow("src image", srcImage);
moveWindow("src image", 0, 0); //图片位置 0,0
moveWindow("box filter", srcImage.cols, 0); //
waitKey(0);
return 0;
}
//方框滤波
void onBoxFilterTrackBar(int pos, void* userData)
{
if (pos == 0)
{
imshow("box filter", srcImage);
}
else
{
boxFilter(srcImage, boxFilterImage, srcImage.depth(), Size(pos, pos));
imshow("box filter", boxFilterImage);
}
}
2. 均值滤波
##1.均值滤波:blur函数
##函数原型 : void blur(InputArray src,
OutArray dst,
Size ksize,
Point anchor=point(-1,-1),
int borderType=BORDER_DEFAULT)
参数的含义和方框滤波一样。均值滤波其实就是方框滤波的默认归一化版本。
3. 高斯滤波
高斯滤波是专门用于消除满足高斯分布(正态分布)的误差而存在的滤波,此时邻域算子是专门的高斯核,图像中的像素与高斯核做卷积,生成的结果加权平均存放到目标像素中,对于抑制符合正态分布的噪声非常有效,并可以增强图像值不同比例下的图像效果,视觉效果类似于隔了一层半透明玻璃看图像.
/*高斯滤波:GaussianBlur函数
函数原型: void GaussianBlur ( InputArray src,
OutputArray dst,
Size ksize,
double sigmaX,
double sigmaY = 0,
int borderType = BORDER_DEFAULT );
参数详解:
InputArray src-----源图像
OutputArray dst-----目标图像
Size ksize----高斯内核大小,其中ksize.width和ksize.height可以不同,但是必须为正数
和奇数,也可为零,均有sigma计算而来。
double sigmaX----表示高斯函数在X方向的标准偏差
double sigmaY---- 表示高斯函数在Y方向的标准偏差
若sigma为零,就将它设为sigmaX, 如果两者均为零,就由ksize.width和ksize.height计算出来。
int borderType -----用于推断图像外部像素的某种边界模式。
默认值 BORDER_DEFAULT */
4. 中值滤波
线性滤波的基本原理是对指定像素的指定邻域的灰度值进行一个排序,然后选择中间的灰度值来直接替代指定像素的灰度值,从而消除孤立的噪声点,对于斑点噪声和椒盐噪声尤其有用,同时还可以保存边缘.对脉冲型的干扰尤其有效,因为在实际情况中,噪声点的灰度和邻域的值的差别很大,所以,中值一般不容易是噪声点灰度.但是因为基于统计排序,所以运行时间一般是均值滤波的五倍以上.
/*中值滤波:medianBlur函数是非线性滤波
函数原型:void medianBlur(inputArray src,
OutputArray dst,
int ksize)
参数详解:
inputArray src------填1、 3、或者4通道的Mat类型的图像。
当ksize为3或5的时候图像深度需为CV_8U、 CV_16U、CV_32F其中之一,
而对于较大孔径尺寸的图片,它只能是CV_8U
OutputArray dst-----目标图像,函数的输出参数,同源图像同尺寸,同类型
int ksize------孔径的尺寸,参数必须是大于1的奇数
*/
5. 双边滤波
【双边滤波】结合空间临近度和像素值相似度的一种折中处理
原型:void bilateralFilter( InputArray src,
OutputArray dst,
int d,
double sigmaColor,
double sigmaSpace,
int borderType=BORDER_DEFAULT );
参数1:InputArray src--- 输入图像,需要8位,或浮点型单通道,三通道的图像。
参数2:OutputArray ds--- 目标图像
参数3:int d ---每个像素领域的直径d。
参数4:double sigmaColor---颜色空间滤波器sigma的值,决定多少差值之内的像素会被计算。可以比喻为一个网,越大,漏出来的越大。
参数5:double sigmaSpace---坐标空间中滤波器sigma的值。d>0,声明无效,否则根据它来计算d值。
参数6:int borderType=BORDER_DEFAULT---边界模式,有默认值 BORDER_DEFAULT