OpenCV每日函数 图像过滤模块 (8) GaussianBlur高斯模糊函数
一、概述
使用高斯滤镜模糊图像。该函数将源图像与指定的高斯核进行卷积。
在图像处理中,高斯模糊(也称为高斯平滑)是通过高斯函数(以数学家和科学家卡尔弗里德里希高斯命名)对图像进行模糊处理的结果。
它是图形软件中广泛使用的效果,通常用于减少图像噪声和减少细节。这种模糊技术的视觉效果是一种类似于通过半透明屏幕观看图像的平滑模糊效果,与散焦镜头或通常照明下物体的阴影产生 的散景效果明显不同。
高斯平滑也被用作计算机视觉算法的预处理阶段,以增强不同尺度的图像结构。
二、GaussianBlur函数
1、函数原型
cv::GaussianBlur (InputArray src, OutputArray dst, Size ksize, double sigmaX, double sigmaY=0, int borderType=BORDER_DEFAULT)
2、参数详解
src | 输入图像; 图像可以有任意数量的通道,它们是独立处理的,但深度应该是 CV_8U、CV_16U、CV_16S、CV_32F 或 CV_64F。 |
dst | 输出与 src 大小和类型相同的图像。 |
ksize | 高斯核大小。 ksize.width 和 ksize.height 可以不同,但它们都必须是正数和奇数。 或者,它们可以是零,然后根据 sigma 计算它们。 |
sigmaX | X 方向的高斯核标准差。 |
sigmaY | Y方向的高斯核标准差; 如果 sigmaY 为零,则设置为等于 sigmaX,如果两个 sigma 均为零,则分别从 ksize.width 和 ksize.height 计算(详见 getGaussianKernel); 为了完全控制结果,无论将来可能修改所有这些语义,建议指定所有 ksize、sigmaX 和 sigmaY。 |
borderType | 像素外推法,请参阅 BorderTypes。 不支持 BORDER_WRAP。 |
三、OpenCV源码
1、源码路径
opencv\modules\imgproc\src\smooth.dispatch.cpp
2、源码代码
void GaussianBlur(InputArray _src, OutputArray _dst, Size ksize,double sigma1, double sigma2,int borderType)
{CV_INSTRUMENT_REGION();CV_Assert(!_src.empty());int type = _src.type();Size size = _src.size();_dst.create( size, type );if( (borderType & ~BORDER_ISOLATED) != BORDER_CONSTANT &&((borderType & BORDER_ISOLATED) != 0 || !_src.getMat().isSubmatrix()) ){if( size.height == 1 )ksize.height = 1;if( size.width == 1 )ksize.width = 1;}if( ksize.width == 1 && ksize.height == 1 ){_src.copyTo(_dst);return;}bool useOpenCL = ocl::isOpenCLActivated() && _dst.isUMat() && _src.dims() <= 2 &&_src.rows() >= ksize.height && _src.cols() >= ksize.width &&ksize.width > 1 && ksize.height > 1;CV_UNUSED(useOpenCL);int sdepth = CV_MAT_DEPTH(type), cn = CV_MAT_CN(type);Mat kx, ky;createGaussianKernels(kx, ky, type, ksize, sigma1, sigma2);CV_OCL_RUN(useOpenCL && sdepth == CV_8U &&((ksize.width == 3 && ksize.height == 3) ||(ksize.width == 5 && ksize.height == 5)),ocl_GaussianBlur_8UC1(_src, _dst, ksize, CV_MAT_DEPTH(type), kx, ky, borderType));if(sdepth == CV_8U && ((borderType & BORDER_ISOLATED) || !_src.isSubmatrix())){std::vector<ufixedpoint16> fkx, fky;createGaussianKernels(fkx, fky, type, ksize, sigma1, sigma2);static bool param_check_gaussian_blur_bitexact_kernels = utils::getConfigurationParameterBool("OPENCV_GAUSSIANBLUR_CHECK_BITEXACT_KERNELS", false);if (param_check_gaussian_blur_bitexact_kernels && !validateGaussianBlurKernel(fkx)){CV_LOG_INFO(NULL, "GaussianBlur: bit-exact fx kernel can't be applied: ksize=" << ksize << " sigma=" << Size2d(sigma1, sigma2));}else if (param_check_gaussian_blur_bitexact_kernels && !validateGaussianBlurKernel(fky)){CV_LOG_INFO(NULL, "GaussianBlur: bit-exact fy kernel can't be applied: ksize=" << ksize << " sigma=" << Size2d(sigma1, sigma2));}else{CV_OCL_RUN(useOpenCL,ocl_sepFilter2D_BitExact(_src, _dst, sdepth,ksize,(const uint16_t*)&fkx[0], (const uint16_t*)&fky[0],Point(-1, -1), 0, borderType,8/*shift_bits*/));Mat src = _src.getMat();Mat dst = _dst.getMat();if (src.data == dst.data)src = src.clone();CV_CPU_DISPATCH(GaussianBlurFixedPoint, (src, dst, (const uint16_t*)&fkx[0], (int)fkx.size(), (const uint16_t*)&fky[0], (int)fky.size(), borderType),CV_CPU_DISPATCH_MODES_ALL);return;}}if(sdepth == CV_16U && ((borderType & BORDER_ISOLATED) || !_src.isSubmatrix())){CV_LOG_INFO(NULL, "GaussianBlur: running bit-exact version...");std::vector<ufixedpoint32> fkx, fky;createGaussianKernels(fkx, fky, type, ksize, sigma1, sigma2);static bool param_check_gaussian_blur_bitexact_kernels = utils::getConfigurationParameterBool("OPENCV_GAUSSIANBLUR_CHECK_BITEXACT_KERNELS", false);if (param_check_gaussian_blur_bitexact_kernels && !validateGaussianBlurKernel(fkx)){CV_LOG_INFO(NULL, "GaussianBlur: bit-exact fx kernel can't be applied: ksize=" << ksize << " sigma=" << Size2d(sigma1, sigma2));}else if (param_check_gaussian_blur_bitexact_kernels && !validateGaussianBlurKernel(fky)){CV_LOG_INFO(NULL, "GaussianBlur: bit-exact fy kernel can't be applied: ksize=" << ksize << " sigma=" << Size2d(sigma1, sigma2));}else{// TODO: implement ocl_sepFilter2D_BitExact -- how to deal with bdepth?// CV_OCL_RUN(useOpenCL,// ocl_sepFilter2D_BitExact(_src, _dst, sdepth,// ksize,// (const uint32_t*)&fkx[0], (const uint32_t*)&fky[0],// Point(-1, -1), 0, borderType,// 16/*shift_bits*/)// );Mat src = _src.getMat();Mat dst = _dst.getMat();if (src.data == dst.data)src = src.clone();CV_CPU_DISPATCH(GaussianBlurFixedPoint, (src, dst, (const uint32_t*)&fkx[0], (int)fkx.size(), (const uint32_t*)&fky[0], (int)fky.size(), borderType),CV_CPU_DISPATCH_MODES_ALL);return;}}#ifdef HAVE_OPENCLif (useOpenCL){sepFilter2D(_src, _dst, sdepth, kx, ky, Point(-1, -1), 0, borderType);return;}
#endifMat src = _src.getMat();Mat dst = _dst.getMat();Point ofs;Size wsz(src.cols, src.rows);if(!(borderType & BORDER_ISOLATED))src.locateROI( wsz, ofs );CALL_HAL(gaussianBlur, cv_hal_gaussianBlur, src.ptr(), src.step, dst.ptr(), dst.step, src.cols, src.rows, sdepth, cn,ofs.x, ofs.y, wsz.width - src.cols - ofs.x, wsz.height - src.rows - ofs.y, ksize.width, ksize.height,sigma1, sigma2, borderType&~BORDER_ISOLATED);CV_OVX_RUN(true,openvx_gaussianBlur(src, dst, ksize, sigma1, sigma2, borderType))#if defined ENABLE_IPP_GAUSSIAN_BLUR// IPP is not bit-exact to OpenCV implementationCV_IPP_RUN_FAST(ipp_GaussianBlur(src, dst, ksize, sigma1, sigma2, borderType));
#endifsepFilter2D(src, dst, sdepth, kx, ky, Point(-1, -1), 0, borderType);
}
四、效果图像示例
OpenCV每日函数 图像过滤模块 (8) GaussianBlur高斯模糊函数相关推荐
- OpenCV每日函数 图像过滤模块 (6) erode腐蚀函数
一.概述 使用特定的结构元素腐蚀图像.该函数使用指定的结构元素腐蚀源图像,该结构元素确定取最小值的像素邻域的形状: 侵蚀可以应用数次(迭代). 在多通道图像的情况下,每个通道都是独立处理的. 膨胀: ...
- OpenCV每日函数 图像过滤模块 (1) bilateralFilter函数(双边滤波)
一.概述 过滤可能是图像处理和计算机视觉中最基本的操作.在术语"过滤"的最广义上,过滤图像在给定位置的值是输入图像在同一位置的小邻域中的值的函数. 例如,高斯低通滤波计算邻域中像素 ...
- OpenCV每日函数 图像过滤模块 (5) dilate膨胀函数
一.概述 通过使用特定的结构元素来扩大图像.该函数使用指定的结构元素扩展源图像,该结构元素确定取最大值的像素邻域的形状: 膨胀可以应用数次(迭代). 在多通道图像的情况下,每个通道都是独立处理的. 膨 ...
- OpenCV每日函数 计算摄影模块(1) 图像修复算法 inpaint函数
一.概述 该算法使用区域邻域恢复图像中的选定区域.该功能可用于去除扫描照片上的灰尘和划痕,或去除静止图像或视频中不需要的物体. 二.inpaint函数 1.函数原型 void cv::inpaint ...
- OpenCV每日函数 几何图像变换模块 (8) remap函数
一.概述 对图像应用通用几何变换.函数 remap 使用指定的映射转换源图像: 其中具有非整数坐标的像素值是使用一种可用的插值方法计算的. mapx 和 mapy 可以分别编码为 map1 和 map ...
- OpenCV每日函数 几何图像变换模块 (7) linearPolar函数/logPolar函数/warpPolar函数
一.概述 linearPolar函数将图像重新映射到极坐标空间,不过此函数已经废弃(实际在源码中也是调用了warpPolar函数),可以使用warpPolar函数替代. logPolar函数将图像重新 ...
- OpenCV每日函数 几何图像变换模块 (9) resize函数
一.概述 调整图像大小.函数 resize 将图像 src 的大小缩小到或最大到指定的大小. 请注意,不考虑初始 dst 类型或大小. 相反,大小和类型是从 src.dsize.fx 和 fy 派生的 ...
- OpenCV每日函数 计算摄影模块(5) 无缝克隆算法
一.概述 借助无缝克隆算法,您可以从一张图像中复制一个对象,然后将其粘贴到另一张图像中,从而形成一个看起来无缝且自然的构图. 二.函数原型 给定一个原始彩色图像,可以无缝混合该图像的两个不同颜色版本. ...
- OpenCV每日函数 几何图像变换模块 (1) convertMaps函数
一.概述 将图像转换映射从一种表示转换为另一种表示.该函数将一对用于重映射的映射从一种表示转换为另一种表示. 支持以下选项( (map1.type(), map2.type()) → (dstmap1 ...
最新文章
- [Android Studio 权威教程]Windows下安装Android Studio
- SaltStack 安装及配置认证
- Java注释教程– ULTIMATE指南(PDF下载)
- php属性未定义,PHP-警告-未定义的属性:stdClass-修复?
- python-next
- 路由器(Tenda 811R)变砖——修复
- CUMCM→MCM/ICM→NPMCM:关于国赛(全国大学生、研究生、博士研究生数学建模竞赛)和美赛中的数学的专业词汇详细攻略—美国数学建模竞赛
- 毕业论文概念界定要怎么写?
- 解决拯救者Y7000打游戏,看视频没有声音的问题
- Intent跳转地图应用(百度地图、高德地图)
- 13.深入浅出:负反馈放大电路稳定性(自激振荡)——参考《模拟电子技术基础》清华大学华成英主讲
- catkin build 工作空间锁定 —— [build] Error: Unable to find source space `/home/xxx/src`
- 在计算机英语中memory,memory是什么 memory什么意思
- c语言1e5是什么类型,c语言基础知识
- 自顶向下计算机网络 传输层
- 抖音春晚撒了12亿红包,这钱花的值不值?
- PPT转PDF怎么转?这几种转换小技巧轻松拿捏
- 用Java为视频添加图片水印(类似直播)
- WordPress企业站建站主题avada v7.7.1免授权开心版带完整汉化包
- 2021北京交通大学计算机专硕初试经验分享
热门文章
- Push failed Dst refspec V1.0.0 matches more than one.
- u盘硬盘数据损坏丢失如何恢复?高恢复率高的数据恢复软件
- fl2440串口编程
- 麻省理工学院计算机博士毕业,努力比起点更重要!有高职院校学生,拿下麻省理工大学博士offer...
- UVa11549 Calculator Conundrum
- 设计一个小型的物联网应用系统_物联网应用设计需注意的连接器要求
- 谷歌地图 替代_Google地图的替代品
- 从云技术风向标看2022企业数字化转型战略方向
- Cortex-M系列的优劣对比
- 基于Multisim的声光控制路灯电路设计