热门标签 | 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);
}

推荐阅读
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文讨论了如何使用IF函数从基于有限输入列表的有限输出列表中获取输出,并提出了是否有更快/更有效的执行代码的方法。作者希望了解是否有办法缩短代码,并从自我开发的角度来看是否有更好的方法。提供的代码可以按原样工作,但作者想知道是否有更好的方法来执行这样的任务。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • 预备知识可参考我整理的博客Windows编程之线程:https:www.cnblogs.comZhuSenlinp16662075.htmlWindows编程之线程同步:https ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 本文讨论了Kotlin中扩展函数的一些惯用用法以及其合理性。作者认为在某些情况下,定义扩展函数没有意义,但官方的编码约定支持这种方式。文章还介绍了在类之外定义扩展函数的具体用法,并讨论了避免使用扩展函数的边缘情况。作者提出了对于扩展函数的合理性的质疑,并给出了自己的反驳。最后,文章强调了在编写Kotlin代码时可以自由地使用扩展函数的重要性。 ... [详细]
  • 本文介绍了机器学习手册中关于日期和时区操作的重要性以及其在实际应用中的作用。文章以一个故事为背景,描述了学童们面对老先生的教导时的反应,以及上官如在这个过程中的表现。同时,文章也提到了顾慎为对上官如的恨意以及他们之间的矛盾源于早年的结局。最后,文章强调了日期和时区操作在机器学习中的重要性,并指出了其在实际应用中的作用和意义。 ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
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社区 版权所有