文章目录

  • 1、预备知识
  • 2、腐蚀和膨胀
  • 3、开操作和闭操作
  • 4、一些基本的形态学算法

1、预备知识

数学形态学的语言是集合论。

在形态学中集合的反射和平移广泛用来表达基于结构元(SE)的操作:研究一幅图像中感兴趣特性所用的小集合或子图像。

在二值图像中,除了元素是SE的成员的定义之外,还必须指定结构元的原点。

在形态学处理语言中,二值图像A和结构元素B都是定义在二维笛卡尔网格上的集合。当一个结构元素的原点位移到点(x,y)处时,将其记为BxyB_{x y}Bxy​

注意:当使用“结构元包含在集合中”这样的术语时,需明确指出A和B的元素完全重叠。不被包含的集合的边界会被腐蚀。

腐蚀和膨胀是形态学处理的基础,本章中讨论的许多形态学算法都是以这两种原始操作为基础的。

2、腐蚀和膨胀

1、腐蚀

B对A的腐蚀定义为
A⊖B={z∣(B)z⊆A}A \ominus B=\left\{z \mid(B)_{z} \subseteq A\right\} A⊖B={z∣(B)z​⊆A}
B对A的腐蚀是用一个z平移的B包含在A中的所有点z的集合,即如果B的原点位移到(x,y),那么B将完全包含在A中。

腐蚀缩小或细化了二值图像中的物体,可以将腐蚀看成是形态学滤波操作,这种操作将小于结构元的图像细节从图像中滤除了。腐蚀执行线滤波功能。

腐蚀对从一幅图像中去除小且无意义的物体来说是很有用的。

2、膨胀

B对A的膨胀定义为
A⊕B={z∣(B^)z∩A≠∅}A \oplus B=\left\{z \mid(\hat{B})_{z} \cap A \neq \varnothing\right\} A⊕B={z∣(B^)z​∩A​=∅}
B对A的膨胀是所有位移z的集合,B^\hat{B}B^和A至少有一个元素是重叠的。如果B的原点位移到(x,y),那么它与A的交集非空。

膨胀以集合操作为基础,是一种非线性操作。

膨胀在填补分割后物体中的空洞很有用。

3、对偶性

腐蚀和膨胀彼此关于集合求补运算和反射运算是对偶的。
(A⊖B)c=Ac⊕B^(A⊕B)c=Ac⊖B^\begin{array}{l} (A \ominus B)^{c}=A^{c} \oplus \hat{B} \\ (A \oplus B)^{c}=A^{c} \ominus \hat{B} \end{array} (A⊖B)c=Ac⊕B^(A⊕B)c=Ac⊖B^​
腐蚀和膨胀效果图如下:

import cv2
import numpy as np
import matplotlib.pyplot as pltimg = cv2.imread('C:/Users/13121/Desktop/c.png', 0) # 读取灰度图
# 得到一个3x3的十字交叉结构元,实际就是numpy矩阵
kernel = cv2.getStructuringElement(cv2.MORPH_CROSS,(3,3)) #卷积核
erode_res = cv2.erode(img, kernel)  # 腐蚀结果
dilate_res = cv2.dilate(img, kernel)  # 膨胀结果plt.subplot(1,3,1)
plt.imshow(erode_res, cmap=plt.cm.gray)
plt.title("erode")
plt.axis('off')
plt.subplot(1,3,2)
plt.imshow(img, cmap=plt.cm.gray)
plt.title("img")
plt.axis('off')
plt.subplot(1,3,3)
plt.imshow(dilate_res, cmap=plt.cm.gray)
plt.title("dilate")
plt.axis('off')
plt.show()

3、开操作和闭操作

膨胀会扩大一幅图像的组成部分,腐蚀会缩小一幅图像的组成部分。接下来学习的是形态学的另一组操作,开操作和闭操作。

  • 开操作会平滑物体的轮廓、断开较窄的狭颈并消除细的突出物;

A∘B=(A⊖B)⊕BA \circ B=(A \ominus B) \oplus B A∘B=(A⊖B)⊕B

​ B对A的开操作即B对A腐蚀,再用B对结果膨胀。

  • 闭操作会平滑轮廓的一部分,但会弥合较窄的间断和细长的沟壑,消除小的空洞,填补轮廓线中的断裂。

A⋅B=(A⊕B)⊖BA \cdot B=(A \oplus B) \ominus B A⋅B=(A⊕B)⊖B

​ B对A的闭操作即B对A膨胀,再用B对结果腐蚀。

开操作和闭操作效果图如下:

