您的位置:首页 > 运维架构

opencv中的各种滤波函数

2016-07-17 03:42 337 查看

线性滤波

方框滤波

void boxFilter(InputArray src, OutputArray, dst,  int ddepth, Size ksize, Point Anchor = Point(-1, -1), bool normalize = true, int borderType = BORDER_DEFAULT)


第一个参数 输入

第二个参数 输出

第三个参数 输出图像深度,为负时(-1)时表示和源图像一致

第四个参数 内核大小

后面的参数用默认即可

第五个参数 锚点坐标,如果都为负(Point(-1,-1)),即取内核中点为锚点

第六个参数  归一化

第七个参数 边界类型,取BORDER_DEFAULT即可

均值滤波

void blur(InputArray src, OutputArray,  Size ksize, Point Anchor = Point(-1, -1), int borderType = BORDER_DEFAULT)


第一个参数 输入

第二个参数 输出

第三个参数 内核大小

后面的参数用默认即可

第四个参数 锚点坐标,如果都为负(Point(-1,-1)),即取内核中点为锚点

第五个参数 边界类型,取BORDER_DEFAULT即可

blur是特殊的boxFilter, ddepth取-1, normalize取true

高斯滤波

void GaussianBlurr(InputArray src, OutputArray,  Size ksize, double sigmaX, double sigmaY = 0, int borderType = BORDER_DEFAULT)


第一个参数 输入

第二个参数 输出

第三个参数 内核大小

第四个参数 核函数X方向上的偏差(???),
第五个参数 核函数Y方向上的偏差(???),默认为0,

当这个值为0,前一个参数sigmaX不为0时,自动把这个值设为和sigmaX一样的值,

如果sigmaX和sigmaY均为0时,会自动通过ksize.width和ksize.height计算sigmaX和sigmaY

后面的参数用默认即可

第六个参数 边界类型,取BORDER_DEFAULT即可

非线性滤波操作

中值滤波

medianBlur(InputArray src, OutputArray dst, int ksize)


第一个参数 输入

第二个参数 输出

第三个参数 孔径大小

中值滤波就是将每一个点的灰度值设为在它周围一个区域内的所有点灰度值的中间值

首先是排序它和它周围点的灰度值,然后找到中间值,最后修改,所以一般孔径大小取奇数,方便取值,为偶数时区中间两个的平均值

双边滤波

void bilateralFilter(InputArray src, OutputArray dst, int d, double sigmaColor, double sigmaSpace, int borderType = BORDER_DEFAULT)
第一个参数 输入

第二个参数 输出

第三个参数 孔径大小   当d<=0时,会自动通过第五个参数sigmaSpace来计算d值,此时与sigmaSpace成正比

第四个参数 不同颜色混合程度,这个值越大,越宽广的颜色会被混到一起
第五个参数 像素之间的影响程度,这个值越大,距离越远的像素的会相互影响

例子

#include <core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>

using namespace cv;

void on_GaussianBlur(int, void*);

int g_coreValue=0;

Mat ma1;
Mat ma2;
Mat ma3;
Mat ma4;
Mat ma5;
Mat ma6;

int main()
{

ma1 = imread("1.png");                                   //读入要操作的图像

imshow("im1", ma1);

boxFilter(ma1, ma2, -1, Size(5,5));                      //方框滤波操作

imshow("im2", ma2);

blur(ma1, ma3, Size(7, 7));                              //均值滤波

imshow("im3", ma3);

GaussianBlur(ma1, ma4, Size(7, 7), 0, 0);                //高斯滤波

imshow("im4", ma4);

createTrackbar("内核值", "im4", &g_coreValue, 100, on_GaussianBlur);        //为高斯滤波创建动态滑动条,可以动态观察

medianBlur(ma1, ma5, 5);                                 //中值滤波

imshow("im5", ma5);

bilateralFilter(ma1, ma6, 25, 100, 25/2);                //双边滤波

imshow("im6", ma6);

while (waitKey(10) != 27);

return 0;
}

void on_GaussianBlur(int, void*)
{
GaussianBlur(ma1, ma4, Size(g_coreValue * 2 + 1, g_coreValue * 2 + 1), 0, 0);

imshow("im4", ma4);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: