opencv学习(五)线性滤波之方框滤波、均值滤波、高斯滤波

2023-10-31

滤波的目的:

1、抽出对象的特征作为图像识别的特征模式

2、适应图像处理的要求,消除图像数字化时所混入的噪声

平滑滤波是低频增强的空间域滤波技术,一般用来模糊图像或者消除噪声

这里我们简单谈空间域的滤波处理,主要是把滤波器想象成一个包含加权系数的窗口,平滑是,进行加权平均,得到像素点的值

1、方框滤波之BoxBlur函数

boxblur函数的作用是使用boxfilter(方框滤波器),从src输入,dst输出,如下:

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 );

各参数如下:

第一个参数、InputArray src:输入图像,Mat 类的对象

第二个参数、OutputArray dst:目标图像

第三个参数、int ddepth: 输入图像的深度,-1代表使用原图的深度

第四个参数、Size kize: 内核的大小,一般用Size(w,h)表示内核的大小

第五个参数、Point:默认值为(-1,-1)代表核的中心,其他的是需要被平滑的那个点

第六个参数、bool normalize:默认true。表示是否归一化,如果是的话,就相当于均值滤波

第七个参数、int borderType:这个不是很清楚,一般不管

2、均值滤波之blur函数

void blur( InputArray src, OutputArray dst,
                        Size ksize, Point anchor = Point(-1,-1),
                        int borderType = BORDER_DEFAULT );

具体参数和1方框滤波一样

第一个参数、InputArray src:输入图像,Mat 类的对象

第二个参数、OutputArray dst:目标图像

第三个参数、Size kize: 内核的大小,一般用Size(w,h)表示内核的大小

第四个参数、Point:默认值为(-1,-1)代表核的中心,其他的是需要被平滑的那个点

3、高斯滤波

先简单谈一下关于高斯滤波,之前我转过一篇文章

关于高斯滤波器的核参数获取

想了解相关原理的可以看看

这里先简单提一下

高斯滤波函数为:

离散的高斯卷积核H: (2k+1)×(2k+1)维,其元素计算方法为:

       其中Sigma为方差,k确定核矩阵的维数,关于这两个取值,在下文进行分析。

opencv中,关于高斯函数,有有两个设置方差的参数,具体如下

简单提了一个高斯函数,来具体看看Opencv是怎么实现的

void GaussianBlur( InputArray src, OutputArray dst, Size ksize,
                                double sigmaX, double sigmaY = 0,
                                int borderType = BORDER_DEFAULT );

第一个参数、InputArray src:输入图像,Mat 类的对象

第二个参数、OutputArray dst:目标图像

第三个参数、Size kize: 内核的大小,其中ksize.width金额ksize.height可以不同,但是必须是整数和奇数,或者0.腰要算sigma的

第四个参数、sigmaX:表示高斯核在X方向的标准偏差

第五个参数、sigmaY,表示高斯核在Y方向的标准偏差,如果为0,则设置为sigmaX,如果两个都是0,则有kisze的width和height计算出来

简单看一下个函数的使用情况吧,下面是一段小程序

#include "stdafx.h"

#include<opencv2/opencv.hpp>
using namespace cv;
using namespace std;


int main()
{
	Mat img = imread("F:/Digital-image-project/BMPimages/24-512-512.bmp");

	imshow("原图", img);
	Mat dstImg;

	boxFilter(img, dstImg, img.depth(), Size(5, 5));
	imshow("方框滤波", dstImg);

	blur(img, dstImg, Size(3, 3));
	imshow("均值滤波", dstImg);

	GaussianBlur(img, dstImg, Size(3, 3), 0,0);
	imshow("高斯滤波", dstImg);

	waitKey(0);
	return 0;
}

效果如下

现在来看看方框滤波的源码

void cv::boxFilter( InputArray _src, OutputArray _dst, int ddepth,
                Size ksize, Point anchor,
                bool normalize, int borderType )
