• 目录 操作方法简要说明 腐蚀操作 结构元素原点在结构元素内部 原点在结构元素外部 二值图像膨胀操作 点在结构元素内部 原点在结构元素外部

    申明: 仅个人小记

    前言: 我之前对腐蚀与膨胀的概念理解存在错误。我原来的概念解决不了结构的原点设置在结构外部的情况。故在这里记一下。

    小注: 刚开始操作的时候是同时有三张图,分别为原图像,结构元素图像,输出结果空白图像
    注意: 原图像只是提供位置信息,不参与输出图像的构成。

    一、操作方法简要说明

    • 腐蚀操作内容

      1. 先不管原点设置的位置,在原图中找出第一个和结构元素完全匹配的部分
      2. 想象着拿着结构元素往上面找到的位置上贴,这时得到结构元素中的原点(就是打上“+”的那个方块)对应着原图中一个方块
      3. 我们根据这个方块位置,在空白的输出图像上(第一次输出图像为空白的)相应的位置涂黑。
      4. 重复1~3,直至原图中所有能和结构元素完全匹配的情况用完
      5. 这是得到的输出图像便是结构元素对原图像进行腐蚀的结果
    • 膨胀操作内容

      1. 原图像结构元素原点的运行轨迹。
      2. 直接关注原点,想象着拿着结构元素,把结构元素的原点放在原图像上的第一个有效元素(指的是黑方块)。
      3. 这时,我们得到结构元素所有的黑色方块在原图像上位置。我们根据得到的位置,在的输出图像(第一次输出图像为空白的)上完全相同的位置涂黑。
      4. 重复1~3,得到输出结果图像,输出结果图像就是结构元素对原图像膨胀操作的结果。

    二、 二值图像的腐蚀操作

    1. 结构的原点设置在结构的内部情况举例


    • 图中左侧(a)为原图像,右侧(b)为结构元素。

      • 第一步 拿结构元素第一次完全匹配原图(右侧为输出图像)
      •         

      • 第二步 然后我们根据原点在原图像中的位置,在输出图像上完全对应的位置上涂黑,即输出图像更变为

      • 第三步 在原图中寻找下一个完全和结构元素匹配部分,即

      • 第四步 根据此刻结构元素的原点在原图像上的位置,在输出图像相同的位置上涂黑,即

      • 第五步 寻找完毕,操作完毕。

    2. 结构的原点设置在结构的外部情况举例


    • 左侧为原图,右侧为结构元素,注意,这里的结构元素的原点不在结构元素内部。

    • 第一步 拿结构元素第一次完全匹配原图(右侧为输出图像)

    • 第二步 根据结构元素的原点在原图中的位置,我们再输出图像相应的位置涂黑,即

    • 第三步 在原图中寻找下一个完全和结构元素匹配部分,即

    • 第四步 根据此刻结构元素的原点在原图像上的位置,在输出图像相同的位置上涂黑,即

    • 第五步 寻找完毕,操作完毕。

    三、 二值图像的膨胀操作

    1. 结构的原点设置在结构的内部情况举例


    • 图中左侧(a)为原图像,右侧(b)为结构元素

      操作规则,拿结构元素的原点在原图像上的黑色方块上一次一次移动。

      • 第一步 将结构元素的原点,放置在原图向上的第一个黑色方块上,即

        (左侧为原图像,右侧为输出图像)
    • 第二步 根据此时结构元素在原图上霸占的所有位置,我们在输出图的相应所有位置涂黑,即

    • 第三步 将结构元素的原点移动到下一个原图上的黑色方块,即

    • 第四步 根据此时结构元素在原图上霸占的所有位置,我们在输出图的相应所有位置涂黑,即

    • 第五步 重复第三步和第四步,直到遍历完毕原图像中所有的黑色方块,我们得到最终输出结果


    2. 结构的原点设置在结构的外部情况举例


    • 左侧为原图,右侧为结构元素,注意,这里的结构元素的原点不在结构元素内部。
    • 第一步 将结构元素的原点,放置在原图向上的第一个黑色方块上,即

      由于位置不够,我在上边界上拓展了一行。

    • 第二步 根据此时结构元素在原图上霸占的所有位置,我们在输出图的相应所有位置涂黑,即

    • 第三步 将结构元素的原点移动到下一个原图上的黑色方块,即

    • 第四步 根据此时结构元素在原图上霸占的所有位置,我们在输出图的相应所有位置涂黑,即

    • 第五步 重复第三步和第四步,直到遍历完毕原图像中所有的黑色方块,我们得到最终输出结果

    By Jack Lu 2017-6-26 23:57:35

    四、其他的一些概念

    1. 平移不变性(shift-nonvariant): 指的就是不论平行移动到哪里执行的操作都是一样。和执行的动作和操作是无关系的。
    2. 腐蚀和膨胀操作还可以对灰度图进行操作,具体方式:

      • 灰度图腐蚀
        用原图减去结构,选用结果中的最小值(如果有负值,则以0为最小值)作为本次输出值放置在空白图像相应的输出位置(即结构的原点位置在原图上相应的位置)。

      • 灰度图膨胀
        用原图加上结构,选用结果中的最大值 (如果有负值,则以0为最小值)作为本次输出值放置在空白图像相应的输出位置(即结构的原点位置在原图上相应的位置)。

    3 开闭运算

    • 开运算为: 先腐蚀再膨胀
    • 闭运算为: 先膨胀再腐蚀

    • 开闭运算具有幂等性。即做n次开运算和做一次开运算的结果相同,闭运算同样如此。

    • 个人方便记忆开闭运算的操作顺序,这样理解,开运算是打开的意思,即可以理解为将图像中靠近但不相连的地方索性打开。做一次开运算,使得原来的缝隙变大。
      闭运算可以理解为闭合的意思,能合并在一起的地方尽量合并。即可以理解为把图像中缝隙填满。

    By Jack 2017年6月28日 14:50:42

    展开全文
  • 图像膨胀(Dilation)和腐蚀(Erosion)是两种基本的形态学运算,主要用来寻找图像中的极大区域和极小区域。其中膨胀类似于“领域扩张”,将图像中的高亮区域或白色部分进行扩张,其运行结果图比原图的高亮区域更...

    该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门、OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子、图像增强技术、图像分割等,后期结合深度学习研究图像识别、图像分类应用。希望文章对您有所帮助,如果有不足之处,还请海涵~

    该系列在github所有源代码:https://github.com/eastmountyxz/ImageProcessing-Python
    PS:请求帮忙点个Star,哈哈,第一次使用Github,以后会分享更多代码,一起加油。

    同时推荐作者的C++图像系列知识:
    [数字图像处理] 一.MFC详解显示BMP格式图片
    [数字图像处理] 二.MFC单文档分割窗口显示图片
    [数字图像处理] 三.MFC实现图像灰度、采样和量化功能详解
    [数字图像处理] 四.MFC对话框绘制灰度直方图
    [数字图像处理] 五.MFC图像点运算之灰度线性变化、灰度非线性变化、阈值化和均衡化处理详解
    [数字图像处理] 六.MFC空间几何变换之图像平移、镜像、旋转、缩放详解
    [数字图像处理] 七.MFC图像增强之图像普通平滑、高斯平滑、Laplacian、Sobel、Prewitt锐化详解

    前文参考:
    [Python图像处理] 一.图像处理基础知识及OpenCV入门函数
    [Python图像处理] 二.OpenCV+Numpy库读取与修改像素
    [Python图像处理] 三.获取图像属性、兴趣ROI区域及通道处理
    [Python图像处理] 四.图像平滑之均值滤波、方框滤波、高斯滤波及中值滤波
    [Python图像处理] 五.图像融合、加法运算及图像类型转换
    [Python图像处理] 六.图像缩放、图像旋转、图像翻转与图像平移
    [Python图像处理] 七.图像阈值化处理及算法对比

    本篇文章主要讲解Python调用OpenCV实现图像腐蚀和图像膨胀的算法,基础性知识希望对您有所帮助。
    1.基础理论
    2.图像腐蚀代码实现
    3.图像膨胀代码实现

    PS:文章参考自己以前系列图像处理文章及OpenCV库函数,同时部分参考网易云视频,推荐大家去学习。同时,本篇文章涉及到《计算机图形学》基础知识,请大家下来补充。

    PSS:文章参考自己以前系列图像处理文章及OpenCV库函数,同时部分参考网易云lilizong老师的视频,推荐大家去学习。同时,本篇文章涉及到《计算机图形学》基础知识,请大家下来补充。

    PSS:2019年1~2月作者参加了CSDN2018年博客评选,希望您能投出宝贵的一票。我是59号,Eastmount,杨秀璋。投票地址:https://bss.csdn.net/m/topic/blog_star2018/index

    五年来写了314篇博客,12个专栏,是真的热爱分享,热爱CSDN这个平台,也想帮助更多的人,专栏包括Python、数据挖掘、网络爬虫、图像处理、C#、Android等。现在也当了两年老师,更是觉得有义务教好每一个学生,让贵州学子好好写点代码,学点技术,"师者,传到授业解惑也",提前祝大家新年快乐。2019我们携手共进,为爱而生。

    一. 基础知识

    (注:该部分参考作者论文《一种改进的Sobel算子及区域择优的身份证智能识别方法》)

    图像的膨胀(Dilation)和腐蚀(Erosion)是两种基本的形态学运算,主要用来寻找图像中的极大区域和极小区域。其中膨胀类似于“领域扩张”,将图像中的高亮区域或白色部分进行扩张,其运行结果图比原图的高亮区域更大;腐蚀类似于“领域被蚕食”,将图像中的高亮区域或白色部分进行缩减细化,其运行结果图比原图的高亮区域更小。

    1.图像膨胀
    膨胀的运算符是“⊕”,其定义如下:

    该公式表示用B来对图像A进行膨胀处理,其中B是一个卷积模板或卷积核,其形状可以为正方形或圆形,通过模板B与图像A进行卷积计算,扫描图像中的每一个像素点,用模板元素与二值图像元素做“与”运算,如果都为0,那么目标像素点为0,否则为1。从而计算B覆盖区域的像素点最大值,并用该值替换参考点的像素值实现膨胀。下图是将左边的原始图像A膨胀处理为右边的效果图A⊕B。
    处理结果如下图所示:

    2.图像腐蚀
    腐蚀的运算符是“-”,其定义如下:

    该公式表示图像A用卷积模板B来进行腐蚀处理,通过模板B与图像A进行卷积计算,得出B覆盖区域的像素点最小值,并用这个最小值来替代参考点的像素值。如图所示,将左边的原始图像A腐蚀处理为右边的效果图A-B。
    处理结果如下图所示:


    二. 图像腐蚀代码实现

    1.基础理论
    形态学转换主要针对的是二值图像(0或1)。图像腐蚀类似于“领域被蚕食”,将图像中的高亮区域或白色部分进行缩减细化,其运行结果图比原图的高亮区域更小。其主要包括两个输入对象:
    (1)二值图像
    (2)卷积核
    卷积核是腐蚀中的关键数组,采用numpy库可以生成。卷积核的中心点逐个像素扫描原始图像,如下图所示:

    被扫描到的原始图像中的像素点,只有当卷积核对应的元素值均为1时,其值才为1,否则其值修改为0。换句话说,遍历到的黄色点位置,其周围全部是白色,保留白色,否则变为黑色,图像腐蚀变小。

    2.函数原型
    图像腐蚀主要使用的函数为erode,其原型如下:
    dst = cv2.erode(src, kernel, iterations)
    参数dst表示处理的结果,src表示原图像,kernel表示卷积核,iterations表示迭代次数。下图表示5*5的卷积核,可以采用函数 np.ones((5,5), np.uint8) 构建。

    注意:迭代次数默认是1,表示进行一次腐蚀,也可以根据需要进行多次迭代,进行多次腐蚀。

    3.代码实现
    完整代码如下所示:

    #encoding:utf-8
    import cv2  
    import numpy as np  
    
    #读取图片
    src = cv2.imread('test01.jpg', cv2.IMREAD_UNCHANGED)
    
    #设置卷积核
    kernel = np.ones((5,5), np.uint8)
    
    #图像腐蚀处理
    erosion = cv2.erode(src, kernel)
    
    #显示图像
    cv2.imshow("src", src)
    cv2.imshow("result", erosion)
    
    #等待显示
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    输出结果如下图所示:

    由图可见,干扰的细线被进行了清洗,但仍然有些轮廓,此时可设置迭代次数进行腐蚀。

    erosion = cv2.erode(src, kernel,iterations=9)

    输出结果如下图所示:



    三. 图像膨胀代码实现

    1.基础理论
    图像膨胀是腐蚀操作的逆操作,类似于“领域扩张”,将图像中的高亮区域或白色部分进行扩张,其运行结果图比原图的高亮区域更大,线条变粗了,主要用于去噪。
    (1) 图像被腐蚀后,去除了噪声,但是会压缩图像。
    (2) 对腐蚀过的图像,进行膨胀处理,可以去除噪声,并且保持原有形状。

    它也包括两个输入对象:
    (1)二值图像或原始图像
    (2)卷积核
    卷积核是腐蚀中的关键数组,采用numpy库可以生成。卷积核的中心点逐个像素扫描原始图像,如下图所示:

    被扫描到的原始图像中的像素点,当卷积核对应的元素值只要有一个为1时,其值就为1,否则为0

    2.函数原型
    图像膨胀主要使用的函数为dilate,其原型如下:
    dst = cv2.dilate(src, kernel, iterations)
    参数dst表示处理的结果,src表示原图像,kernel表示卷积核,iterations表示迭代次数。下图表示5*5的卷积核,可以采用函数 np.ones((5,5), np.uint8) 构建。

    注意:迭代次数默认是1,表示进行一次膨胀,也可以根据需要进行多次迭代,进行多次膨胀。通常进行1次膨胀即可。

    3.代码实现
    完整代码如下所示:

    #encoding:utf-8
    import cv2  
    import numpy as np  
    
    #读取图片
    src = cv2.imread('test02.png', cv2.IMREAD_UNCHANGED)
    
    #设置卷积核
    kernel = np.ones((5,5), np.uint8)
    
    #图像膨胀处理
    erosion = cv2.dilate(src, kernel)
    
    #显示图像
    cv2.imshow("src", src)
    cv2.imshow("result", erosion)
    
    #等待显示
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    输出结果如下所示:

    图像去噪通常需要先腐蚀后膨胀,这又称为开运算,下篇文章将详细介绍。如下图所示:
    erosion = cv2.erode(src, kernel)
    result = cv2.dilate(erosion, kernel)

    希望文章对大家有所帮助,如果有错误或不足之处,还请海涵。最近经历的事情太多,有喜有悲,关闭了朋友圈,希望通过不断学习和写文章来忘记烦劳,将忧郁转换为动力。哎,总感觉自己在感动这个世界,帮助所有人,而自己却…保重。
    (By:Eastmount 2018-10-31 下午4点 https://blog.csdn.net/Eastmount/)

    展开全文
  • 图像的形态学操作 ...网上关于简单的图像处理的文章有很多很多,后面简单的图像处理系列博客中,或多或少的参考了下述这些大佬的分享: https://blog.csdn.net/sn_gis/article/details/57414029 https://...

    图像的形态学操作

    接着前面的图像入门,现在介绍一些简单的图像处理方法,同时在介绍方法之后,还会附上Python的实现,主要是基于Opencv这一库来进行实现。

    网上关于简单的图像处理的文章有很多很多,后面简单的图像处理系列博客中,或多或少的参考了下述这些大佬的分享:

    在简单的图像处理中,我们会从最基础的图像形态学操作说起(平移、旋转、反射、剪裁等操作这里就不进行详细的说明了)。在这之前,我们先回顾一下图像的基本组成。


    1. 回顾:万物皆数

    数字图像的组成单元都是由一个一个的数字构成的,每个数字我们也称之为像素。像素点越密,则图像越清晰;像素点越稀,则图像越模糊。另外,每个数字的大小代表颜色的深浅。就一张灰度图而言,其是一个图层的,上面的值越大,就说明图像这个点越白,255对应的就是白色。而值越小则代表着颜色越黑,0对应的就是黑色。具体如下图所示:
    这里写图片描述

    而彩色图对应的是三个图层,分别为R\G\B,每个层都是0-255之间,三个图层叠加,就是我们所看到的彩色数字图像了。


    2. 什么是形态学操作?

    一系列操作基于形状来操作图像,形态学操作通过在图像上应用结构元素来产生输出图像。

    改变物体的形状,比如腐蚀就是“变瘦”,膨胀就是“变胖”,如下面这张图所示:


    然后包括膨胀腐蚀在内,一系列的这两者各种叠加作用的操作都称为图像的形态学操作。

    最基础的形态学操作就是腐蚀膨胀。它包含广泛的应用:

    • 移除噪声
    • 孤立一些单独的元素和聚合一些分散的元素
    • 找到图像中的局部块状或者孔

    我们使用下面这只可爱的小鸟,来对一系列的形态学操作进行说明。
    这里写图片描述


    3. 膨胀与腐蚀

    膨胀

    使用卷积核B对图片A进行卷积运算,求局部最大值,这个卷积核可以有任意的形状和大小,通常是一个方形或者圆形。
    卷积核B通常有个锚点,通常位于卷积核的中央位置。

    随着卷积核扫描这个图像,我们计算叠加区域的最大像素值,并将锚点的位置用最大值替换。也就是最大化操作导致图片中亮的区域增长(所以这里面叫做膨胀)。


    这里写图片描述

    如上面两图所示,上面第一个图是针对二值图进行操作,上面的第一个是针对二值图进行操作膨胀操作。可以发现,这一操作是使得白色区域“变胖”,黑色区域“变瘦”,从下图即可看出。


    而针对彩色图像,可以想象,由于我们是只保留最大值,所以当选取的核越大时,图像整体会越模糊,并且会越偏向于白色(因为白色对应的值是255),下面两图分别是核为10*10以及核为50*50两种情况进行膨胀的效果,大家可以感受一下。
    核为10*10
    核为50*50


    腐蚀

    膨胀和腐蚀是一对好基友,是相反的一对操作,所以腐蚀就是求局部最小值的操作。腐蚀与膨胀类似,计算卷积核里面的最小元素

    随着卷积核B扫描图片,它会计算B叠加区域的最小像素值,并使用这个像素值替换锚点的值。与膨胀相似,对原始的图像应用腐蚀操作。你可以看到背景亮的区域变小,而黑的区域变得很大


    这里写图片描述

    在二值图上直观的体现,就是白色的部分变小,黑色的部分变大,正好与前面的膨胀相对。


    而针对彩色图像,一样可以想象,由于我们是只保留最小值,所以当选取的核越大时,图像整体会越模糊,并且会越偏向于黑色(黑色对应的值是0),其中一些黑色的小元素也会被放大(例如下图中的小沙子),下面两图分别是核为10*10以及核为50*50两种情况进行腐蚀的效果,第二张非常惊悚。

    这里写图片描述
    这里写图片描述


    4. OpenCV

    这里我们想要通过Python或者其他代码进行实现,需要使用OpenCV来进行相关操作。

    OpenCV是计算机视觉领域应用最广泛的开源工具包,基于C/C++,支持Linux/Windows/MacOS/Android/iOS,并提供了Python,Matlab和Java等语言的接口,因为其丰富的接口,优秀的性能和商业友好的使用许可,不管是学术界还是业界中都非常受欢迎。

    OpenCV最早源于Intel公司1998年的一个研究项目,当时在Intel从事计算机视觉的工程师盖瑞·布拉德斯基(Gary Bradski)访问一些大学和研究组时发现学生之间实现计算机视觉算法用的都是各自实验室里的内部代码或者库,这样新来实验室的学生就能基于前人写的基本函数快速上手进行研究。

    OpenCV旨在提供一个用于计算机视觉的科研和商业应用的高性能通用库。

    这里我们通过Python进行实现。


    5. Python实现

    Python安装OpenCV

    1. 安装Python,建议直接安装anoconda,装Python3的版本
    2. 初学者直接使用里面的Spyder或ipython notebook
    3. 直接使用Win + R,打开命令行,输入pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple,进行OpenCV的安装。

    读入图片

    载入依赖库:

    import cv2         # 载入依赖库,用于图像处理
    import os          # 载入依赖库,用于设置文件路径
    import numpy as np # 载入依赖库,用于生成kernel

    进行图片读取:

    #设置文件路径,类似R中的setwd()
    os.chdir('D:\Pictures\Python使用') 
    
    # 读入图片
    img = cv2.imread('1.png') 

    膨胀腐蚀

    # 设置kernel,也可以利用getStructuringElement()函数指明它的形状
    kernel = np.ones((5, 5), np.uint8) 
    # 膨胀,iterations指的是腐蚀次数,省略是默认为1
    dilation = cv2.dilate(img0, kernel, iterations = 1)
    # 腐蚀
    erosion = cv2.erode(img0, kernel)

    查看与存储图片

    显示图片(这里不推荐使用显示图片的代码,稍有不慎容易卡死,建议使用后面储存出来看图片):

    cv2.imshow("dilation", dilation)
    cv2.waitKey()
    cv2.destroyAllWindows()
    
    cv2.imshow("erosion", erosion)
    cv2.waitKey()
    cv2.destroyAllWindows()

    存储图片:

    cv2.imwrite("dilation.jpg", dilation)
    cv2.imwrite("erosion.jpg", erosion)

    后面会接着讲图像的其他形态学操作,并附上Python实现。

    展开全文
  • 十一,二值化图像处理(灰度图像的直方图,阈值计算和图像二值化,4领域收缩膨胀,8领域收缩膨胀,清除孤立点,细化等)。 十二,图像形状参数测量(标号法面积测量,labeling去除小面积粒子,标号法周长测量,...
  • 图像的腐蚀与膨胀

    2018-10-11 14:15:46
    图像腐蚀与膨胀 结构元素 设有两幅图象B,X。若X是被处理的对象,而B是用来处理X的,则称B为结构元素(structure element),又被形象地称做刷子。结构元素通常都是一些比较小的图象。 腐蚀 把结构元素B平...

    图像腐蚀与膨胀

    • 结构元素

    • 设有两幅图象B,X。若X是被处理的对象,而B是用来处理X的,则称B为结构元素(structure element),又被形象地称做刷子。结构元素通常都是一些比较小的图象。


    • 腐蚀

    • 把结构元素B平移a后得到Ba,若Ba包含于X,我们记下这个a点,所有满足上述条件的a点组成的集合称做X被B腐蚀(Erosion)的结果。如下图所示。
      这里写图片描述

    • 其中X是被处理的对象,B是结构元素。对于任意一个在阴影部分的点a,Ba 包含于X,所以X被B腐蚀的结果就是那个阴影部分。阴影部分在X的范围之内,且比X小,就象X被剥掉了一层似的。

    • 膨胀

    • 膨胀(dilation)可以看做是腐蚀的对偶运算,其定义是:把结构元素B平移a后得到Ba,若Ba击中X,我们记下这个a点。所有满足上述条件的a点组成的集合称做X被B膨胀的结果。如下图所示。
      这里写图片描述

    • 其中X是被处理的对象,B是结构元素,不难知道,对于任意一个在阴影部分的点a,Ba击中X,所以X被B膨胀的结果就是那个阴影部分。阴影部分包括X的所有范围,就象X膨胀了一圈似的。


    接下来请看如下图:我们就能了解其具体工作原理了。

    这里写图片描述

    这里写图片描述


    膨胀和腐蚀为相反的一对操作。dilate (膨胀) erode(腐蚀)都是形态学的滤波。

    图像的膨胀:
    在这里插入图片描述

    在这里插入图片描述

    #include <opencv2/core/core.hpp>
    #include <opencv2/highgui/highgui.hpp>
    #include <opencv2/imgproc/imgproc.hpp>
    #include <iostream>
      
    using namespace std;
    using namespace cv;
    
    int main(   )
    {
    
    	//载入原图  
    	Mat image = imread("C://1.jpg");
    
    	//创建窗口  
    	namedWindow("【原图】膨胀操作");
    	namedWindow("【效果图】膨胀操作");
    
    	//显示原图
    	imshow("【原图】膨胀操作", image);
    
    	//进行膨胀操作 
    	Mat element = getStructuringElement(MORPH_RECT, Size(15, 15));
    	Mat out;
    	dilate(image, out, element);
    
    	//显示效果图 
    	imshow("【效果图】膨胀操作", out);
    
    	waitKey(0); 
    
    	return 0;
    }
    

    图像的腐蚀:
    在这里插入图片描述
    代码如下:

    #include <opencv2/highgui/highgui.hpp>
    #include <opencv2/imgproc/imgproc.hpp>
    using namespace cv;
    
    int main(   )
    {
    	//载入原图  
    	Mat srcImage = imread("C://1.jpg");
    	//显示原图
    	imshow("【原图】腐蚀操作", srcImage);
    	//进行腐蚀操作 
    	Mat element = getStructuringElement(MORPH_RECT, Size(15, 15));
    	Mat dstImage;
    	erode(srcImage, dstImage, element);
    	//显示效果图 
    	imshow("【效果图】腐蚀操作", dstImage);
    	waitKey(0); 
    
    	return 0;
    }
    

    图像的膨胀和腐蚀的综合示例:可以改变滑动条窗口改变内核的大小,0代表腐蚀,1代表膨胀。
    代码如下:

    #include <opencv2/opencv.hpp>
    #include <opencv2/highgui/highgui.hpp>
    #include <opencv2/imgproc/imgproc.hpp>
    #include <iostream>
    using namespace std;
    using namespace cv;
    
    
    //-----------------------------------【全局变量声明部分】--------------------------------------
    //		描述:全局变量声明
    //-----------------------------------------------------------------------------------------------
    Mat g_srcImage, g_dstImage;//原始图和效果图
    int g_nTrackbarNumer = 0;//0表示腐蚀erode, 1表示膨胀dilate
    int g_nStructElementSize = 3; //结构元素(内核矩阵)的尺寸
    
    
    //-----------------------------------【全局函数声明部分】--------------------------------------
    //		描述:全局函数声明
    //-----------------------------------------------------------------------------------------------
    void Process();//膨胀和腐蚀的处理函数
    void on_TrackbarNumChange(int, void *);//回调函数
    void on_ElementSizeChange(int, void *);//回调函数
    
    //-----------------------------------【main( )函数】--------------------------------------------
    //		描述:控制台应用程序的入口函数,我们的程序从这里开始
    //-----------------------------------------------------------------------------------------------
    int main( )
    {
    	//载入原图
    	g_srcImage = imread("C://1.jpg");
    	if( !g_srcImage.data ) { printf("读取srcImage错误~! \n"); return false; }
    
    	//显示原始图
    	namedWindow("【原始图】");
    	imshow("【原始图】", g_srcImage);
    
    	//进行初次腐蚀操作并显示效果图
    	namedWindow("【效果图】");
    	//获取自定义核
    	Mat element = getStructuringElement(MORPH_RECT, Size(2*g_nStructElementSize+1, 2*g_nStructElementSize+1),Point( g_nStructElementSize, g_nStructElementSize ));
    	erode(g_srcImage, g_dstImage, element);
    	imshow("【效果图】", g_dstImage);
    
    	//创建轨迹条
    	createTrackbar("腐蚀/膨胀", "【效果图】", &g_nTrackbarNumer, 1, on_TrackbarNumChange);
    	createTrackbar("内核尺寸", "【效果图】", &g_nStructElementSize, 21, on_ElementSizeChange);
    
    	//输出一些帮助信息
    	cout<<endl<<"\t运行成功,请调整滚动条观察图像效果~\n\n"
    		<<"\t按下“q”键时,程序退出。\n";
    
    	//轮询获取按键信息,若下q键,程序退出
    	while(char(waitKey(1)) != 'q') {}
    
    	return 0;
    }
    
    //-----------------------------【Process( )函数】------------------------------------
    //		描述:进行自定义的腐蚀和膨胀操作
    //-----------------------------------------------------------------------------------------
    void Process() 
    {
    	//获取自定义核
    	Mat element = getStructuringElement(MORPH_RECT, Size(2*g_nStructElementSize+1, 2*g_nStructElementSize+1),Point( g_nStructElementSize, g_nStructElementSize ));
    
    	//进行腐蚀或膨胀操作
    	if(g_nTrackbarNumer == 0) {    
    		erode(g_srcImage, g_dstImage, element);
    	}
    	else {
    		dilate(g_srcImage, g_dstImage, element);
    	}
    
    	//显示效果图
    	imshow("【效果图】", g_dstImage);
    }
    
    
    //-----------------------------【on_TrackbarNumChange( )函数】------------------------------------
    //		描述:腐蚀和膨胀之间切换开关的回调函数
    //-----------------------------------------------------------------------------------------------------
    void on_TrackbarNumChange(int, void *) 
    {
    	//腐蚀和膨胀之间效果已经切换,回调函数体内需调用一次Process函数,使改变后的效果立即生效并显示出来
    	Process();
    }
    
    
    //-----------------------------【on_ElementSizeChange( )函数】-------------------------------------
    //		描述:腐蚀和膨胀操作内核改变时的回调函数
    //-----------------------------------------------------------------------------------------------------
    void on_ElementSizeChange(int, void *)
    {
    	//内核尺寸已改变,回调函数体内需调用一次Process函数,使改变后的效果立即生效并显示出来
    	Process();
    }
    

    结果实例图:
    在这里插入图片描述

    在这里插入图片描述

    展开全文
  • 第九章:形态学图像处理1、图像的腐蚀和膨胀是两个基本的形态学操作,利用一些基于腐蚀和膨胀的形态学算法如边界提取、孔洞填充、凸壳、细化、骨架、裁剪等,可以从输入的图像中,输出感兴趣的特征。...

    第九章:形态学图像处理

    1、图像的腐蚀和膨胀是两个基本的形态学操作,利用一些基于腐蚀和膨胀的形态学算法如边界提取、孔洞填充、凸壳、细化、骨架、裁剪等,可以从输入的图像中,输出感兴趣的特征。

    预备知识

    集合论:集合的并、交、补、差、平移、反射



    这里写图片描述

    >> f1 = imread('Fig0903(a)(utk).tif');
    >> f2 = imread('Fig0903(b)(gt).tif');
    >> g1 = ~f1;
    >> g2 = f1|f2;
    >> g3 = f1&f2;
    >> g4 = f1&~f2;
    >> subplot(161) ,imshow(f1)
    >> subplot(162) ,imshow(f2)
    >> subplot(163) ,imshow(g1)
    >> subplot(164) ,imshow(g2)
    >> subplot(165) ,imshow(g3)
    >> subplot(166) ,imshow(g4)

    这里写图片描述

    腐蚀&膨胀

    结构元SE : strel

    这里写图片描述

    这里写图片描述

    这里写图片描述

    腐蚀:使图像缩小 A和B是两个集合,A被B腐蚀定义为:



    应用:消除图像细节部分,产生滤波作用


    膨胀:使图像扩大 A和B是两个集合,A被B膨胀定义为


       上式1表示:B的反射进行平移与A的交集不为空

        B的反射:相对于自身原点的映象

        B的平移:对B的反射进行位移


    应用:桥接文字裂缝



    对偶性:

    膨胀和腐蚀彼此关于集合求补运算和反运算是对偶的:




    开操作&闭操作

    开操作:使图像的轮廓变得光滑,断开狭窄 的间断和消除细的突出物

    Ø 使用结构元素B对集合A进行开操作,定义为:


    含义:先用B对A腐蚀,然后用B对结果膨胀


    闭操作:同样使图像的轮廓变得光滑,但与开操作相反,它能消除狭窄的间断和长细的鸿沟,消除小的孔洞,并填补轮廓线中的裂痕

    Ø    使用结构元素B对集合A进行闭操作,定义为:


     含义:先用B对A膨胀,然后用B对结果腐蚀

    对偶性质:


    应用:指纹

    Ü   a图是受噪声污染的指纹二值图像,噪声为黑色背景上的亮元素和亮指纹部分的暗元素

    ü   b图是使用的结构元素

    ü   c图是使用结构元素对图a腐蚀的结果:黑色背景噪声消除了,指纹中的噪声尺寸增加

    ü   d图是使用结构元素对图c膨胀的结果:包含于指纹中的噪声分量的尺寸被减小或被完全消除,带来的问题是:在指纹纹路间产生了新的间断

    ü   e图是对图d膨胀的结果,图d的大部分间断 被恢复,但指纹的线路变粗了

    ü   f图是对图e腐蚀的结果,即对图d中开操作的闭操作。最后结果消除了噪声斑点

    ü    缺点:指纹线路还是有缺点,可以通过加入限制性条件解决


    击中或击不中变换:形状检测的基本工具

    基本形态学算法

    1、边界提取

    定义:

    上式表示:先用B对A腐蚀,然后用A减去腐蚀得到,B是结构元素

    应用:

    1表示为白色,0表示为黑色

     



    2、孔洞填充

    定义:

    寻找背景点


    X0=p,如果Xk=Xk-1,则算法在迭代的第k步结束。Xk 和A的并集包含被填充的集合和它的边界

    条件膨胀:如果对上述公式的左部不加限制,则 上述公式的膨胀将填充整个区域。利用Ac的交集将结果限制在感兴趣区域内,实现条件膨胀

     


    应用:




    3、连通分量提取

    定义:令Y表示一个包含于集合A中的连通分量,并假设Y中的一个点p是已知的。用下列迭代式生成Y的所有元素:

    寻找前景点

    x0=p,如果Xk=Xk-1,算法收敛,令Y=Xk


    应用:自动检测


    4、凸壳

    用处:对物体描绘有帮助;

    ü     如果连接集合A内任意两个点的直线段都在A的内部,则A是凸形的

    ü     集合S的凸壳H是包含S的最小凸集合

    ü     H-S称为S的凸缺

    ü     求取集合A的凸壳C(A)的简单形态学算法:

    令Bi表示4个结构元素,i=1,2,3,4,

    A的凸壳为


    ü     先对A用B1运用击中或击不中变换,反复使用,当不再发生变化时,执行与A的并集运算,用D1表示结果

    ü     上述过程用B2重复,直到不发生变化。

    ü     最后得到的4个D的并集组成了A的凸壳

    (x表示不考虑)

     


    上述过程的一个明显缺点是:凸壳可能超出确保凸性所需的最小尺寸

    ü 解决办法:限制生长

    1>限制水平和垂直方向上的尺寸大小,如下图所示。

    2>限制水平、垂直和对角线方向上的最大尺寸。缺点是增加了算法的复杂性

     


    5、细化

    定义:

    ü     细化过程根据击中或击不中变换定义


    ü     定义结构元素序列为


    Bi是Bi-1旋转后的形式,如在B4中旋转900

    ü  用结构元素序列定义细化为


    即连续使用B1,B2,…,Bn对A细化


    6、粗化

    ü     粗化和细化在形态学上是对偶过程,定义为


    ü     用结构元素序列定义粗化为


    即连续使用B1,B2,…,Bn对A粗化

    ü     粗化可以通过细化算法求补集实现:先对所讨论集合的背景进行细化,然后对结果求

    补集,即粗化可以通过细化算法求补集实现: 为了对集合A进行粗化,先令C=Ac,然后对C进行细化,最后形成Cc



    7、骨架

    集合A的骨架符号为S(A),A的骨架可用腐蚀和开操作来表达


    其中:

        B:结构元素   为对A,k次腐蚀

        第K次是A被腐蚀为空集前最后一次迭代


        还可以重构


    这种方法的实质是细化可以抽于其骨架,但并不能延伸到边缘通过找到端点并对其进行有限制的膨胀,可恢复细化失去的有用的端线(点),从而去掉那些无用的分支。

    重构:




    8、裁剪(后处理)

    对细化处理和骨架绘制算法的补充,因为这些处理过程会将附加部分保留下来,应请除干净。

        现在想去除寄生分量(毛刺)的多余部分。

        可分4步来完成:

          (1) 令

       

     其中B为{B1,B2,B3,...B8},Bi为Bi-1转90°得到;

           (2)取X1端点集合X2

      

    用来检测端点的结构元素;

           (3)端点三次膨胀,并用A作限定器

    H为{x}结构元素,值为1

           (4)计算

     例如手写字体识别字母a的处理:


    9、形态学重建

    前面都是一幅图像和一个结构元;这里涉及两幅图像和一个结构元;

    【测地腐蚀和膨胀】

    F:标记图像;G:模板图像;(假设F、G二值图),且F⊆G.

    测地膨胀:

    • 大小为1的标记图像关于G的测地膨胀,∩(集合的交,等同于逻辑AND(与))


    • F关于G的大小为n的测地膨胀:


    其中:


    测地腐蚀:

    • 大小为1的F关于G的测地腐蚀,∪(集合的并,等同于逻辑OR(或))


    • F关于G的大小为n的测地腐蚀:


    其中:


    【用膨胀和腐蚀的形态学重建】

    标记图像F对模板图像G的膨胀形态学重建表示为(被定义为F关于G的测地膨胀),反复迭代至稳定状态:


    模板图像G对标记图像F的腐蚀形态学重建表示为(被定义为F关于G的测地腐蚀),反复迭代至稳定状态:


    【应用】

    1>重建开操作:来自F的大小为n的腐蚀的F的膨胀重建


    eg:从一个文本图像中提取长的、垂直笔画的字符;


    2>填充孔洞



    3>边界清除




    10、二值图像形态学操作小结


     


    灰度级形态学



    代码练习:

    http://www.cnblogs.com/tornadomeet/archive/2012/03/20/2408086.html

    对应图片下载

    展开全文
  • 图像膨胀和腐蚀

    2010-06-17 17:16:00
    1.图像膨胀的Matlab实现: 可以使用imdilate函数进行图像膨胀,imdilate函数需要两个基本输入参数,即待处理的输入图像和结构元素对象。结构元素对象可以是strel函数返回的对象,也可以是一个自己定义的表示结构元素...
  • 基于FPGA灰度图像膨胀算法的实现 1 背景知识 腐蚀与膨胀是形态学滤波的两个基本运算,通过腐蚀和膨胀两种运算可以实现多种功能,主要如下: (1) 消除噪声; (2)分割出独立的图像元素; (3)在图像中...
  • MATLAB图像处理

    2020-01-15 10:56:46
    介绍MATLAB提供的图像处理功能,包括图像基础知识、图像合成、空间变换、邻域和块处理、局部滤波、正交变换、数学形态学、图像分析、图像增强、图像恢复、图像分割、图像配准和图像三维重建等内容。
  • 图像处理(以及机器视觉)在学校里是一个很大的研究方向,很多研究生、博士生都在导师的带领下从事着这方面的研究。另外,就工作而言,也确实有很多这方面的岗位和机会虚位以待。而且这种情势也越来越凸显。那么图像...
  • 文章目录1、什么是膨胀与腐蚀2、形态学处理——膨胀2.1 更改卷积核大小2.2、更改迭代次数3、形态学处理——腐蚀3.1、更改卷积核大小3.2、更改迭代次数4、开运算和闭运算4.1、开运算4.2、闭运算5、梯度计算6、高帽和...
  • 图像处理——灰度化、二值化、膨胀算法、腐蚀算法以及开运算和闭运算的的C#代码实现
  • 注:本博文将讲解一个FPGA设计图像处理系统实例,此实例的功能为高速追踪乒乓球。读者可以参考本博文的算法思路、工程框架,但博主并不提供工程。 当前,实用的图像处理系统都要求高速处理。目前广泛采用软件进行...
  • 图像处理与识别

    2017-03-23 09:45:57
    数字图像处理是对图像进行分析、加工、和处理,使其满足视觉、心理以及其他要求的技术。图像处理是信号处理在图像域上的一个应用。目前大多数的图像是以数字形式存储,因而图像处理很多情况下指数字图像处理。此外,...
  • 图像处理与识别学习小结   数字图像处理是对图像进行分析、加工、和处理,使其满足视觉、心理以及其他要求的技术。图像处理是信号处理在图像域上的一个应用。目前大多数的图像是以数字形式存储,因而图像处理很多...
  • 本文主要讲解图像傅里叶变换的相关内容,在数字图像处理中,有两个经典的变换被广泛应用——傅里叶变换和霍夫变换。其中,傅里叶变换主要是将时间域上的信号转变为频率域上的信号,用来进行图像除噪、图像增强等处理...
  • 图像处理是应用在,对CT图像中医生所关注的区域进行精确的分割和定位。因此需要选择一种合适的图像分割算法。 这里我们选择分水岭分割的方法。该方法可以有效地提取图像中我们所关注的区域。在灰度图像中使用...
  • 处理图像如图1所示: 在本项目中,采用了Sobel边缘检测算子进行指纹的提取,通过膨胀腐蚀去除了部分面积较小的雾点,以第20号图即这里的待处理图像(4)为例得到图a即下面的图3-1。 用find函数提取经前几步处理...
1 2 3 4 5 ... 20
收藏数 2,951
精华内容 1,180