转自:OpenCV 教程

另附:计算机视觉:算法与应用(2012),Learning OpenCV(2009)

平滑图像:滤波器

平滑 也称 模糊, 是一项简单且使用频率很高的图像处理方法。平滑处理的用途有很多, 但是在本教程中我们仅仅关注它减少噪声的功用 (其他用途在以后的教程中会接触到)。平滑处理时需要用到一个 滤波器 。最常用的滤波器是 线性 滤波器。不妨把 滤波器 想象成一个包含加权系数的窗口,当使用这个滤波器平滑处理图像时,就把这个窗口滑过图像。

归一化滤波器 (Normalized Box Filter)

最简单的滤波器,输出像素值是核窗口内像素值的 均值 ( 所有像素加权系数相等)。

blur( src, dst, Size( i, i ), Point(-1,-1) );
  • src: 输入图像
  • dst: 输出图像
  • Size( w,h ): 定义内核大小( w 像素宽度, h 像素高度)
  • Point(-1, -1): 指定锚点位置(被平滑点), 如果是负值,取核的中心为锚点。

高斯滤波器 (Gaussian Filter)

最有用的滤波器 (尽管不是最快的)。 高斯滤波是将输入数组的每一个像素点与 高斯内核 卷积将卷积和当作输出像素值。

GaussianBlur( src, dst, Size( i, i ), 0, 0 );
  • src: 输入图像
  • dst: 输出图像
  • Size(w, h): 定义内核的大小(需要考虑的邻域范围)。  和  必须是正奇数,否则将使用  和  参数来计算内核大小。
  • : x 方向标准方差, 如果是  则  使用内核大小计算得到。
  • : y 方向标准方差, 如果是  则  使用内核大小计算得到。.

中值滤波器 (Median Filter)

中值滤波将图像的每个像素用邻域 (以当前像素为中心的正方形区域)像素的 中值 代替 。

medianBlur ( src, dst, i );
  • src: 输入图像
  • dst: 输出图像, 必须与 src 相同类型
  • i: 内核大小 (只需一个值,因为我们使用正方形窗口),必须为奇数。

双边滤波 (Bilateral Filter)

目前我们了解的滤波器都是为了 平滑 图像, 问题是有些时候这些滤波器不仅仅削弱了噪声, 连带着把边缘也给磨掉了。为避免这样的情形 (至少在一定程度上 ), 我们可以使用双边滤波。类似于高斯滤波器,双边滤波器也给每一个邻域像素分配一个加权系数。 这些加权系数包含两个部分, 第一部分加权方式与高斯滤波一样,第二部分的权重则取决于该邻域像素与当前像素的灰度差值。

详细的解释可以查看 链接

bilateralFilter ( src, dst, i, i*2, i/2 );
  • src: 输入图像
  • dst: 输出图像
  • d: 像素的邻域直径
  • : 颜色空间的标准方差
  • : 坐标空间的标准方差(像素单位)

利用掩码(kernel mask)简单滤波:filter2D

矩阵的掩码操作很简单。其思想是:根据掩码矩阵(也称作核)重新计算图像中每个像素的值。掩码矩阵中的值表示近邻像素值(包括该像素自身的值)对新像素值有多大影响。从数学观点看,我们用自己设置的权值,对像素邻域内的值做了个加权平均。

以下是利用filter2D函数实现Laplace filter来加强图像对比度的实例(samples\cpp\tutorial_code\core\mat_mask_operations):

Mat kern = (Mat_<char>(3,3) <<  0, -1,  0,
-1, 5, -1,
0, -1, 0);
filter2D(I, K, I.depth(), kern );

filter2D(src, dst, ddepth , kernel, anchor, delta, BORDER_DEFAULT );
  • src: 源图像
  • dst: 目标图像
  • ddepthdst 的深度。若为负值(如 -1),则表示其深度与源图像相等。
  • kernel: 用来遍历图像的核
  • anchor: 核的锚点的相对位置,其中心点默认为 (-1, -1) 。
  • delta: 在卷积过程中,该值会加到每个像素上。默认情况下,这个值为  。
  • BORDER_DEFAULT: 这里我们保持其默认值,更多细节将在其他教程中详解

形态学操作之:腐蚀与膨胀(Eroding and Dilating)

