1、膨胀

所谓的图片的膨胀处理,其实就是在图像的边缘添加像素值,使得整体的像素值扩张,进而达到图像的膨胀效果。

对Z2上元素集合A和结构体元素S,使用S对A进行腐蚀,记作:

A⊕S={z|(S)z ∩ A ≠ Ø}

让位于图像圆点的结构元素S在Z平面上移动,如果S的圆点移动到z点时,S与A有公共的交集(非空集),则认为这样的z点构成的集合是S对A的膨胀图像。

函数原型:

  1. CV_EXPORTS_W void dilate( InputArray src, OutputArray dst, InputArray kernel,
  2. Point anchor = Point(-,-), int iterations = ,
  3. int borderType = BORDER_CONSTANT,
  4. const Scalar& borderValue = morphologyDefaultBorderValue() );

dst表示处理的结果

src表示原图像

kernel表示卷积核

anchor是point类型,表示锚的位置,默认正中心

iterations表示迭代次数

borderType边缘的模糊方式

一般需要前三个参数即可,第三个参数需要用getStructuringElement函数确定,该函数确定模板内核特性和锚点的位置。

CV_EXPORTS_W Mat getStructuringElement(int shape, Size ksize, Point anchor = Point(-1,-1));

模板内核的类型有:

MORPH_RECT:矩形

MORPH_CROSS:交叉型

MORPH_ELLIPSE:椭圆型

示例如下。

  1. img = imread("D:\\WORK\\5.OpenCV\\LeanOpenCV\\pic_src\\pic7.bmp");
  2.  
  3. img1 = img.clone();
  4. imshow("原图", img);
  5. Mat element = getStructuringElement(MORPH_RECT, Size(, ));
  6. dilate(img, img2, element);
  7. imshow("膨胀", img2);

2、腐蚀

腐蚀:就是求局部最小值的操作。

结构元素(Sturcture Element),形象称呼刷子,在每个像素位置上与二值图像对应的区域进行特定的逻辑运算。运算结构是输出图像的相应像素。运算效果取决于结构元素大小内容以及逻辑运算性质。

对Z2上元素集合A和结构体元素S,使用S对A进行腐蚀,记作:

AΘS={z|(S)z € A}

让位于图像圆点的结构元素S在Z平面上移动,如果S的圆点移动到z点时,S能够完全的包含于A中,则认为这样的z点构成的集合是S对A的腐蚀图像。

函数原型:

  1. CV_EXPORTS_W void erode( InputArray src, OutputArray dst, InputArray kernel,
  2. Point anchor = Point(-,-), int iterations = ,
  3. int borderType = BORDER_CONSTANT,
  4. const Scalar& borderValue = morphologyDefaultBorderValue() );

示例如下。

  1. img = imread("D:\\WORK\\5.OpenCV\\LeanOpenCV\\pic_src\\pic7.bmp");
  2.  
  3. img1 = img.clone();
  4. imshow("原图", img);
  5. Mat element = getStructuringElement(MORPH_RECT, Size(, ));
  6. erode(img, img2, element);
  7. imshow("腐蚀", img2);

3、开运算和闭运算

1)开运算就是先腐蚀后膨胀的过程,可以表示为:

dst = open(src, element)

dst = dilate(erode(dst, element))

作用:用来消除小的物体,平滑形状边界,并且不改变其面积。可以去除小颗粒噪声,断开物体之间的粘连。

2)闭运算是先膨胀后腐蚀的过程,可以表示为:

dst = close(src, element)

dst = erode(dilate (dst, element))

作用:用来填充物体内的小空洞,连接邻近的物体,连接断开的轮廓线,平滑其边界的同时不改变面积。

函数原型:

  1. CV_EXPORTS_W void morphologyEx( InputArray src, OutputArray dst,
  2. int op, InputArray kernel,
  3. Point anchor = Point(-,-), int iterations = ,
  4. int borderType = BORDER_CONSTANT,
  5. const Scalar& borderValue = morphologyDefaultBorderValue() );

其中第三个参数op代表形态学运算的类型,具体如下表。

  1. img = imread("D:\\WORK\\5.OpenCV\\LeanOpenCV\\pic_src\\pic7.bmp");
  2.  
  3. img1 = img.clone();
  4. imshow("原图", img);
  5. Mat element = getStructuringElement(MORPH_RECT, Size(, ));
  6. morphologyEx(img, img2, MORPH_OPEN, element);
  7. imshow("开运算", img2);
  8. morphologyEx(img, img3, MORPH_CLOSE, element);
  9. imshow("闭运算", img3);

