图像处理笔记(四)

今日计划:完成第九章 形态学图像处理 的学习

孔洞填充

基于集合膨胀,求补和交集的算法,条件膨胀。
到底在实际应用中要怎么做呢?

连通分量的提取

邻接性、连通性、区域和边界

四邻接:这些1与p是4邻接的。这些1与p之间的通路是4通路。
010
1p1
010

八邻接,这些1与p是8邻接的。这些1与p之间的通路是8通路,其中有四个点与p之间的通路同时也是4通路。
111
1p1
111

m邻接(混合邻接)。从右上角到第三排中间那个点是m通路。
011
0p0
010

上面这些点之间都有通路,构成的集合是连通集,如果R是连通集,R就是一个区域。R的补集就是背景。
区域R的边界上的点与R的补集中的点临近。一个区域及背景中的点之间的邻接要根据8连通来定义。例如下面的例子,如果用4连通来定义,f点就不会被当成是边界。
00000
0ab00
0cd00
0efg0
0hij0
00000

内边界在区域内,外边界在区域外。上民安的例子中区域的内边界就是区域本身。区域的外边界是围绕该区域的闭合通路。

边缘由某些超过预先设定的阈值的导数值的像素形成。
边缘和边界的区别?
边缘是基于在进行灰度级度量时不连续点的局部概念。
边缘点可以连接成边缘线段,有时以与边界对应的方法连接线段。

练习

找出头颅中的钉子

dev_open_window (0, 0, 512, 512, 'black', WindowHandle)

read_image(Image, 'head')

* 过滤出灰度在150-255之间的区域 ,图b
threshold(Image, Region, 150, 255)

* 用半径是1.5的圆形结构元素腐蚀,图c
erosion_circle(Region, RegionErosion, 1.5)

* 提取连通分量, 图d
connection(RegionErosion, ConnectedRegions)

* 选择我们感兴趣的区域 图e
select_shape(ConnectedRegions, SelectedRegions, 'area', 'and', 300, 700)

凸壳

集合A内连接任意两点的直线段都在A的内部,则称集合A是凸形的。
任何集合S的凸壳H是包含了S的最小凸集。

粗化和细化

粗化是细化的形态学对偶。针对粗化的分离算法一般先对问题中的集合的背景进行细化,然后对结果求补集。
细化:

\[A \otimes B = A - (A \circledast B) = A \cap (A \circledast B)^c \]

粗化:

\[A \odot B = A \cup (A \circledast B) \]

骨架

A骨架可以用腐蚀和开操作来表达:

\[S(A) = \mathop{\cup_{k=0}^{K}} S_{k}(A) \]

其中

\[S_{k}(A) = (A \ominus kB) - (A \ominus kb) \circ B \]

K是A被腐蚀为空集前的最后一次迭代步骤。

练习

求这件衣服的骨架

dev_open_window(0, 0, 512, 512, 'black', WindowHandle)

read_image(Image, 'cloth')

threshold(Image, Region, 0, 100)

gen_empty_region (EmptyRegion)

for Index := 1 to 520 by 1
    * 腐蚀
    erosion_circle(Region, RegionErosion, 1.5)
    
    area_center (RegionErosion, Area, Row, Column)
    
    * 判断是否已经腐蚀为空集了
    if (Area == 0)
        break
    endif

    * 开操作:腐蚀后膨胀
    erosion_circle(RegionErosion, RegionErosion1, 1.5)

    dilation_circle(RegionErosion1, RegionDilation, 1.5)

    * 区域相减
    difference(RegionErosion, RegionDilation, RegionDifference)

    Region := RegionErosion
    
    * 将上面减到的区域结合起来
    union2(RegionDifference, EmptyRegion, EmptyRegion)

endfor

裁剪

本质上是对细化和骨架算法的补充,这些过程会产生某些寄生分量,需要用后处理来清除这些寄生分量。
针对手写字体的识别问题:

  1. 分析骨架
  2. 处理骨架上的“毛刺”。这些毛刺是在腐蚀过程中由于组成字符的笔画的不均匀导致的,解决方案是不断删除寄生分支的终点来抑制寄生分支。

练一练。晚点再练,还没完全搞明白流程,流程有点长,先往下看。

形态学重建

涉及两幅图像和一个结构元,一副图像是标记,包含变换的起始点,另一幅图像是模板,它约束该变化。

测地膨胀

测地膨胀:
令F表示标记图像,G表示模板图像,假定都是二值图像,且\(F \subseteq G\),大小为1的标记图像关于模板的测地膨胀定义为:

\[D_{G}^{(1)}(F) = (F \oplus B) \cap G \]

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

\[D_{G}^{(n)}(F) = D_{G}^{(1)} [D_{G} ^{(n-1)} (F)] \]

其中

\[D_{G}^{(0)}(F) = F \]

测地腐蚀

保证每一幅图像的测地腐蚀仍然大于或等于其模板图像。
F关于G的大小为1的测试腐蚀:

\[E_{G}^{(1)}(F) = (F \ominus B) \cup G \]

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

\[E_{G}^{(n)}(F) = E_{G}^{(1)} [D_{G} ^{(n-1)} (F)] \]

其中

\[E_{G}^{(0)}(F) = F \]

有限数量图像的测地膨胀和腐蚀经过有限数量的迭代步骤之后总会收敛,因为标记图像的扩散或收缩收模板的约束。

应用:

重建开操作

一副图像F的大小为n的重建开操作是来自F的大小为n的腐蚀的F的膨胀重建,即:

\[O_{R}^{(n)}(F) = R_{F}^{D}[(F \ominus nB)] \]

其中,\((F \ominus nB)\) 表示B对F的n次腐蚀。

练习:
提取下图英文文本中包含垂直笔画的字符:
(文本来自网络)

dev_open_window(0, 0, 512, 512, 'black', WindowHandle)

read_image(Image, 'words')

threshold(Image, Region, 50, 255)

erosion_rectangle1(Region, RegionErosion, 2, 20)

* 测地膨胀
for Index := 1 to 100 by 1
    dilation_rectangle1(RegionErosion, RegionDilation, 3, 3)
    * 计算区域的交集
    intersection(Region, RegionDilation, RegionIntersection)
    RegionErosion := RegionIntersection
endfor

效果:
红色的区域是我们找到的,乱入了几个g

图1是找到的区域叠加在原图上的效果,图2是找到的区域,图三是只做一次开操作得到的区域

填充孔洞

令I(x, y)代表一幅二值图像,并假定形成了一幅标记图像F,除了在该图像的边界位置为1-I之外,其他位置均为0,即:

\[F(x, y) = \begin{cases} 1 - I(x, y) & (x, y)在I的边界上 \\ 0 & 其他 \end{cases} \]

\[H = [R_{I^{c}}^{D}(F)]^{c} \]

是一幅等于I且所有孔洞都被填充的二值图像。
练一练
还是上面那幅字母的图片,把所有的孔都填起来

边界清除

用原图做模板,使用如下标记图像:

\[F(x, y) = \begin{cases} I(x, y) & (x, y)位于I的边界上 \\ 0 &其他 \end{cases} \]

边界清除算法首先计算形态学重建 \(R_{I}^{D}(F)\),然后计算差:

\[X = I - R_{I}^{D}(F) \]

以得到一幅其中没有接触边界的物体的图像X。

孔洞填充和边界清除都只是理论知识记录了一下,稍后要用那张字母图片做练习。

posted @ 2019-06-24 18:33  yutou2016  阅读(1012)  评论(0编辑  收藏  举报