import cv2
import numpy as np
import matplotlib.pyplot as plt
img1 = cv2.imread('C:/Users/13121/Desktop/h.png', 0) # 读取灰度图
img2 = cv2.imread('C:/Users/13121/Desktop/g.png', 0) # 读取灰度图
# 得到一个5x5的矩形结构元
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))
iterations = 50  #迭代次数
open_res = cv2.morphologyEx(img1, cv2.MORPH_OPEN, kernel, iterations)
close_res = cv2.morphologyEx(img2, cv2.MORPH_CLOSE, kernel, iterations)plt.subplot(2,2,1)
plt.imshow(img, cmap=plt.cm.gray)
plt.title("img1")
plt.axis('off')plt.subplot(2,2,2)
plt.imshow(open_res, cmap=plt.cm.gray)
plt.title("open")
plt.axis('off')plt.subplot(2,2,3)
plt.imshow(img2, cmap=plt.cm.gray)
plt.title("img2")
plt.axis('off')plt.subplot(2,2,4)
plt.imshow(close_res, cmap=plt.cm.gray)
plt.title("close")
plt.axis('off')
plt.show()

4、一些基本的形态学算法

在处理二值图像时,形态学的主要应用之一是提取用于表示和描述形状的图像成分。本节中我们用1表示阴影区域0表示白色。

1、边界提取

即用一个结构元素对原图像进行腐蚀,腐蚀保留的都是物体的内部点,再用原图像减去腐蚀后的图像,留下的就是边界像素。
β(A)=A−(A⊖B)\beta(A)=A-(A \ominus B) β(A)=A−(A⊖B)

import cv2
import numpy as np
# import matplotlib.pyplot as plt
from matplotlib import pyplot as pltI = cv2.imread('C:/Users/13121/Desktop/c.png',0)
ret,img = cv2.threshold(I,127,255,cv2.THRESH_BINARY_INV)
kernel = np.ones((3,3),np.uint8)
r=cv2.erode(img,kernel,iterations=1)#边缘提取
e=img-rplt.subplot(121)
plt.imshow(img)
plt.title("original")
plt.axis('off')plt.subplot(122)
plt.imshow(e)
plt.title("after")
plt.axis('off')plt.show()

2、孔洞填充
Xk=(Xk−1⊕B)∩Ack=1,2,3,⋯X_{k}=\left(X_{k-1} \oplus B\right) \cap A^{c} \quad k=1,2,3, \cdots Xk​=(Xk−1​⊕B)∩Ack=1,2,3,⋯

对A图进行孔洞填充,先求出A集的补集,构建X0一幅全黑图像加上孔洞中的一点白作为初始图象,用B对X0进行膨胀,结果膨胀的结果超过了孔洞的大小,于是用之前构造的Ac对其求交集,将其结果限制在孔洞内,然后迭代,直到x{k-1}与xk相同没变化,最后得到X8孔洞的填充图像,最后与原图像求并集,就刚好把空洞填补了。

孔洞填充效果图如下:

参考代码

3、连通分量的提取

给原图像中的每个连通区分配给一个唯一代表该区域的编号,在输出图像中该连通区内的所有像素的像素值为该区域的编号,我们将这样的输出图像称为标注图像。

4、凸壳

如果连接物体A内的任意两点的直线段都在A的内部,则称A是凸的。

图像二值化后,如果光照不均,物体本身的形状可能会发生缺损,用凸壳进行处理可弥补凹损,算法会找到包含原始形状的最小凸多边形。

5、细化

细化分为两步过程,第一步是正常的腐蚀,但那些被标为可除去的像素点不立即消去,第二步将那些消除后并不破坏连通性的点消除,否则保留。

细化将一个曲线形物体细化为一条单像素宽的线,从而图形化地显示出其拓扑性质。

6、粗化

膨胀也可以在不合并邻近的物体的条件下实现。

可提取图像的补并用细化运算处理背景。实际上当每种腐蚀的变形作用于一幅图像的补时,就会获得一种相应的膨胀型运算。

粗化可在不合并彼此分离的物体的前提下扩大边界。

7、骨架

A的骨架可用腐蚀和开操作来表达。
S(A)=⋃k=0KSk(A)S(A)=\bigcup_{k=0}^{K} S_{k}(A) S(A)=k=0⋃K​Sk​(A)

Sk(A)=(A⊖kB)−(A⊖kB)∘BS_{k}(A)=(A \ominus k B)-(A \ominus k B) \circ B Sk​(A)=(A⊖kB)−(A⊖kB)∘B

一个与细化有关的运算是骨架,骨架是所有与物体在两个或更多非邻接边界点处相切的圆心的轨迹,但骨架很少通过在物体内拟合圆来实现。

骨架的实现与细化相似,可采用一个两步有条件腐蚀实现,但是删除像素的规则略有不同。

8、裁剪

通常细化和骨架过程会在所生成的图中留下毛刺,这些毛刺是一些小的分支,每个分支在距分叉处3个像素左右处有一个端点。毛刺是由边界上单像素尺寸的起伏造成的,这些起伏产生了小的分支。可以通过一些列的消除端点的3×3运算除去,然后再重建那些留下的分支。

小结
本章的知识比较连贯,学起来比较有意思…,腐蚀、膨胀、开操作、闭操作在之后的图像分割方面比较有用。

