imgproc模块中常用函数源码
2016-12-23 21:16
253 查看
imgproc模块中常用函数源码一、滤波1、方框滤波boxFilter()
//! smooths the image using the box filter. Each pixel is processed in O(1) time 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 );
void cv::boxFilter( InputArray _src, OutputArray _dst, int ddepth, Size ksize, Point anchor, bool normalize, int borderType ) { Mat src = _src.getMat(); int sdepth = src.depth(), cn = src.channels(); if( ddepth < 0 ) ddepth = sdepth; _dst.create( src.size(), CV_MAKETYPE(ddepth, cn) ); Mat dst = _dst.getMat(); if( borderType != BORDER_CONSTANT && normalize && (borderType & BORDER_ISOLATED) != 0 ) { if( src.rows == 1 ) ksize.height = 1; if( src.cols == 1 ) ksize.width = 1; } #ifdef HAVE_TEGRA_OPTIMIZATION if ( tegra::box(src, dst, ksize, anchor, normalize, borderType) ) return; #endif Ptr<FilterEngine> f = createBoxFilter( src.type(), dst.type(), ksize, anchor, normalize, borderType ); f->apply( src, dst ); }
cv::Ptr<cv::FilterEngine> cv::createBoxFilter( int srcType, int dstType, Size ksize, Point anchor, bool normalize, int borderType ){ int sdepth = CV_MAT_DEPTH(srcType); int cn = CV_MAT_CN(srcType), sumType = CV_64F; if( sdepth <= CV_32S && (!normalize || ksize.width*ksize.height <= (sdepth == CV_8U ? (1<<23) : sdepth == CV_16U ? (1 << 15) : (1 << 16))) ) sumType = CV_32S; sumType = CV_MAKETYPE( sumType, cn ); Ptr<BaseRowFilter> rowFilter = getRowSumFilter(srcType, sumType, ksize.width, anchor.x ); Ptr<BaseColumnFilter> columnFilter = getColumnSumFilter(sumType, dstType, ksize.height, anchor.y, normalize ? 1./(ksize.width*ksize.height) : 1); return Ptr<FilterEngine>(new FilterEngine(Ptr<BaseFilter>(0), rowFilter, columnFilter, srcType, dstType, sumType, borderType ));}2、均值滤波blur()
//! a synonym for normalized box filterCV_EXPORTS_W void blur( InputArray src, OutputArray dst, Size ksize, Point anchor=Point(-1,-1), int borderType=BORDER_DEFAULT );
void cv::blur( InputArray src, OutputArray dst, Size ksize, Point anchor, int borderType ){ boxFilter( src, dst, -1, ksize, anchor, true, borderType );}3、高斯滤波GaussianBlur()
//! smooths the image using Gaussian filter.CV_EXPORTS_W void GaussianBlur( InputArray src, OutputArray dst, Size ksize, double sigmaX, double sigmaY=0, int borderType=BORDER_DEFAULT );
void cv::GaussianBlur( InputArray _src, OutputArray _dst, Size ksize, double sigma1, double sigma2, int borderType ){ Mat src = _src.getMat(); _dst.create( src.size(), src.type() ); Mat dst = _dst.getMat(); if( borderType != BORDER_CONSTANT && (borderType & BORDER_ISOLATED) != 0 ) { if( src.rows == 1 ) ksize.height = 1; if( src.cols == 1 ) ksize.width = 1; } if( ksize.width == 1 && ksize.height == 1 ) { src.copyTo(dst); return; }#ifdef HAVE_TEGRA_OPTIMIZATION if(sigma1 == 0 && sigma2 == 0 && tegra::gaussian(src, dst, ksize, borderType)) return;#endif#if defined HAVE_IPP && (IPP_VERSION_MAJOR >= 7) if(src.type() == CV_32FC1 && sigma1 == sigma2 && ksize.width == ksize.height && sigma1 != 0.0 ) { IppiSize roi = {src.cols, src.rows}; int bufSize = 0; ippiFilterGaussGetBufferSize_32f_C1R(roi, ksize.width, &bufSize); AutoBuffer<uchar> buf(bufSize+128); if( ippiFilterGaussBorder_32f_C1R((const Ipp32f *)src.data, (int)src.step, (Ipp32f *)dst.data, (int)dst.step, roi, ksize.width, (Ipp32f)sigma1, (IppiBorderType)borderType, 0.0, alignPtr(&buf[0],32)) >= 0 ) return; }#endif Ptr<FilterEngine> f = createGaussianFilter( src.type(), ksize, sigma1, sigma2, borderType ); f->apply( src, dst );}二、边缘检测1、Sobel算子
//! applies generalized Sobel operator to the imageCV_EXPORTS_W void Sobel( InputArray src, OutputArray dst, int ddepth, int dx, int dy, int ksize=3, double scale=1, double delta=0, int borderType=BORDER_DEFAULT );
void cv::Sobel( InputArray _src, OutputArray _dst, int ddepth, int dx, int dy, int ksize, double scale, double delta, int borderType ){ Mat src = _src.getMat(); if (ddepth < 0) ddepth = src.depth(); _dst.create( src.size(), CV_MAKETYPE(ddepth, src.channels()) ); Mat dst = _dst.getMat();#ifdef HAVE_TEGRA_OPTIMIZATION if (scale == 1.0 && delta == 0) { if (ksize == 3 && tegra::sobel3x3(src, dst, dx, dy, borderType)) return; if (ksize == -1 && tegra::scharr(src, dst, dx, dy, borderType)) return; }#endif#if defined (HAVE_IPP) && (IPP_VERSION_MAJOR >= 7) if(dx < 3 && dy < 3 && src.channels() == 1 && borderType == 1) { if(IPPDeriv(src, dst, ddepth, dx, dy, ksize,scale)) return; }#endif int ktype = std::max(CV_32F, std::max(ddepth, src.depth())); Mat kx, ky; getDerivKernels( kx, ky, dx, dy, ksize, false, ktype ); if( scale != 1 ) { // usually the smoothing part is the slowest to compute, // so try to scale it instead of the faster differenciating part if( dx == 0 ) kx *= scale; else ky *= scale; } sepFilter2D( src, dst, ddepth, kx, ky, Point(-1,-1), delta, borderType );}
void cv::getDerivKernels( OutputArray kx, OutputArray ky, int dx, int dy, int ksize, bool normalize, int ktype ){ if( ksize <= 0 ) getScharrKernels( kx, ky, dx, dy, normalize, ktype ); else getSobelKernels( kx, ky, dx, dy, ksize, normalize, ktype );}
static void getScharrKernels( OutputArray _kx, OutputArray _ky, int dx, int dy, bool normalize, int ktype ){ const int ksize = 3; CV_Assert( ktype == CV_32F || ktype == CV_64F ); _kx.create(ksize, 1, ktype, -1, true); _ky.create(ksize, 1, ktype, -1, true); Mat kx = _kx.getMat(); Mat ky = _ky.getMat(); CV_Assert( dx >= 0 && dy >= 0 && dx+dy == 1 ); for( int k = 0; k < 2; k++ ) { Mat* kernel = k == 0 ? &kx : &ky; int order = k == 0 ? dx : dy; int kerI[3]; if( order == 0 ) kerI[0] = 3, kerI[1] = 10, kerI[2] = 3; else if( order == 1 ) kerI[0] = -1, kerI[1] = 0, kerI[2] = 1; Mat temp(kernel->rows, kernel->cols, CV_32S, &kerI[0]); double scale = !normalize || order == 1 ? 1. : 1./32; temp.convertTo(*kernel, ktype, scale); }}static void getSobelKernels( OutputArray _kx, OutputArray _ky, int dx, int dy, int _ksize, bool normalize, int ktype ){ int i, j, ksizeX = _ksize, ksizeY = _ksize; if( ksizeX == 1 && dx > 0 ) ksizeX = 3; if( ksizeY == 1 && dy > 0 ) ksizeY = 3; CV_Assert( ktype == CV_32F || ktype == CV_64F ); _kx.create(ksizeX, 1, ktype, -1, true); _ky.create(ksizeY, 1, ktype, -1, true); Mat kx = _kx.getMat(); Mat ky = _ky.getMat(); if( _ksize % 2 == 0 || _ksize > 31 ) CV_Error( CV_StsOutOfRange, "The kernel size must be odd and not larger than 31" ); vector<int> kerI(std::max(ksizeX, ksizeY) + 1); CV_Assert( dx >= 0 && dy >= 0 && dx+dy > 0 ); for( int k = 0; k < 2; k++ ) { Mat* kernel = k == 0 ? &kx : &ky; int order = k == 0 ? dx : dy; int ksize = k == 0 ? ksizeX : ksizeY; CV_Assert( ksize > order ); if( ksize == 1 ) kerI[0] = 1; else if( ksize == 3 ) { if( order == 0 ) kerI[0] = 1, kerI[1] = 2, kerI[2] = 1; else if( order == 1 ) kerI[0] = -1, kerI[1] = 0, kerI[2] = 1; else kerI[0] = 1, kerI[1] = -2, kerI[2] = 1; } else { int oldval, newval; kerI[0] = 1; for( i = 0; i < ksize; i++ ) kerI[i+1] = 0; for( i = 0; i < ksize - order - 1; i++ ) { oldval = kerI[0]; for( j = 1; j <= ksize; j++ ) { newval = kerI[j]+kerI[j-1]; kerI[j-1] = oldval; oldval = newval; } } for( i = 0; i < order; i++ ) { oldval = -kerI[0]; for( j = 1; j <= ksize; j++ ) { newval = kerI[j-1] - kerI[j]; kerI[j-1] = oldval; oldval = newval; } } } Mat temp(kernel->rows, kernel->cols, CV_32S, &kerI[0]); double scale = !normalize ? 1. : 1./(1 << (ksize-order-1)); temp.convertTo(*kernel, ktype, scale); }}2、
相关文章推荐
- android binder机制及其源码解析之第二节 重要函数讲解之常用数据结构(一)
- 6410的系统时钟设置(下)---几个常用函数的C源码
- android binder机制及其源码解析 之第二节重要函数讲解之常用数据结构(一)
- 帝国CMS源码中常用函数位置
- 【HGE引擎】源码解析——常用公共函数(二)
- 常用函数源码
- 常用位运算函数源码解析
- 【裸机开发笔记】6410的系统时钟设置(下)---几个常用函数的C源码。
- 帝国CMS源码中常用函数位置(一)
- highgui模块中常用函数源码
- 【裸机开发笔记】6410的系统时钟设置(下)---几个常用函数的C源码。
- 神经网络常用激活函数对比:sigmoid VS sofmax(附python源码)
- WordPress常用函数以及各模块源码文件名
- c++ string的一些常用函数的源码以及string的简单实现
- Android源码编译常用函数
- mochiweb源码阅读6-request模块常用函数说明
- ASP常用函数表(vbs)
- ASP常用的函数
- ASP常用的函数
- 面向对象的asp编程之四--一些常用的函数