内核模板大小为Size(3,3)时测试如下图,开运算因为先做了腐蚀所以图片上的小白点都消失了。而闭运算因为先膨胀,所以小白点被放大了,再次腐蚀后也留了下来,并且有多个小白点连在了一起。此外闭运算图中细菌出现了互相连接的边缘,开运算细菌边缘间隔更加清晰。

内核模板大小为Size(7,7)时测试如下。

4、形态学梯度

形态学梯度就是膨胀图与腐蚀图之差,梯度从原区域的膨胀中减去了原区域的收缩,保留了图像的外边缘部分,也就是图像的轮廓。

可以表示为:

dst = morpd_grad(src, element) = dilate (src, element) - erode(src, element)

5、顶帽和黑帽

1)顶帽(Top Hat):

又称“礼帽”运算,原图像与开运算图的差,突出原图像中比周围亮的区域。

因为开运算放大了裂缝或者局部低亮度的区域,再从原图中减去开运算后的图,就保留了比原图轮廓周围的区域更明亮的区域。顶帽运算往往用来分离比邻近点亮一些的斑块。当一幅图像具有大幅的背景的时候,而微小物品比较有规律的情况下,可以使用顶帽运算进行背景提取。

2)黑帽(Black Hat):

闭操作图像减去原图像,突出原图像中比周围暗的区域。

黑帽运算后的效果图突出了比原图轮廓周围的区域更暗的区域,此外黑帽还能得到图像内部的小孔,或者前景色中的小黑点。

6、高斯金字塔

图像金字塔是图像中多尺度表达的一种,最初用于机器视觉和图像压缩,金字塔的底部是高分辨率的图像,而顶部是低分辨率的近似,当向金字塔的上层移动时,尺寸和分辨率降低,伴随的细节就越少。低分辨率的图像主要用于分析大的结构或图像的整体内容,高分辨率图像适合分析单个物体的特性。

1)下采样:就是图片缩小,使用PryDown函数,先高斯模糊,再降采样。下采样将步骤:先对图像进行高斯内核卷积,再将所有偶数行和列去除,图像缩小到原来四分之一,迭代上述步骤就得到的金字塔。

2)上采样:就是图片放大,使用PryUp函数。先将图像在每个方向扩大为原来的两倍,新增的行和列以0填充,再卷积得到放大后的图像。

函数原型为:

  1. CV_EXPORTS_W void pyrUp( InputArray src, OutputArray dst,
  2. const Size& dstsize = Size(), int borderType = BORDER_DEFAULT );
  3. CV_EXPORTS_W void pyrDown( InputArray src, OutputArray dst,
  4. const Size& dstsize = Size(), int borderType = BORDER_DEFAULT );

示例如下。

  1. img = imread("D:\\WORK\\5.OpenCV\\LeanOpenCV\\pic_src\\pic5.bmp");
  2. imshow("原图", img);
  3. pyrDown(img, img2, Size(img.cols * , img.rows * ));
  4. imshow("上采样运算1", img2);
  5. pyrDown(img2, img3, Size(img2.cols * , img2.rows * ));
  6. imshow("上采样运算2", img3);

上采样结果。

下采样结果。

7、参考文献

1、《OpenCV3 编程入门》,电子工业出版社,毛星雨著

2、《学习OpenCV》,清华大学出版社,Gary Bradski, Adrian kaehler著

3、图像金字塔(高斯金字塔、拉普拉斯金字塔)

https://www.cnblogs.com/sddai/p/10330756.html

4、图像金字塔

https://www.kancloud.cn/aollo/aolloopencv/272073

5、Image Pyramids

https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_pyramids/py_pyramids.html

6、Image Pyramids

https://docs.opencv.org/2.4/doc/tutorials/imgproc/pyramids/pyramids.html

尊重原创技术文章,转载请注明。

https://www.cnblogs.com/pingwen/p/12319629.html

