opencv滤波函数简介
滤波器的种类有很多, 在新版本的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
- void init(const Ptr<BaseFilter>& _filter2D,
- const Ptr<BaseRowFilter>& _rowFilter,
- const Ptr<BaseColumnFilter>& _columnFilter,
- int srcType, int dstType, int bufType,
- int _rowBorderType = BORDER_REPLICATE, int _columnBorderType = -1,
- const Scalar& _borderValue = Scalar());
发现init函数出现如下代码:
- if (_columnBorderType < 0)
- _columnBorderType = _rowBorderType;
- rowBorderType = _rowBorderType;
- columnBorderType = _columnBorderType;
- CV_Assert(columnBorderType != BORDER_WRAP);
所以可知 BORDER_WRAP使用不当
Blur()源码在opencv目录下面
E:\opencv\sources\modules\imgproc\src
filter.cpp
smooth.cpp
最后送各种模板边缘插值测试程序一枚:
- #include "stdafx.h"
- #include <cv.h>
- #include <cxcore.h>
- #include <highgui.h>
- using namespace cv;
- using namespace std;
- int _tmain(int argc, _TCHAR* argv[])
- {
- vector<double> vecortImg(9);
- CvMat* M = cvCreateMat(3, 3, CV_64FC1);
- double num =-1;
- for (int i = 0; i < 3; i++){
- for (int j = 0; j < 3; j++){
- cvmSet(M, i, j, ++num);
- cout << num <<" ";
- vecortImg.at(i*3+j) = num;//因为滤波的不同导致的不同呀…………
- }
- cout << endl;
- }
- //! various border interpolation methods
- /*
- Various border types, image boundaries are denoted 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'
- */
- cout <<"平滑后"<<endl;
- Mat tempM;
- try{
- blur(Mat(M), tempM, cv::Size(3, 3), Point(-1, -1), BORDER_WRAP);
- }
- catch (cv::Exception e){
- cout << e.what();
- }
- Mat hh = tempM;
- vector<double> markdata1;
- int row = hh.rows ;
- int col = hh.cols;
- double* pMatdata = (double*)hh.data;
- for (int i = 0; i < 3; i++)
- {
- for (int j = 0; j < 3; j++){
- cout << *(pMatdata + i * 3 + j)<<" ";
- markdata1.push_back(*(pMatdata + i*3+j));
- }
- cout << endl;
- }
- cvReleaseMat(&M);
- system("PAUSE");
- return 0;
- }
opencv滤波函数简介相关推荐
- bilareralFilter双边滤波函数
C++: void **bilateralFilte**r(InputArray src, OutputArray dst, int d, double sigmaColor, double sigm ...
- OpenCV支持向量机SVM简介
OpenCV支持向量机SVM简介 支持向量机SVM简介 目标 什么是SVM? 最佳超平面如何计算? 源代码 解释 设置训练数据 设置SVM的参数 由SVM分类的区域 支持向量 结果 支持向量机SVM简 ...
- opencv处理函数记录_转自opencv中文网站
Cv图像处理 Wikipedia,自由的百科全书 注意:本章描述图像处理和分析的一些函数.大多数函数都是针对两维象素数组的,这里,我们称这些数组为"图像",但是它们不一定非得是Ip ...
- opencv常用函数,QT中Mat与QImage的转换
一.opencv简介 opencv是一个跨平台计算机视觉和机器学习软件库,可以运行在Linux.Windows.Android和Mac OS操作系统上,实现了图像处理和计算机视觉方面的很多通用算法. ...
- Opencv的使用小教程1——Opencv基础函数汇总
Opencv的使用小教程1--Opencv基础函数汇总 1.VideoCapture 2.imread 3.resize 4.clone 5.cvtColor 6.Scalar 7.获取像素点的值 8 ...
- opencv滤波、图像形运算、Sober算子
1.opencv中滤波操作:ksize必须是奇数 1.均值操作:选定图像上的行数和列数,求出总和,除以总个数,然后将这个数放到这个选定区的中间区域中.数学表达式:4上的值=(5+6+6+7+4+... ...
- opencv Mat 函数--CheckVector
学习opencv ,我们需要对opencv的函数有点了解 ,实现什么样子的功能,以及如何实现 下面我们一次来看checkVector 这个函数, int org.opencv.core.Mat.che ...
- SQL中 decode()函数简介
今天看别人的SQL时看这里面还有decode()函数,以前从来没接触到,上网查了一下,还挺好用的一个函数,写下来希望对朋友们有帮助哈! decode()函数简介: 主要作用:将查询结果翻译成其他值(即 ...
- matlab中imresize函数的用法,为何 MATLAB imresize 函数和 OpenCV resize 函数结果不同
为何 MATLAB imresize 函数和 OpenCV resize 函数结果不同?今年 4 月,我在依照 MATLAB 代码自己写一个卷积神经网络 C++ 实现的过程中,就发现了这个问题,不过那 ...
最新文章
- 那xxx.class.getName()為什麼能這樣寫?? 看了半天都快搞不清楚到底在程式中的example到底是class ? object ? 還是instance了
- CodeforcesBeta Round #19 D. Points 离线线段树 单点更新 离散化
- javascript创建类方法汇总(包含es6语法)
- VMware VCP
- VB 字节数组和字符串的转换问题 (StringByte)
- tensorflow命令行安装失败_2019-1 强化学习入坑记之ancanda安装
- opencv 手部识别_手势识别结合到VR头显中,有哪些难点?
- 使用Java程序通过http post访问Application server
- Teams架构剖析(2019年版本)
- 【小项目】学生信息登记系统
- 华为提交“NovaBuds”商标申请:nova要出耳机了?
- SAP License:雾里看花系列——德国!SAP!中国企业!高管! SAP权限管控
- python和java哪个好学-java和python哪个的前途更好?
- 在vs中使用正则表达式
- 使用flask快速搭建API
- 全网首发:gstreamer如何接入RTSP流(IP摄像头)的代码范例
- Linux系统优化之网络IO调优
- 希尔加密法matlab,希尔密码加密解密
- 51单片机串行口波特率计算
- 如何利用新浪博客做外链
热门文章
- 王者苹果服务器维护几点能玩,《王者荣耀》ios版更新维护到几点 10月17日ios版更新时间介绍...
- MonoX被偷袭?快准狠直击命门
- 个人Tomcat复习篇
- Nacos服务注册流程(一)
- 李彦宏对话大学生:走出直线人生
- 科大迅飞语音听写(流式版)WebAPI,Web前端、H5调用 语音识别,语音搜索,语音听写
- DL之RefineNet:RefineNet和Light-Weight RefineNet算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略
- 智能车|直流电机、编码器与驱动器---减速器
- java 字符串掐头去尾_Java 8 Stream 简单介绍
- 阿里云Oss云存储的使用