/*第一个参数、InputArray src:输入图像,Mat 类的对象

第二个参数、OutputArray dst:目标图像

第三个参数、int ddepth: 输入图像的深度,-1代表使用原图的深度

第四个参数、Size kize: 内核的大小,一般用Size(w,h)表示内核的大小

第五个参数、Point:默认值为(-1,-1)代表核的中心,其他的是需要被平滑的那个点

第六个参数、bool normalize:默认true。表示是否归一化,如果是的话,就相当于均值滤波

第七个参数、int borderType:这个不是很清楚,一般不管*/
{
    CV_INSTRUMENT_REGION()

    CV_OCL_RUN(_dst.isUMat() &&
               (borderType == BORDER_REPLICATE || borderType == BORDER_CONSTANT ||
                borderType == BORDER_REFLECT || borderType == BORDER_REFLECT_101),
               ocl_boxFilter3x3_8UC1(_src, _dst, ddepth, ksize, anchor, borderType, normalize))

    CV_OCL_RUN(_dst.isUMat(), ocl_boxFilter(_src, _dst, ddepth, ksize, anchor, borderType, normalize))

    Mat src = _src.getMat();//复制原图的形参Mat数据到临时变量
    int stype = src.type(), sdepth = CV_MAT_DEPTH(stype), cn = CV_MAT_CN(stype);//得到深度、通道数
    if( ddepth < 0 )//处理depth小于0的情况
        ddepth = sdepth;
    _dst.create( src.size(), CV_MAKETYPE(ddepth, cn) );//初始化目标图
    Mat dst = _dst.getMat();//复制目标图的形参Mat数据到临时变量
    if( borderType != BORDER_CONSTANT && normalize && (borderType & BORDER_ISOLATED) != 0 )//处理borederType不为BORDER_CONSTANT等其他情况
    {
        if( src.rows == 1 )
            ksize.height = 1;
        if( src.cols == 1 )
            ksize.width = 1;
    }

    Point ofs;
    Size wsz(src.cols, src.rows);
    if(!(borderType&BORDER_ISOLATED))//处理borederType不为
        src.locateROI( wsz, ofs );

    CALL_HAL(boxFilter, cv_hal_boxFilter, src.ptr(), src.step, dst.ptr(), dst.step, src.cols, src.rows, sdepth, ddepth, cn,
             ofs.x, ofs.y, wsz.width - src.cols - ofs.x, wsz.height - src.rows - ofs.y, ksize.width, ksize.height,
             anchor.x, anchor.y, normalize, borderType&~BORDER_ISOLATED);

    CV_OVX_RUN(true,
               openvx_boxfilter(src, dst, ddepth, ksize, anchor, normalize, borderType))

    CV_IPP_RUN_FAST(ipp_boxfilter(src, dst, ksize, anchor, normalize, borderType));

    borderType = (borderType&~BORDER_ISOLATED);

    Ptr<FilterEngine> f = createBoxFilter( src.type(), dst.type(),//重点来看这个函数吧,调用DilterEngine引擎,正式开始滤波操作,Ptr是只能分配动态指针的模板类
                        ksize, anchor, normalize, borderType );

    f->apply( src, dst, wsz, ofs );//
}

从上面我们可以看到FilterEngine引擎承担了很大的作用,关于这个引擎的具体实现,笔者截止目前也没有搞清楚,就不献丑了,有兴趣的同学可以多查查资料

看一下均值滤波的源码

void cv::blur( InputArray src, OutputArray dst,
           Size ksize, Point anchor, int borderType )
{
    CV_INSTRUMENT_REGION()

    boxFilter( src, dst, -1, ksize, anchor, true, borderType );
}

哈哈,是不是很简单,直接调用方框滤波就可以了,只不过第6个参数设置成true,即方框滤波的标准化操作

高斯滤波的源码暂时看不懂

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

