技术标签: 图像处理
腐蚀和膨胀是图像应用中比较广泛的操作,笔者尽量让从未接触过腐蚀和膨胀的读者看完这篇博客就能明白。
首先需要熟悉几个概念,结构元它就是用来操作图像的一种空间上的模板,它通常有以下几种形状,其中的小黑点代表原点,原点不一定位于几何尺寸对齐的位置,它可以在结构元内的任意位置。下图第一行是结构元的原始的形状,第二行是计算机在操作图像时要求将结构元填充成矩形(要尽可能的少填充元素)。
被结构元操作的一系列元素,这些元素在图像中可以理解为图像中每个像素点的二维位置。下图中A就是一个集合,B就是结构元。
当将上图中,结构元B原地平移到集合A的原点处(A左上角),会发现结构元B的其他元素已经超出了集合A的范围,在计算机中处理要求对集合A进行填充至矩形,并且能够刚好容纳结构元B。填充效果如下图所示:
∈ \in ∈表示属于,代表元素与集合的关系,例如
A = { 1 , 2 , 3 , 4 } 1 ∈ A A = \{ 1 , 2 , 3 , 4 \}\\ 1\in A A={
1,2,3,4}1∈A
⊆ \subseteq ⊆表示包含,代表集合与集合的关系,例如
A = { 1 , 2 , 3 , 4 } , B = { 1 , 2 } B ⊆ A A = \{ 1 , 2 , 3 , 4 \},B= \{1,2\}\\ B\subseteq A A={
1,2,3,4},B={
1,2}B⊆A
( B ) z = { c ∣ c = b + z , b ∈ B } (B)_z =\{c|c = b+z,b\in B\} (B)z={ c∣c=b+z,b∈B}
b代表所有属于结构元B的元素,很明显 ( B ) z (B)_z (B)z就代表结构元B平移z后的集合。
B对A腐蚀表示为:
A ⊖ B = { z ∣ ( B ) z ⊆ A } A\ominus B=\{z|(B)_z\subseteq A\} A⊖B={
z∣(B)z⊆A}
也就是结构元B平移z后依然包含在集合A中所有的z的集合。又可以表示为
A ⊖ B = { z ∣ ( B ) z ∩ A c = ∅ } A\ominus B=\{z|(B)_z \cap A^c = \varnothing \} A⊖B={
z∣(B)z∩Ac=∅}
A c A^c Ac是集合A的补集,也就是不在集合A中的其他元素。
以下图为例:
因为平移的z是以原点为参考的,所以这个z就是下图红色的位置。
其中白色代表被结构元B处理后不满足腐蚀结果的位置,红色代表满足腐蚀处理后的位置。相当于被腐蚀后的集合A边界小了一圈,对应于图像操作中能够去除孤立的点。
( B ^ ) z = { w ∣ w = − b , b ∈ B } (\hat B)_z = \{w|w=-b,b\in B\} (B^)z={ w∣w=−b,b∈B}
b代表所有属于结构元B的元素,很明显 ( B ^ ) z (\hat B)_z (B^)z就代表结构元B在原点处反转后的集合。对于原点对称的结构元B
( B ^ ) z = ( B ) z (\hat B)_z = (B)_z (B^)z=(B)z
B对A膨胀表示为:
A ⊕ B = { z ∣ ( B ^ ) z ∩ A ≠ ∅ } A\oplus B=\{z|(\hat B)_z\cap A \neq \varnothing\} A⊕B={
z∣(B^)z∩A=∅}
也就是反转后的结构元B平移z后与集合A的交集不为空的所有z的集合。又可以表示为:
A ⊕ B = { z ∣ [ ( B ^ ) z ∩ A ] ⊆ A } A\oplus B=\{z|[(\hat B)_z\cap A] \subseteq A\} A⊕B={
z∣[(B^)z∩A]⊆A}
以下图为例:
初始的集合A和结构B
沿着结构元B的原点将结构元B反转,因为结构元B关于原点对称,因此反转后的与未反转一致。
同样平移的z是以原点为参考的,所以这个z就是下图红色的位置。
其中蓝色和红色都代表被反转结构元B处理后符合膨胀的位置,红色代表被膨胀后多出来的位置,蓝色代表原来集合A的位置,相当于被膨胀后的集合A边界外扩了一圈,对应于图像操作中能够连接相对靠进孤立的点。
对于结构元B原点位于几何对称的位置时,有
( B ^ ) z = ( B ) z (\hat B)_z = (B)_z (B^)z=(B)z
( A ⊖ B ) c = { z ∣ ( B ) z ⊆ A } c = { z ∣ ( B ) z ∩ A c = ∅ } c = { z ∣ ( B ^ ) z ∩ A c = ∅ } c = { z ∣ ( B ^ ) z ∩ A c ≠ ∅ } = ( A c ⊕ B ) \begin{aligned} (A\ominus B)^c&=\{z|(B)_z\subseteq A\}^c\\ &=\{z|(B)_z\cap A^c = \varnothing\}^c\\ &=\{z|(\hat B)_z\cap A^c = \varnothing\}^c\\ &=\{z|(\hat B)_z\cap A^c \neq \varnothing\}\\ &=(A^c\oplus B) \end{aligned} (A⊖B)c={ z∣(B)z⊆A}c={ z∣(B)z∩Ac=∅}c={ z∣(B^)z∩Ac=∅}c={ z∣(B^)z∩Ac=∅}=(Ac⊕B)
( A ⊕ B ) c = { z ∣ ( B ^ ) z ∩ A ≠ ∅ } c = { z ∣ ( B ^ ) z ∩ A = ∅ } = { z ∣ ( B ^ ) z ⊆ A c } = { z ∣ ( B ) z ⊆ A c } = ( A c ⊖ B ) \begin{aligned} (A\oplus B)^c&=\{z|(\hat B)_z\cap A\neq \varnothing \}^c\\ &=\{z|(\hat B)_z\cap A = \varnothing\}\\ &=\{z|(\hat B)_z \subseteq A^c\}\\ &=\{z|( B)_z\subseteq A^c\}\\ &=(A^c\ominus B) \end{aligned} (A⊕B)c={ z∣(B^)z∩A=∅}c={ z∣(B^)z∩A=∅}={ z∣(B^)z⊆Ac}={ z∣(B)z⊆Ac}=(Ac⊖B)
文章浏览阅读284次。任务四MySQL实战_gbdt 即利用线性搜索估计叶节点区域的值,使损失函数极小化
文章浏览阅读1w次。Lua:Module ‘Bit’ not found/no file ./bit.so[已解决]问题描述:问题解决:问题描述:执行lua程序时报错如下:Module ‘Bit’ not found/no file ./bit.so问题解决:在bitop下载最新包:http://bitop.luajit.org/download.html下载到本地后解压:然后在本机ma..._module 'bit' not found:
文章浏览阅读3.5k次,点赞3次,收藏15次。ESP32调试-快速入门_esp32调试
文章浏览阅读2w次,点赞184次,收藏973次。一个工程师能走多远,取决于他对数学工具掌握的深度。_卡尔曼滤波 精髓
文章浏览阅读419次。本文关键字:Cannot connect to the Docker daemon at,containerd cannot properly do "clean-up" with shim process during start up,用标准方法实现的类群晖paas,with debugable appliance inside built_docker有自己的云函数面板吗
文章浏览阅读1.6k次。《计算机网络技术发展趋势(原稿).doc》由会员分享,可免费在线阅读全文,更多与《计算机网络技术发展趋势(原稿)》相关文档资源请在帮帮文库(www.woc88.com)数亿文档库存里搜索。1、,计算机网络用户对计算机网络安全技术的需求程度也会不断增加加的,所以我国当前的安全管理部门定要针对计算机安全,网络技术进行有效的研发。计算机网络安全现状计算机网络系统趋于不稳定状态随着当前人们生活节奏的不断加..._计算机网络技术发展三大趋势
文章浏览阅读2.8k次,点赞8次,收藏10次。mysql8.0 主从复制 Authentication plugin 'caching_sha2_password' Error_code: MY-002061解决办法_error_code: my-002061
文章浏览阅读5k次,点赞3次,收藏11次。那么我们只需要在home.vue想要的地方添加比如我们需要在 home.vue 中引用 headView.Vue。_vue一个页面引用另一个页面
文章浏览阅读4.5w次,点赞845次,收藏4k次。2021 年程序员必备 Windows 快捷操作大大大全_10年码龄
文章浏览阅读582次。JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。通过JVM,Java实现了平台无关性。_java jvm
文章浏览阅读768次。首先RIP是基于UDP进行传输的,而UDP是一个不可靠的协议,他在传输过程中可能会丢失某些数据。缺省情况下,RIP协议的路由更新报文的发送间隔是30S,而如果两个AS内部的路由表非常大,30秒的时间可能还不够将所有的路由信息传递给对方AS,这样,整条链路完全就是为了RIP的通告报文服务,而不能转发数据流量。将UDP协议更换为TCP协议,不用担心数据丢失,并且TCP会预先建立连接,也就让路由器有了一个准备的时间,而不是像RIP一样毫无准备的接受大量更新数据。取消周期更新,改为触发更新。_边界网关协议不同的管理机构是哪些
文章浏览阅读1.6k次。@TOC前言本次实验需要使用之前的shape_predictor_68_face_landmarks.dat一、图片预处理import dlib # 人脸识别的库dlibimport numpy as np # 数据处理的库numpyimport cv2 # 图像处理的库OpenCvimport os # dlib预测器detector = dlib.get_frontal_face_detector()# shape_predictor_68__predictor = dlib.shape_predictor('d:\\shape_predictor_68_face_landmarks.dat