我的编程空间,编程开发者的网络收藏夹
学习永远不晚

OpenCV图像处理之自定义滤波

短信预约 信息系统项目管理师 报名、考试、查分时间动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

OpenCV图像处理之自定义滤波

目录
  • 1 空间滤波
    • 1.1 滤波过程
    • 1.2 相关和卷积
  • 2 OpenCV 函数
    • 2.1 filter2D 函数
    • 2.2 flip 函数
  • 3 代码示例
    • 3.1 偏导数
  • 参考资料
    • 总结

      图像处理中,"空间域" 指的是图像平面,因此,空间滤波可定义为:在图像平面内对像素灰度值进行的滤波

      1 空间滤波

      1.1 滤波过程

      如图,Filter 是一个 3x3 滤波核,当它从图像的左上角开始,逐个像素沿水平方向扫描,最后到右下角时,便会产生滤波后的图像

      假设输入图像 $f(x, y)$,滤波后的图像为$g(x, y)$,则其中$g(2,2)$ 和 $g(4,4)$ 的计算过程如下:

      上图中,以像素 (4,4) 为中心的 3x3 邻域,和滤波核的向量点乘之积,即为 g(4,4)

      g(4,4) = 240*0.1111 + 183*0.1111 + 0*0.1111 + 250*0.1111 + 12*0.1111 + 87*0.1111 + 255*0.1111 + 1*0.1111 + 94*0.1111

      = 26.6666 + 20.3333 + 0 + 27.7777 + 1.3333 + 9.6666 + 28.3333 + 0 + 10.4444

      = 124.55

      1.2 相关和卷积

      空间滤波中,相关和卷积,是容易混淆的概念,定义如下:

      -相关 (Correlation),和上述的滤波过程一样,即 滤波核 逐行扫描图像,并计算每个位置像素点积的过程

      -卷积 (Convolution),和 "相关" 过程类似,但 滤波核 要先旋转 180°,然后再执行和 “相关” 一样的操作

      (二维中的旋转 180°,等于滤波核沿一个坐标轴翻转,然后再沿另一个坐标轴翻转)

      注意:如果滤波核是对称的,则对图像进行相关和卷积的结果是一致的

      2 OpenCV 函数

      2.1 filter2D 函数

      在 OpenCV 中,可自定义滤波核,然后通过 filter2D() 来完成图像滤波

      
      void filter2D(
           InputArray     class="lazy" data-src,              // 输入图像 
           OutputArray    dst,              // 输出图像(大小和通道数,同 class="lazy" data-src)
           int            ddepth,           // 输出图像的 depth
           InputArray     kernel,           // 滤波核,准确地说,是相关核
           Point  anchor = Point(-1,-1),    // 锚点位置,滤波核尺寸为奇数时,不用指定,一般取默认值 Point(-1,-1);滤波核尺寸为偶数时,需指定锚点位置
           double             delta = 0,    // optional value added to the filtered pixels before storing them in dst      
           int borderType = BORDER_DEFAULT  // 边界处理方法
       );

      filter2D() 求的是相关,并非卷积,只有当滤波核对称时,filte2D() 才可视为卷积运算,其公式如下:

      假定滤波核 kernel 大小为 3x3,以一个像素点 class="lazy" data-src(4,4) 为例,则有:

      dst(4,4) = kernel(0,0)*class="lazy" data-src(4+0-1, 4+0-1) + kernel(0,1)*class="lazy" data-src(4+0-1, 4+1-1) + kernel(0,2)*class="lazy" data-src(4+0-1, 4+2-1)

      + kernel(1,0)*class="lazy" data-src(4+1-1, 4+0-1) + kernel(1,1)*class="lazy" data-src(4+1-1, 4+1-1) + kernel(1,2)*class="lazy" data-src(4+1-1, 4+2-1)

      + kernel(2,0)*class="lazy" data-src(4+2-1, 4+0-1) + kernel(2,1)*class="lazy" data-src(4+2-1, 4+1-1) + kernel(2,2)*class="lazy" data-src(4+2-1, 4+2-1)

      滤波核与输入图像的卷积点乘,对应关系如下:

      2.2 flip 函数

      当滤波核不对称时,要得到真正的卷积运算,还需 flip() 函数来完成 kernel 的二维翻转

      如果滤波核的大小为奇数,则 filter2D() 中的锚点位置可设为 Point(-1,-1),此时,默认滤波核的中心为锚点;如果滤波核的大小为偶数,则需要自定义锚点位置

      OpenCV 中锚点位置的实现函数normalizeAnchor() 如下:

      
        void flip(
            InputArray  class="lazy" data-src,  // input array
            OutputArray dst,  // output array
            int    flipCode   // 0, flip around x-axis; positive value, flip around y-axis; negative value, flip around both axes.
        );

      3 代码示例

      3.1 偏导数

      自定义滤波核,利用 filter2D() 函数,实现图像的一阶和二阶偏导运算

      1) 一阶偏导

      图像在 x 和 y 方向的一阶偏导如下:

      对应滤波核为

      2) 二阶偏导

      同样,在 x 和 y 方向的二阶偏导如下:

      对应滤波核为

      2 代码示例

      
      #include "opencv2/imgproc.hpp"
      #include "opencv2/highgui.hpp"
      
      using namespace cv;
      
      int main()
      {
          // 读取图像
          Mat class="lazy" data-src = imread("fangtze.jpg", IMREAD_GRAYSCALE);
          if (class="lazy" data-src.empty()) {
              return -1;
          }
      
          Mat kx = (Mat_<float>(1, 2) << -1, 1);  // 1行2列的 dx 滤波核
          Mat ky = (Mat_<float>(2, 1) << -1, 1);  // 2行1列的 dy 滤波核
      
          Mat kxx = (Mat_<float>(1, 3) << 1, -2, 1);     // 1行3列的 dxx 滤波核
          Mat kyy = (Mat_<float>(3, 1) << 1, -2, 1);     // 3行1列的 dyy 滤波核
          Mat kxy = (Mat_<float>(2, 2) << 1, -1, -1, 1); // 2行2列的 dxy 滤波核
      
          // 一阶偏导
          Mat dx, dy;
          filter2D(class="lazy" data-src, dx, CV_32FC1, kx);
          filter2D(class="lazy" data-src, dy, CV_32FC1, ky);
      
          // 二阶偏导
          Mat dxx, dyy, dxy;
          filter2D(class="lazy" data-src, dxx, CV_32FC1, kxx);
          filter2D(class="lazy" data-src, dyy, CV_32FC1, kyy);
          filter2D(class="lazy" data-src, dxy, CV_32FC1, kxy);
      
          // 显示图像
          imshow("dx", dx);
      
          waitKey();
      }

      输出的偏导图像如下,第一行从左到右:原图 - dx - dy;第二行从左至右:dxy - dxx -dyy

      参考资料

      OpenCV Tutorials / imgproc module /Making your own linear filters

      Gonzalez,《Digital Image Processing》4th ch3 Intesity Transformations and Spatial Filtering

      CS425 Lab: Intensity Transformations and Spatial Filtering

      总结

      到此这篇关于OpenCV图像处理之自定义滤波的文章就介绍到这了,更多相关OpenCV自定义滤波内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

      免责声明:

      ① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

      ② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

      OpenCV图像处理之自定义滤波

      下载Word文档到电脑,方便收藏和打印~

      下载Word文档

      猜你喜欢

      OpenCV图像处理之自定义滤波

      目录1 空间滤波1.1 滤波过程1.2 相关和卷积2 OpenCV 函数2.1 filter2D 函数2.2 flip 函数3 代码示例3.1 偏导数参考资料总结图像处理中,"空间域" 指的是图像平面,因此,空间滤波可定义为:在图像平面内对
      2022-06-02

      Java OpenCV中怎么自定义图像滤波算子

      今天小编给大家分享一下Java OpenCV中怎么自定义图像滤波算子的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。示例代码p
      2023-06-29

      OpenCV学习之图像加噪与滤波的实现详解

      这篇文章主要为大家详细介绍了OpenCV中图像的加噪与滤波操作的相关资料,文中的示例代码简洁易懂,具有一定的借鉴价值,需要的可以参考一下
      2023-02-16

      python数字图像处理之高级滤波代码详解

      本文提供许多的滤波方法,这些方法放在filters.rank子模块内。 这些方法需要用户自己设定滤波器的形状和大小,因此需要导入morphology模块来设定。 1、autolevel 这个词在photoshop里面翻译成自动色阶,用局部直
      2022-06-04

      OpenCV图像处理之图像拼接详解

      本文主要介绍了如何使用C++ OpenCV实现图像景拼接,文中的示例代码讲解详细,对我们学习OpenCV有一定的帮助,感兴趣的可以了解一下
      2022-11-13

      OpenCV数字图像处理基于C++之图像形态学处理详解

      OpenCV是一款由Intel公司俄罗斯团队发起并参与和维护的一个计算机视觉处理开源软件库,支持与计算机视觉和机器学习相关的众多算法,下面这篇文章主要给大家介绍了关于OpenCV数字图像处理基于C++之图像形态学处理的相关资料,需要的朋友可以参考下
      2022-12-08

      Android图像处理之霓虹滤镜效果

      霓虹是用来描绘图像的轮廓,勾画出颜色变化的边缘,加强其过度效果,使图像产生轮廓发光的效果。 主要步骤为1、根据当前像素与其右方和下方像素的梯度运算; 2、然后将结果值作为当前像素值,即将原图当前下像素的RGB分量与其右方和下方像素做梯度 运
      2022-06-06

      编程热搜

      • Python 学习之路 - Python
        一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
        Python 学习之路 - Python
      • chatgpt的中文全称是什么
        chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
        chatgpt的中文全称是什么
      • C/C++中extern函数使用详解
      • C/C++可变参数的使用
        可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
        C/C++可变参数的使用
      • css样式文件该放在哪里
      • php中数组下标必须是连续的吗
      • Python 3 教程
        Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
        Python 3 教程
      • Python pip包管理
        一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
        Python pip包管理
      • ubuntu如何重新编译内核
      • 改善Java代码之慎用java动态编译

      目录