opencv学习(五)线性滤波之方框滤波、均值滤波、高斯滤波 的相关文章

  • 黑盒测试(实践)

    黑盒测试 实践 三角形问题 有一个程序 接收三个整数输入a b和c 分别表示三角形的三条边 a b和c的取值范围都为 1 100 程序根据输入的三条边判断三角形的类型 等边三角形 等腰三角形 普通三角形和不构成三角形 如果输入的a b和c不
  • Vue 学习 第一篇 初始 Vue

    一 MVVM 模式 1 MVVM MVVM 模式包含三个部分 M 模型 model V 视图 view VM 视图模型 view model 特点 实现了数据双向绑定 数据由模型进入视图 通过数据绑定实现 数据由视图进入模型 通过数据监听实
  • spring cloud系列学习(六、SpringCloud之 gateway网关)

    Spring Cloud Gateway 是基于 Spring Framework 5 0 和 Spring Boot 2 0 构建的 API 网关 提供路由等功能 其旨在提供一种简单而有效的方法路由到 API 并为它们提供跨领域的关注点
  • Onenote,Ulysses和Effie哪个更适合采编?

    众所周知 采编的工作和文字有着密不可分的联系 作为采编 不仅需要审核和修改别人的文字 还需要自己创作 可见写作在采编工作内容中占据着怎样重要的地位 那么对于采编工作者来说 是否有一款适合他们的写作软件呢 本文针对采编工作者的写作需求进行分析
  • 41 管理虚拟机可维护性-虚拟机NMI Watchdog

    文章目录 41 管理虚拟机可维护性 虚拟机NMI Watchdog 41 1 概述 41 2 注意事项 41 3 操作步骤 41 管理虚拟机可维护性 虚拟机NMI Watchdog 41 1 概述 NMI Watchdog是一种用来检测Li
  • midjourney/stable diffusion/太乙/文心一格/智源对比

    挑战周杰伦 稻香 MV画面生成 中英文绘画模型PK Midjourney DALL E2 Stable Diffusion 百度ERNIE ViLG 2 0 哔哩哔哩 bilibili本期视频小土同学使用周杰伦 稻香 评测了最近大热的 6
  • 人工智能开源项目

    基于TensorFlow的框架 https github com fchollet keras https github com tflearn tflearn https github com beniz deepdetect https
  • go 实现高效的 byte 连接

    在go语言中 bytes Buffer提供了高效的多个bytes连接 举个栗子 1 多个 byte 连接 b1 byte this is a first string b2 byte this is a second string var
  • stm32视频教程分享:心率检测仪的设计与实现

    stm32视频教程分享 心率检测仪的设计与实现 STM32系列是基于专为要求高性能 低成本 低功耗的嵌入式应用专门设计的ARM Cortex M3内核 本项目主要讲述了通过心律传感器采集我们的心律数据 然后通过串口传送到上位机中 上位机用Q
  • 前端笔试面试题目整理(持续更新)

    一 JS 1 前端开发面试题 应届生 js基础算法题 2 VK的秋招前端奇遇记 一 3 VK的秋招前端奇遇记 二 4 送你 43 道 JS 面试题 送你58道JavaScript面试题 28 道 JavaScript 面试题 看看能错几道
  • javascript用面向过程写贪吃蛇游戏

    下面是HTML与CSS的代码 CSS
  • 判断二叉树是否为完全二叉树

    判断二叉树是否为完全二叉树 提示 本节仍然是重点说二叉树的DP递归套路 非常重要而且容易理解 二叉树的动态规划树形DP递归套路系列文章有这些 可以帮助你快速掌握树形DP的题目解题思想 就一个套路 1 判断二叉树是否为平衡二叉树 树形DP 树
  • Golang math基本数学函数

    三角函数 正弦函数 反正弦函数 双曲正弦 反双曲正弦 func Sin x float64 float64 func Asin x float64 float64 func Sinh x float64 float64 func Asinh
  • JAVA中MD5加密解密(MD5工具类)

    ASCII American Standard Code for Information Interchange 美国信息交换标准代码 http ascii 911cha com 工具类如下 import org apache common
  • 一天高中的女同桌突然问我是不是程序员,满脸黑人问号?

    背景 昨天一个我高中的女同桌突然发微信问我 你是不是程序猿 我有问题求助 先是激动后是茫然再是冷静 毕业多年不见联系 突然发个信息求助 感觉大脑有点反应不过来 再说我一个搞Python的 这点要求大家懂的 人生苦短 我用Python 为了大
  • Matlab实现神经网络RBF和PNN算法(附上完整源码)

    神经网络是一种模拟人类大脑的计算模型 能够通过学习和适应来解决各种问题 其中RBF和PNN是常用的神经网络算法 本文将介绍如何使用Matlab实现这两种算法 一 RBF算法 RBF Radial Basis Function 算法是一种基于
  • 考研数二第十一讲 罗尔中值和拉格朗日定理与柯西中值定理

    对柯西中值定理 拉格朗日中值定理的理解及应用 关于罗尔中值定理一定要理解含义 学会分析罗尔中值定理的充分条件 构造对应符合条件的函数 这样就可以利用罗尔中值定理求得函数在定义区域里可得至少一点x 使得f x 0 拉格朗日定义和柯西中值都是可
  • 保存网页图片的八种方法

    为了增加互动性和美观 现在的网页中都有许多精美的图片 这些都是网页制作者精心制作出来的 如果你想拿来为自己所用就必须把它们保存下来 另外 在一些电子书中也有精美的图片 为了防止有人复制 作者禁用了鼠标右键无法直接下载 针对以上情况 我们可以
  • Python 操作 Word

    上次给大家介绍了 Python 如何操作 Excel 是不是感觉还挺有趣的 今天为大家再介绍下 用 Python 如何操作 Word 这个可能跟数据处理关系不大 用的也不多 不过可以先了解下都能实现什么功能 以备不时之需 安装 python

随机推荐