热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

双边滤波OpenCV源码

双边滤波OpenCV源码1、源码路径2、源码代码1、源码路径OpenCV\modules\opencv_imgproc\Src\bilateral_filter.dispatch


双边滤波OpenCV源码

  • 1、源码路径
  • 2、源码代码


1、源码路径

OpenCV\modules\opencv_imgproc\Src\bilateral_filter.dispatch.cpp

OpenCV双边滤波函数所在路径


2、源码代码

void bilateralFilter( InputArray _src, OutputArray _dst, int d,double sigmaColor, double sigmaSpace,int borderType )
{CV_INSTRUMENT_REGION();CV_Assert(!_src.empty());_dst.create( _src.size(), _src.type() );CV_OCL_RUN(_src.dims() <&#61; 2 && _dst.isUMat(),ocl_bilateralFilter_8u(_src, _dst, d, sigmaColor, sigmaSpace, borderType))Mat src &#61; _src.getMat(), dst &#61; _dst.getMat();CV_IPP_RUN_FAST(ipp_bilateralFilter(src, dst, d, sigmaColor, sigmaSpace, borderType));if( src.depth() &#61;&#61; CV_8U )bilateralFilter_8u( src, dst, d, sigmaColor, sigmaSpace, borderType );else if( src.depth() &#61;&#61; CV_32F )bilateralFilter_32f( src, dst, d, sigmaColor, sigmaSpace, borderType );elseCV_Error( CV_StsUnsupportedFormat,"Bilateral filtering is only implemented for 8u and 32f images" );
}

static void
bilateralFilter_32f( const Mat& src, Mat& dst, int d,double sigma_color, double sigma_space,int borderType )
{CV_INSTRUMENT_REGION();int cn &#61; src.channels();int i, j, maxk, radius;double minValSrc&#61;-1, maxValSrc&#61;1;const int kExpNumBinsPerChannel &#61; 1 << 12;int kExpNumBins &#61; 0;float lastExpVal &#61; 1.f;float len, scale_index;CV_Assert( (src.type() &#61;&#61; CV_32FC1 || src.type() &#61;&#61; CV_32FC3) && src.data !&#61; dst.data );if( sigma_color <&#61; 0 )sigma_color &#61; 1;if( sigma_space <&#61; 0 )sigma_space &#61; 1;double gauss_color_coeff &#61; -0.5/(sigma_color*sigma_color);double gauss_space_coeff &#61; -0.5/(sigma_space*sigma_space);if( d <&#61; 0 )radius &#61; cvRound(sigma_space*1.5);elseradius &#61; d/2;radius &#61; MAX(radius, 1);d &#61; radius*2 &#43; 1;// compute the min/max range for the input image (even if multichannel)minMaxLoc( src.reshape(1), &minValSrc, &maxValSrc );if(std::abs(minValSrc - maxValSrc) < FLT_EPSILON){src.copyTo(dst);return;}// temporary copy of the image with borders for easy processingMat temp;copyMakeBorder( src, temp, radius, radius, radius, radius, borderType );// allocate lookup tablesstd::vector<float> _space_weight(d*d);std::vector<int> _space_ofs(d*d);float* space_weight &#61; &_space_weight[0];int* space_ofs &#61; &_space_ofs[0];// assign a length which is slightly more than neededlen &#61; (float)(maxValSrc - minValSrc) * cn;kExpNumBins &#61; kExpNumBinsPerChannel * cn;std::vector<float> _expLUT(kExpNumBins&#43;2);float* expLUT &#61; &_expLUT[0];scale_index &#61; kExpNumBins/len;// initialize the exp LUTfor( i &#61; 0; i < kExpNumBins&#43;2; i&#43;&#43; ){if( lastExpVal > 0.f ){double val &#61; i / scale_index;expLUT[i] &#61; (float)std::exp(val * val * gauss_color_coeff);lastExpVal &#61; expLUT[i];}elseexpLUT[i] &#61; 0.f;}// initialize space-related bilateral filter coefficientsfor( i &#61; -radius, maxk &#61; 0; i <&#61; radius; i&#43;&#43; )for( j &#61; -radius; j <&#61; radius; j&#43;&#43; ){double r &#61; std::sqrt((double)i*i &#43; (double)j*j);if( r > radius || ( i &#61;&#61; 0 && j &#61;&#61; 0 ) )continue;space_weight[maxk] &#61; (float)std::exp(r*r*gauss_space_coeff);space_ofs[maxk&#43;&#43;] &#61; (int)(i*(temp.step/sizeof(float)) &#43; j*cn);}// parallel_for usageCV_CPU_DISPATCH(bilateralFilterInvoker_32f, (cn, radius, maxk, space_ofs, temp, dst, scale_index, space_weight, expLUT),CV_CPU_DISPATCH_MODES_ALL);
}

static void
bilateralFilter_8u( const Mat& src, Mat& dst, int d,double sigma_color, double sigma_space,int borderType )
{CV_INSTRUMENT_REGION();int cn &#61; src.channels();int i, j, maxk, radius;CV_Assert( (src.type() &#61;&#61; CV_8UC1 || src.type() &#61;&#61; CV_8UC3) && src.data !&#61; dst.data );if( sigma_color <&#61; 0 )sigma_color &#61; 1;if( sigma_space <&#61; 0 )sigma_space &#61; 1;double gauss_color_coeff &#61; -0.5/(sigma_color*sigma_color);double gauss_space_coeff &#61; -0.5/(sigma_space*sigma_space);if( d <&#61; 0 )radius &#61; cvRound(sigma_space*1.5);elseradius &#61; d/2;radius &#61; MAX(radius, 1);d &#61; radius*2 &#43; 1;Mat temp;copyMakeBorder( src, temp, radius, radius, radius, radius, borderType );std::vector<float> _color_weight(cn*256);std::vector<float> _space_weight(d*d);std::vector<int> _space_ofs(d*d);float* color_weight &#61; &_color_weight[0];float* space_weight &#61; &_space_weight[0];int* space_ofs &#61; &_space_ofs[0];// initialize color-related bilateral filter coefficientsfor( i &#61; 0; i < 256*cn; i&#43;&#43; )color_weight[i] &#61; (float)std::exp(i*i*gauss_color_coeff);// initialize space-related bilateral filter coefficientsfor( i &#61; -radius, maxk &#61; 0; i <&#61; radius; i&#43;&#43; ){j &#61; -radius;for( ; j <&#61; radius; j&#43;&#43; ){double r &#61; std::sqrt((double)i*i &#43; (double)j*j);if( r > radius )continue;space_weight[maxk] &#61; (float)std::exp(r*r*gauss_space_coeff);space_ofs[maxk&#43;&#43;] &#61; (int)(i*temp.step &#43; j*cn);}}CV_CPU_DISPATCH(bilateralFilterInvoker_8u, (dst, temp, radius, maxk, space_ofs, space_weight, color_weight),CV_CPU_DISPATCH_MODES_ALL);
}

推荐阅读
  • 本文介绍了如何使用Express App提供静态文件,同时提到了一些不需要使用的文件,如package.json和/.ssh/known_hosts,并解释了为什么app.get('*')无法捕获所有请求以及为什么app.use(express.static(__dirname))可能会提供不需要的文件。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 本文讨论了Kotlin中扩展函数的一些惯用用法以及其合理性。作者认为在某些情况下,定义扩展函数没有意义,但官方的编码约定支持这种方式。文章还介绍了在类之外定义扩展函数的具体用法,并讨论了避免使用扩展函数的边缘情况。作者提出了对于扩展函数的合理性的质疑,并给出了自己的反驳。最后,文章强调了在编写Kotlin代码时可以自由地使用扩展函数的重要性。 ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
author-avatar
苏小宝
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有