形态学操作就是基于形状的一系列图像处理操作。通过将 结构元素 作用于输入图像来产生输出图像。最基本的形态学操作有二:腐蚀与膨胀(Erosion 与 Dilation)。 他们的运用有:

  • 消除噪声
  • 分割(isolate)独立的图像元素,以及连接(join)相邻的元素。
  • 寻找图像中的明显的极大值区域或极小值区域。

膨胀dilate

将图像  与任意形状的内核 (),通常为正方形或圆形,进行卷积。内核  有一个可定义的 锚点, 通常定义为内核中心点。将内核  划过图像,将内核  覆盖区域的最大相素值提取,并代替锚点位置的相素。显然,这一最大化操作将会导致图像中的亮区开始”扩展” (因此有了术语膨胀 dilation )。

腐蚀erode

将内核  划过图像,将内核  覆盖区域的最小相素值提取,并代替锚点位置的相素。相应地,暗区会开始“腐蚀”。

Mat element = getStructuringElement( dilation_type,
Size( 2*dilation_size + 1, 2*dilation_size+1 ),
Point( dilation_size, dilation_size ) ); dilate( src, dilation_dst, element );
erode( src, erosion_dst, element );

dilate和erode参数相同:

  • src: 原图像
  • erosion_dst: 输出图像
  • element: 腐蚀操作的内核。如果不指定,默认为一个简单的  矩阵。否则,我们就要明确指定它的形状,可以使用函数getStructuringElement

getStructuringElement的参数:

  • dilation_type = 矩形: MORPH_RECT 或者 交叉形: MORPH_CROSS  或者  椭圆形 MORPH_ELLIPSE
  • 内核大小
  • 锚点位置(若不指定,则默认为中心位置)

更多形态学变换

更直观的图参见此处

开运算 (Opening)

通过先对图像腐蚀再膨胀实现的。能够排除小团块物体(假设物体较背景明亮)。

闭运算(Closing)

通过先对图像膨胀再腐蚀实现的。能够排除小型黑洞(黑色区域)。

形态梯度(Morphological Gradient)

膨胀图与腐蚀图之差,能够保留物体的边缘轮廓。

顶帽(Top Hat)与黑帽(Black Hat)

顶帽:原图像与开运算结果图之差

黑帽:闭运算结果图与原图像之差

调用函数:morphologyEx

Mat element = getStructuringElement( morph_elem, Size( 2*morph_size + 1, 2*morph_size+1 ), Point( morph_size, morph_size ) );

/// 运行指定形态学操作
morphologyEx( src, dst, operation, element );

参数列表:

  • src : 原 (输入) 图像
  • dst: 输出图像
  • operation: 需要运行的形态学操作。 我们有5个选项(注意:取值范围为2~6):
    • Opening: MORPH_OPEN : 2
    • Closing: MORPH_CLOSE: 3
    • Gradient: MORPH_GRADIENT: 4
    • Top Hat: MORPH_TOPHAT: 5
    • Black Hat: MORPH_BLACKHAT: 6
  • element: 内核,可以使用函数:get_structuring_element:getStructuringElement <> 自定义。

