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

推荐阅读
  • 本文将深入探讨 Unreal Engine 4 (UE4) 中的距离场技术,包括其原理、实现细节以及在渲染中的应用。距离场技术在现代游戏引擎中用于提高光照和阴影的效果,尤其是在处理复杂几何形状时。文章将结合具体代码示例,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 深入解析Dubbo:使用与源码分析
    本文详细介绍了Dubbo的使用方法和源码分析,涵盖其架构设计、核心特性和调用流程。 ... [详细]
  • 在1995年,Simon Plouffe 发现了一种特殊的求和方法来表示某些常数。两年后,Bailey 和 Borwein 在他们的论文中发表了这一发现,这种方法被命名为 Bailey-Borwein-Plouffe (BBP) 公式。该问题要求计算圆周率 π 的第 n 个十六进制数字。 ... [详细]
  • 本文介绍了SIP(Session Initiation Protocol,会话发起协议)的基本概念、功能、消息格式及其实现机制。SIP是一种在IP网络上用于建立、管理和终止多媒体通信会话的应用层协议。 ... [详细]
  • Irish budget airline Ryanair announced plans to significantly increase its route network from Frankfurt Airport, marking a direct challenge to Lufthansa, Germany's leading carrier. ... [详细]
  • 本文详细介绍了如何正确设置Shadowsocks公共代理,包括调整超时设置、检查系统限制、防止滥用及遵守DMCA法规等关键步骤。 ... [详细]
  • 管理UINavigationController中的手势返回 - Managing Swipe Back Gestures in UINavigationController
    本文介绍了如何在一个简单的闪存卡片应用中实现平滑的手势返回功能,以增强用户体验。 ... [详细]
  • Docker安全策略与管理
    本文探讨了Docker的安全挑战、核心安全特性及其管理策略,旨在帮助读者深入理解Docker安全机制,并提供实用的安全管理建议。 ... [详细]
  • 本文详细介绍了Oracle 11g中的创建表空间的方法,以及如何设置客户端和服务端的基本配置,包括用户管理、环境变量配置等。 ... [详细]
  • 本文详细介绍了如何在Oracle VM VirtualBox中实现主机与虚拟机之间的数据交换,包括安装Guest Additions增强功能,以及如何利用这些功能进行文件传输、屏幕调整等操作。 ... [详细]
  • 本文详细介绍了JQuery Mobile框架中特有的事件和方法,帮助开发者更好地理解和应用这些特性,提升移动Web开发的效率。 ... [详细]
  • 本文探讨了在Windows系统中运行Apache服务器时频繁出现崩溃的问题,并提供了多种可能的解决方案和建议。错误日志显示多个子进程因达到最大请求限制而退出。 ... [详细]
  • 在尝试通过自定义端口部署Spring Cloud Eureka时遇到了连接失败的问题。本文详细描述了问题的现象,并提供了有效的解决方案,以帮助遇到类似情况的开发者。 ... [详细]
  • 本文详细介绍了Elasticsearch中的分页查询机制,包括基本的分页查询流程、'from-size'浅分页与'scroll'深分页的区别及应用场景,以及两者在性能上的对比。 ... [详细]
  • Level:  Medium题目描述:Givenanon-emptystringsandadictionarywordDictcontainingalistofnon-emptyw ... [详细]
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社区 版权所有