OpenCV3入门(七)图像形态学的更多相关文章

  1. 【图像处理】OpenCV+Python图像处理入门教程(七)图像形态学操作

    图像形态学主要从图像内提取分量信息,该分量信息通常对表达图像的特征具有重要意义.例如,在车牌号码识别中,能够使用形态学计算其重要特征信息,在进行识别时,只需对这些特征信息运算即可.图像形态学在目标视觉 ...

  2. Atitit 图像处理—图像形态学(膨胀与腐蚀)

    Atitit 图像处理-图像形态学(膨胀与腐蚀) 1.1. 膨胀与腐蚀1 1.2. 图像处理之二值膨胀及应用2 1.3. 测试原理,可以给一个5*5pic,测试膨胀算法5 1.4. Photoshop ...

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

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

  4. opencv中的图像形态学——腐蚀膨胀

    腐蚀膨胀是图像形态学比较常见的处理,腐蚀一般可以用来消除噪点,分割出独立的图像元素等. 一般腐蚀操作对二值图进行处理,腐蚀操作如下图,中心位置的像素点是否与周围领域的像素点颜色一样(即是否是白色点,即 ...

  5. C#基础入门 七

    C#基础入门 七 接口 由于C#语言不支持多重继承,所以可以使用接口模拟结构的继承,通过使用interface关键字,定义一个接口. interface USB { void Read(string[ ...

  6. Python爬虫入门七之正则表达式

    在前面我们已经搞定了怎样获取页面的内容,不过还差一步,这么多杂乱的代码夹杂文字我们怎样把它提取出来整理呢?下面就开始介绍一个十分强大的工具,正则表达式! 1.了解正则表达式 正则表达式是对字符串操作的 ...

  7. 转 Python爬虫入门七之正则表达式

    静觅 » Python爬虫入门七之正则表达式 1.了解正则表达式 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串 ...

  8. Jmeter Web 性能测试入门 (七):Performance 测试中踩过 Jmeter 的坑

    脚本运行的过程中,大量request抛error,但没有地方能够查看request是因为什么error的. 原因:Jmeter默认禁掉了运行过程中每个request的具体response信息收集,只保 ...

  9. Python图像处理丨三种实现图像形态学转化运算模式

    摘要:本篇文章主要讲解Python调用OpenCV实现图像形态学转化,包括图像开运算.图像闭运算和梯度运算 本文分享自华为云社区<[Python图像处理] 九.形态学之图像开运算.闭运算.梯度运 ...

随机推荐

  1. Serverless 设计理念:从头创建品牌标识

    本文首发于 Serverless 中文网,译者:Aceyclee.如需转载,请保留原作者和出处. 如何在开源技术社区中做设计?本文来自 Serverless 团队中首席设计的分享 -- 展现了设计过程 ...

  2. GC 为什么要挂起用户线程? 什么愁什么怨?

    GC 为什么要挂起用户线程? 什么愁什么怨? 前言 JVM 系列文章的第一篇.敬请期待后续. 故障描述 某年某月某日 上午,线上发生故障,经过排查,发现某核心服务 Dubbo 接口超时. 故障根源 查 ...

  3. vnpy源码阅读学习(1):准备工作

    vnpy源码阅读学习 目标 通过阅读vnpy,学习量化交易系统的一些设计思路和理念. 通过阅读vnpy学习python项目开发的一些技巧和范式 通过vnpy的设计,可以用python复现一个小型简单的 ...

  4. shell学习-常用语句

    为什么使用shell 可以快速.简单的完成编程,实现自己的想法.Shell非常适合编写小的工具,因为小工具更强调的是易于配置.维护.移植等,而不是执行效率. 当自己的想法确实有必要进行优化,有必要让它 ...

  5. python列表(数组)

    列表(list)  就是 数组 - 列表是Python中的一个对象 - 对象(object)就是内存中专门用来存储数据的一块区域 - 之前我们学习的对象,像数值,它只能保存一个单一的数据 - 列表中可 ...

  6. 初识 ST 表

    推荐博客 : https://blog.csdn.net/BerryKanry/article/details/70177006 ST表通常用于RMQ问题中,询问某个区间的最值这类问题中 ST表的核心 ...

  7. eclipse git导入的项目 让修改后的文件带有黑色星标记样式

    操作方式:Window——>Preferences——>Team——>Git——>Label Decorations——>Icon Decorations 将 Dirty ...

  8. python 装饰器-初识

    一.装饰器的形成过程 1.函数无参数,无返回值 import time def f1(): # 无参数,无返回值 time.sleep(1) print("Hello, World!&quo ...

  9. (分块暴力)Time to Raid Cowavans CodeForces - 103D

    题意 给你一段长度为n(1 ≤ n ≤ 3·1e5)的序列,m (1 ≤ p ≤ 3·1e5)个询问,每次询问a,a+b,a+2b+...<=n的和 思路 一开始一直想也想不到怎么分,去维护哪些 ...

  10. P1553 数字反转(升级版)

    题目描述 给定一个数,请将该数各个位上数字反转得到一个新数. 这次与NOIp2011普及组第一题不同的是:这个数可以是小数,分数,百分数,整数.整数反转是将所有数位对调:小数反转是把整数部分的数反转, ...