OpenCV学习笔记(六) 滤波器 形态学操作(腐蚀、膨胀等)的更多相关文章

  1. 【opencv学习笔记六】图像的ROI区域选择与复制

    图像的数据量还是比较大的,对整张图片进行处理会影响我们的处理效率,因此常常只对图像中我们需要的部分进行处理,也就是感兴趣区域ROI.今天我们来看一下如何设置图像的感兴趣区域ROI.以及对ROI区域图像 ...

  2. OpenCV学习 7:图像形态学:腐蚀、膨胀

    原创文章,欢迎转载,转载请注明出处 首先什么是图像形态学?额,这个抄下百度到的答案.基本思想:    用具有一定形态的结构元素去度量和提取图像中的对应形状已达到对图像分析和识别的目的,形态学图像处理表 ...

  3. Python学习笔记六:数据库操作

    一:Python操作数据库的流程 二:开发环境准备 1:开发工具PyCharm 2:Python操作mysql的工具:需要安装Python-Mysql Connector,网址:https://sou ...

  4. opencv学习笔记(六)---图像梯度

    图像梯度的算法有很多方法:sabel算子,scharr算子,laplacian算子,sanny边缘检测(下个随笔)... 这些算子的原理可参考:https://blog.csdn.net/poem_q ...

  5. opencv学习笔记(05)——操作相邻区域

    下面的例子以灰度图像为例: #include <opencv2\highgui\highgui.hpp> #include <opencv2\imgproc\imgproc.hpp& ...

  6. opencv学习笔记(01)——操作图像的像素

    #include <opencv2\core\core.hpp> #include <opencv2\highgui\highgui.hpp> #include <ope ...

  7. opencv学习笔记(六)直方图比较图片相似度

    opencv学习笔记(六)直方图比较图片相似度 opencv提供了API来比较图片的相似程度,使我们很简单的就能对2个图片进行比较,这就是直方图的比较,直方图英文是histogram, 原理就是就是将 ...

  8. OpenCV学习笔记3

    OpenCV学习笔记3 图像平滑(低通滤波) 使用低通滤波器可以达到图像模糊的目的.这对与去除噪音很有帮助.其实就是去除图像中的高频成分(比如:噪音,边界).所以边界也会被模糊一点.(当然,也有一些模 ...

  9. OpenCV 学习笔记 02 使用opencv处理图像

    1 不同色彩空间的转换 opencv 中有数百种关于不同色彩空间的转换方法,但常用的有三种色彩空间:灰度.BRG.HSV(Hue-Saturation-Value) 灰度 - 灰度色彩空间是通过去除彩 ...

  10. OpenCV学习笔记5

    OpenCV学习笔记5 图像变换 傅里叶变换 这里可以先学习一下卷积分,了解清除卷积的过程和实际意义,在看这一章节的内容. 原理: 傅里叶变换经常被用来分析不同滤波器的频率特性.我们可以使用 2D 离 ...

随机推荐

  1. linux 解决 gvfsd-smb-browse CPU 100%占用

    原文地址:https://bugzilla.redhat.com/show_bug.cgi?id=1303300 1: sudo vim /etc/samba/smb.conf 2:定位到[globa ...

  2. Oracle 用户相关

    1.查询所有未修改过密码的Oracle用户 SELECT * FROM dba_users_with_defpwd d, dba_users du WHERE du.account_status = ...

  3. windows下 php集成环境如何通过cmd执行命令

    ---恢复内容开始--- php学习过程中 Windows环境下的php集成程序很多 这样方便了学习 但是在熟悉命令使用方面可以说是十分不便 本文将从两个方便 向大家介绍如何快速通过cmd命令实现命令 ...

  4. (转载)C#中的lock关键字

    lock 关键字可以用来确保代码块完成运行,而不会被其他线程中断.这是通过在代码块运行期间为给定对象获取互斥锁来实现的. 先来看看执行过程,代码示例如下: 假设线程A先执行,线程B稍微慢一点.线程A执 ...

  5. URL最大长度问题

    在http协议中,其实并没有对url长度作出限制,往往url的最大长度和用户浏览器和Web服务器有关,不一样的浏览器,能接受的最大长度往往是不一样的,当然,不一样的Web服务器能够处理的最大长度的UR ...

  6. 一篇文章读懂JSON

    什么是json? W3C JSON定义修改版: JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation) JSON 是轻量级的文本数据交换格式,并不是 ...

  7. sql server 索引总结一

    一.存储结构 在SQL Server中,有许多不同的可用排列规则选项. 二进制:按字符的数字表示形式排序(ASCII码中,用数字32表示空格,用68表示字母"D").因为所有内容都 ...

  8. hihoCoder hiho一下 第十二周 #1055 : 刷油漆 (树上DP)

    思路: 只能刷部分节点数m,总节点数n.如果m>=n那么就可以全刷了,那就不用任何算法了.如果m<n那么就要有取舍了.用DP思路,记录下每个节点如果获得到1~m个选择所能获得的最大权值.这 ...

  9. SwiftHN阅读器应用IOS源码

    SwiftHN是用Swift语言编写的Hacker News阅读器,同时采用了iOS 8最新的API. <ignore_js_op> <ignore_js_op> 详细说明:h ...

  10. Dynamic typing 动态类型

    https://developer.apple.com/library/content/documentation/General/Conceptual/DevPedia-CocoaCore/Dyna ...