数字图像处理知识点梳理——第九章 形态学图像处理相关推荐

  1. 数字图像处理——第九章 形态学图像处理

    数字图像处理--第9章 形态学图像处理 文章目录 数字图像处理--第9章 形态学图像处理 1 基础知识 1.1 形态学图像 1.2 二值图像 2 腐蚀和膨胀 2.1 腐蚀 2.2 膨胀 3 开操作与闭 ...

  2. 数字图像处理第九章——形态学图像处理

    数字图像处理第九章 数字图像处理---形态学图像处理 (一)预备知识 1.1 集合理论中的基本概念 1.2 二值图像.集合及逻辑算子 (二)膨胀和腐蚀 2.1 膨胀 2.2 结构元的分解 2.3 st ...

  3. 数字图像处理第九章 形态学图像处理

    形态学图像处理 1 预备知识 1.1 集合理论中的基本概念 1.2 二值图像.集合及逻辑算子 2 膨胀和腐蚀 2.1 膨胀 2.2 腐蚀 3 膨胀与腐蚀的结合 3.1 开操作和闭操作 3.2 击中或击 ...

  4. 数字图像处理第九章----形态学图像处理

    文章目录 1.概念 2.腐蚀与膨胀 3.开闭运算 4.顶帽与黑帽运算 5.边界提取与区域填充 6.细化 7.总结 1.概念 形态学操作:数学形态学时基于集合论的图像处理方法,最早出现在生物学的形态与结 ...

  5. 数字图像处理知识点梳理——第二章 数字图像基础

    文章目录 2.1 视觉感知要素 2.2 光和电磁波谱 2.3 图像感知和获取 2.4 图像取样和量化 2.4.1 取样和量化的基本概念 2.4.2 数字图像表示 2.4.3 空间和灰度分辨率 2.4. ...

  6. OpenCV图像处理知识点梳理

    OpenCV知识点梳理 OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux.Windows.Android和Mas OS操作系统上. 它轻量级而且高效 ...

  7. 数字图像处理实验(七)| 形态学图像处理{生成结构元素strel、腐蚀运算imerode、膨胀运算imdilate、开运算imopen、闭运算imclose}(附代码和实验截图、汉字视力表项目、总结)

    文章目录 一.实验目的 二.实验仪器 三.实验原理 1. 结构元素: 2. 腐蚀运算: 3. 膨胀运算: 4. 开运算: 5. 闭运算: 四.实验内容: 1. 形态学图像处理用于图像边界提取 2.数学 ...

  8. 数字图像处理第九章形态学处理

    文章目录 引言 9.1预备知识 9.2腐蚀和膨胀 9.2.1腐蚀 9.2.2膨胀 9.3开操作和闭操作 9.3.1开操作 9.3.2闭操作 9.4一些基本的形态学算法 9.4.1边界提取 9.4.2孔 ...

  9. 数字图像处理——第九章 形态学处理

    文章目录 引言 9.1 一些基本的形态学集合 9.2 腐蚀和膨胀 9.3 开操作与闭操作 9.4 击中与击不中 9.5 形态学处理函数 实验部分 总结 引言 本章主要将数学形态学作为工具从图像中提取表 ...

最新文章

  1. 微信小游戏开发教程-新建项目
  2. RANSC算法(随机样本一致性)
  3. 小程序子组件向父组件传值_一套组件化、可复用、易扩展的微信小程序 UI 组件库...
  4. 添加Expires头
  5. python实体关系抽取_【关系抽取】从文本中进行关系抽取的几种不同的方法
  6. 活的通透的人,会是一个什么样的人?
  7. python数列的平方_python数组平方
  8. linux 卸载oracle库,Linux下完美卸载 Oracle
  9. python中的complex()函数
  10. 科目二学车经验(手动挡C1)
  11. 全志A33移植openharmony3.1标准系统之添加产品编译
  12. 计算机硬盘清理,Win7电脑的磁盘满了怎么办?最简单的清理方法教给你!
  13. 懒惰型性格分析,如何改变懒惰型性格?
  14. 数据结构c语言程序杨辉三角,杨辉三角 --- C语言程序
  15. dedecms 的采集
  16. Android实现画板工具 (实现涂写、清除、擦除、保存功能)
  17. java解析文件_Java读取文件方法大全
  18. 怀孕用计算机有辐射吗,电脑辐射对孕妇有影响吗?
  19. 成功解决 MDK5下载软件包(Software Packs)慢的问题
  20. 【C++之重载函数】数据排序

热门文章

  1. 彩灯控制单片c语言程序,用C语言实现键控彩灯系统
  2. app store服务器网站,app store 游戏服务器
  3. 程序设计基石与实践系列之编写高效的C程序与C代码优化
  4. 百度地图API详解之地图标注(一)
  5. 用dictionary写火星文翻译器
  6. 一头扎进springboot之使用Freemarker模板引擎渲染web视图
  7. 百度全景数据采集与分析
  8. 数字化转型中的大数据治理架构
  9. [MFC] 高仿Flappy bird 桌面版
  10. 使用纵横网络QQ群成员提取器进行邮件群发