滤波器的种类有很多, 在新版本的OpenCV中,提供了如下五种常用的图像平滑处理操作方法,且他们分别被封装在单独的函数中,使用起来非常方便:

·        方框滤波——boxblur函数

·        均值滤波——blur函数

·        高斯滤波——GaussianBlur函数

·        中值滤波——medianBlur函数

·        双边滤波——bilateralFilter函数

本文主要以blur展开解析:

CV_EXPORTS_W void blur( InputArray src, OutputArray dst,

Size ksize, Point anchor=Point(-1,-1),

int

·        第一个参数,InputArray类型的src,输入图像,即源图像,填Mat类的对象即可。该函数对通道是独立处理的,且可以处理任意通道数的图片,但需要注意,待处理的图片深度应该为CV_8U, CV_16U, CV_16S, CV_32F 以及 CV_64F之一。

·        第二个参数,OutputArray类型的dst,即目标图像,需要和源图片有一样的尺寸和类型。比如可以用Mat::Clone,以源图片为模板,来初始化得到如假包换的目标图。

·        第三个参数,Size类型(对Size类型稍后有讲解)的ksize,内核的大小。一般这样写Size( w,h )来表示内核的大小( 其中,w 为像素宽度, h为像素高度)。Size(3,3)就表示3x3的核大小,Size(5,5)就表示5x5的核大小

·        第四个参数,Point类型的anchor,表示锚点(即被平滑的那个点),注意他有默认值Point(-1,-1)。如果这个点坐标是负值的话,就表示取核的中心为锚点,所以默认值Point(-1,-1)表示这个锚点在核的中心。

·        第五个参数,int类型的borderType,用于推断图像外部像素的某种边界模式。有默认值BORDER_DEFAULT

borderType参数解析如下:

/*

Various border types, image boundaries aredenoted with '|'

* BORDER_REPLICATE:     aaaaaa|abcdefgh|hhhhhhh

* BORDER_REFLECT:       fedcba|abcdefgh|hgfedcb

* BORDER_REFLECT_101:   gfedcb|abcdefgh|gfedcba

* BORDER_WRAP:          cdefgh|abcdefgh|abcdefg

* BORDER_CONSTANT:      iiiiii|abcdefgh|iiiiiii  with some specified 'i'

*/

根据borderInterpolate可知其只支持上面五种边缘插值方法,上面的插值按照右边的字符串很形象的表示了。

在OpenCV滤波算法中,有两个非常重要的基本工具函数,copyMakeBorder和borderInterpolate

void copyMakeBorder( const Mat& src,Mat& dst,int top, int bottom, int left, int right,
int borderType, const Scalar& value=Scalar() );

源码在utils.cpp中

功能

扩充src的边缘,将图像变大,然后以各种外插方式自动填充图像边界,这个函数实际上调用了函数cv::borderInterpolate,这个函数最重要的功能就是为了处理边界,比如均值滤波或者中值滤波中,使用copyMakeBorder将原图稍微放大,然后我们就可以处理边界的情况了

// borderInterpolate源码在 filter.cpp里面

BORDER_REPLICATE:复制法,也就是复制最边缘像素。边缘扩大的像素个数根据你的模板大小

BORDER_REFLECT :  对称法,也就是以最边缘像素的边为轴,即该边缘像素会复制一遍

BORDER_REFLECT_101对称法,也就是以最边缘像素为轴,对称,该边缘像素不会复制一遍

BORDER_CONSTANT:常量法:边界填充特点常量,默认为0(没有发现可以修改该值,望补充,MAtlib的可以修改)

BORDER_WRAP:镜像对称复制,但是 blur(Mat(M), tempM, cv::Size(3, 3), Point(-1, -1), BORDER_WRAP);提示错误

根据错误提示你会发现问题来到FilterEngine 类解析——OpenCV图像滤波核心引擎

FilterEngine类是OpenCV关于图像滤波的主力军类,OpenCV图像滤波功能的核心引擎。各种滤波函数比如blur, GaussianBlur,到头来其实是就是在函数末尾处定义了一个Ptr<FilterEngine>类型的f,然后f->apply( src, dst )了一下而已。

这个类可以把几乎是所有的滤波操作施加到图像上。它包含了所有必要的中间缓存器。有很多和滤波相关的create系函数的返回值直接就是Ptr<FilterEngine>。比如cv::createSeparableLinearFilter()。

源码解析BORDER_WRAP在blur(Mat(M), tempM, cv::Size(3, 3), Point(-1, -1), BORDER_WRAP)里面使用错误:

http://www.opencv.org.cn/opencvdoc/2.3.2/html/modules/imgproc/doc/filtering.html?highlight=filterengine#filterengine

[cpp] view plain copy
  1. void init(const Ptr<BaseFilter>& _filter2D,
  2. const Ptr<BaseRowFilter>& _rowFilter,
  3. const Ptr<BaseColumnFilter>& _columnFilter,
  4. int srcType, int dstType, int bufType,
  5. int _rowBorderType = BORDER_REPLICATE, int _columnBorderType = -1,
  6. const Scalar& _borderValue = Scalar());

发现init函数出现如下代码:

[cpp] view plain copy
  1. if (_columnBorderType < 0)
  2. _columnBorderType = _rowBorderType;
  3. rowBorderType = _rowBorderType;
  4. columnBorderType = _columnBorderType;
  5. CV_Assert(columnBorderType != BORDER_WRAP);

所以可知 BORDER_WRAP使用不当

Blur()源码在opencv目录下面

E:\opencv\sources\modules\imgproc\src

filter.cpp

smooth.cpp

最后送各种模板边缘插值测试程序一枚:

[cpp] view plain copy
  1. #include "stdafx.h"
  2. #include <cv.h>
  3. #include <cxcore.h>
  4. #include <highgui.h>
  5. using namespace cv;
  6. using namespace std;
  7. int _tmain(int argc, _TCHAR* argv[])
  8. {
  9. vector<double> vecortImg(9);
  10. CvMat* M = cvCreateMat(3, 3, CV_64FC1);
  11. double num =-1;
  12. for (int i = 0; i < 3; i++){
  13. for (int j = 0; j < 3; j++){
  14. cvmSet(M, i, j, ++num);
  15. cout << num <<" ";
  16. vecortImg.at(i*3+j) =  num;//因为滤波的不同导致的不同呀…………
  17. }
  18. cout << endl;
  19. }
  20. //! various border interpolation methods
  21. /*
  22. Various border types, image boundaries are denoted with '|'
  23. * BORDER_REPLICATE:     aaaaaa|abcdefgh|hhhhhhh
  24. * BORDER_REFLECT:       fedcba|abcdefgh|hgfedcb
  25. * BORDER_REFLECT_101:   gfedcb|abcdefgh|gfedcba
  26. * BORDER_WRAP:          cdefgh|abcdefgh|abcdefg
  27. * BORDER_CONSTANT:      iiiiii|abcdefgh|iiiiiii  with some specified 'i'
  28. */
  29. cout <<"平滑后"<<endl;
  30. Mat tempM;
  31. try{
  32. blur(Mat(M), tempM, cv::Size(3, 3), Point(-1, -1), BORDER_WRAP);
  33. }
  34. catch (cv::Exception e){
  35. cout << e.what();
  36. }
  37. Mat hh = tempM;
  38. vector<double> markdata1;
  39. int row = hh.rows ;
  40. int col = hh.cols;
  41. double* pMatdata = (double*)hh.data;
  42. for (int i = 0; i < 3; i++)
  43. {
  44. for (int j = 0; j < 3; j++){
  45. cout << *(pMatdata + i * 3 + j)<<"  ";
  46. markdata1.push_back(*(pMatdata + i*3+j));
  47. }
  48. cout << endl;
  49. }
  50. cvReleaseMat(&M);
  51. system("PAUSE");
  52. return 0;
  53. }

opencv滤波函数简介相关推荐

  1. bilareralFilter双边滤波函数

    C++: void **bilateralFilte**r(InputArray src, OutputArray dst, int d, double sigmaColor, double sigm ...

  2. OpenCV支持向量机SVM简介

    OpenCV支持向量机SVM简介 支持向量机SVM简介 目标 什么是SVM? 最佳超平面如何计算? 源代码 解释 设置训练数据 设置SVM的参数 由SVM分类的区域 支持向量 结果 支持向量机SVM简 ...

  3. opencv处理函数记录_转自opencv中文网站

    Cv图像处理 Wikipedia,自由的百科全书 注意:本章描述图像处理和分析的一些函数.大多数函数都是针对两维象素数组的,这里,我们称这些数组为"图像",但是它们不一定非得是Ip ...

  4. opencv常用函数,QT中Mat与QImage的转换

    一.opencv简介 opencv是一个跨平台计算机视觉和机器学习软件库,可以运行在Linux.Windows.Android和Mac OS操作系统上,实现了图像处理和计算机视觉方面的很多通用算法. ...

  5. Opencv的使用小教程1——Opencv基础函数汇总

    Opencv的使用小教程1--Opencv基础函数汇总 1.VideoCapture 2.imread 3.resize 4.clone 5.cvtColor 6.Scalar 7.获取像素点的值 8 ...

  6. opencv滤波、图像形运算、Sober算子

    1.opencv中滤波操作:ksize必须是奇数 1.均值操作:选定图像上的行数和列数,求出总和,除以总个数,然后将这个数放到这个选定区的中间区域中.数学表达式:4上的值=(5+6+6+7+4+... ...

  7. opencv Mat 函数--CheckVector

    学习opencv ,我们需要对opencv的函数有点了解 ,实现什么样子的功能,以及如何实现 下面我们一次来看checkVector 这个函数, int org.opencv.core.Mat.che ...

  8. SQL中 decode()函数简介

    今天看别人的SQL时看这里面还有decode()函数,以前从来没接触到,上网查了一下,还挺好用的一个函数,写下来希望对朋友们有帮助哈! decode()函数简介: 主要作用:将查询结果翻译成其他值(即 ...

  9. matlab中imresize函数的用法,为何 MATLAB imresize 函数和 OpenCV resize 函数结果不同

    为何 MATLAB imresize 函数和 OpenCV resize 函数结果不同?今年 4 月,我在依照 MATLAB 代码自己写一个卷积神经网络 C++ 实现的过程中,就发现了这个问题,不过那 ...

最新文章

  1. 那xxx.class.getName()為什麼能這樣寫?? 看了半天都快搞不清楚到底在程式中的example到底是class ? object ? 還是instance了
  2. CodeforcesBeta Round #19 D. Points 离线线段树 单点更新 离散化
  3. javascript创建类方法汇总(包含es6语法)
  4. VMware VCP
  5. VB 字节数组和字符串的转换问题 (StringByte)
  6. tensorflow命令行安装失败_2019-1 强化学习入坑记之ancanda安装
  7. opencv 手部识别_手势识别结合到VR头显中,有哪些难点?
  8. 使用Java程序通过http post访问Application server
  9. Teams架构剖析(2019年版本)
  10. 【小项目】学生信息登记系统
  11. 华为提交“NovaBuds”商标申请:nova要出耳机了?
  12. SAP License:雾里看花系列——德国!SAP!中国企业!高管! SAP权限管控
  13. python和java哪个好学-java和python哪个的前途更好?
  14. 在vs中使用正则表达式
  15. 使用flask快速搭建API
  16. 全网首发:gstreamer如何接入RTSP流(IP摄像头)的代码范例
  17. Linux系统优化之网络IO调优
  18. 希尔加密法matlab,希尔密码加密解密
  19. 51单片机串行口波特率计算
  20. 如何利用新浪博客做外链

热门文章

  1. 王者苹果服务器维护几点能玩,《王者荣耀》ios版更新维护到几点 10月17日ios版更新时间介绍...
  2. MonoX被偷袭?快准狠直击命门
  3. 个人Tomcat复习篇
  4. Nacos服务注册流程(一)
  5. 李彦宏对话大学生:走出直线人生
  6. 科大迅飞语音听写(流式版)WebAPI,Web前端、H5调用 语音识别,语音搜索,语音听写
  7. DL之RefineNet:RefineNet和Light-Weight RefineNet算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略
  8. 智能车|直流电机、编码器与驱动器---减速器
  9. java 字符串掐头去尾_Java 8 Stream 简单介绍
  10. 阿里云Oss云存储的使用