Gonzalez R. C. and Woods R. E. Digital Image Processing (Forth Edition)
符号 | 即 | 操作 | 说明 |
---|---|---|---|
(ominus) | erosion | ({z:(B)_z subset A}) | Erodes the boundary of A |
(oplus) | dilation | ({z:(hat{B})_z igcap A ot= empty}) | Dilates the boundary of A |
(circ) | opening | ((A ominus B) oplus B) | Smoothes contours, breaks narrow isthmuses, and eliminates small islands and sharp peaks. |
(ullet) | closing | ((Aoplus B) ominus B) | Smoothes contours, fuses narrow breaks and long thin gulfs, and eliminates small holes. |
(circledast) | hit-or-miss | ({z:(B)_z subset I}) | Finds I. B contains instances both of foreground B in image and background elements. |
(eta(A)) | boundary extraction | (A - (A ominus B)) | Set of points on the boundary of set A |
- | hole filling | ((X_{k-1} oplus B) igcap I^c) | Fills holes in A |
- | connected components | ((X_{k-1} oplus B) igcap I) | Finds connected components in (I). |
(C(A)) | convex hull | ((X_{k-1}^i circledast B^i) igcup X_{k-1}^i) | Finds the convex hull |
(otimes) | thining | (A - (A circledast B)) | Thins set A |
(odot) | thickening | (Aigcup (A circledast B)) | Thickens set A |
(S(A)) | skeleton | $(A ominus kB) - (A ominus kB) circ B $ | Finds the skeleton of set A |
- | pruning | ... | (X_4) is the result of pruning set A. |
(D_G^{(1)}(F)) | geodesic dilation | ((F oplus B) igcap G) | - |
(E_G^{(1)}(F)) | geodesic erosion | ((F ominus B) igcup G) | - |
(R_G^D(F)) | morphological reconstruction by dilation | (R_G^D (F) = D^{(k)}_G (F)) | - |
(R_G^E(F)) | morphological reconstruction by erosion | (R_G^E (F) = E^{(k)}_G (F)) | - |
(O_R^{(n)}(F)) | opening by reconstruction | (R_{F}^D (F ominus nB)) | - |
(C_R^{(n)}(F)) | closing by reconstruction | $ R_{F}^E (F oplus nB)$ | - |
- | hole filling | $H = [R_{Ic}D(F)]^c $ | Auto |
- | border clearing | (I - R_I^D(F)) | - |
概
直接把整个章节都拿来是决定这个形态学的东西实在是有趣, 加之前后联系过于紧密, 感觉如果过于割裂会导致以后回忆不起来, 所以直接对整个章节做个笔记得了.
我觉得首先需要牢记的是, 本章节是在集合的基础上讨论的, 对于一个二元图中的物体, 我们可以通过如下集合表示:
((x, y))表示值为(1)的坐标(这里假设foreground pixel的值为1, 当然也可以假设其为0).
注: 个人觉得, 这里讨论的时候并非像之前的图片一样以左上角原点, 而是以目标中心为原点然后发散开去(只是单纯便于理解和书写, 实际处理是不受影响的). 也就意味着, (x, y)是可以为负的, 显然这种表示的好处是不需要确定整个图片的大小范围.
本章节会频繁涉及到objects和structuring elements (SE)的概念, 说实话其具体的定义不是很清楚, 我还是从任务的角度来给它们做个解释.
因为本章节讨论的transform, 通常都是通过SE经过一些集合操作使得objects发生某种改变, 所以objects就是对象. SE
如上图所示, 虽然objects是一个仅仅记录0值的集合, 我们通常将其置于一个矩形区域中, 便于图片的处理, SE也是类似的. 特别的是, SE整体除了0, 1外还可能有( imes)的属性, 其表示0或1, 即该位置的点不我们所关心的点, 其可以任意匹配.
reflection and translation
反射, 即
需要注意的是该反射是以(B)的中心为原点的.
平移, 即
Erosion and Dilation
Erosion
Erosion操作能够令图片中的元素'缩小', 所以其在处理噪声的时候其实不错. 其定义为:
proof:
设上面三个定义分别为(C_1, C_2, C_3).
(C_1 subset C_2):
(forall z in C_1),
故
(C_2 = C_3):
(C_3 subset C_1):
(forall w in C_2):
示例
如下图所示, 第一行第一幅图是object, 通过第二幅SE erosion后object缩小了, 而通过第二行的SE更是直接成了一条线.
skimage.morphology.erosion
[erosion](Module: morphology — skimage v0.19.0.dev0 docs (scikit-image.org))
import numpy as np
import matplotlib.pyplot as plt
from skimage.morphology import erosion, disk
def plot_comparison(original, filtered, filter_name):
fig, (ax1, ax2) = plt.subplots(ncols=2, figsize=(8, 4), sharex=True,
sharey=True)
ax1.imshow(original, cmap=plt.cm.gray)
ax1.set_title('original')
ax1.axis('off')
ax2.imshow(filtered, cmap=plt.cm.gray)
ax2.set_title(filter_name)
ax2.axis('off')
img = np.ones((100, 100))
arow = np.zeros((10, 100))
img = np.vstack((arow, img, arow))
acol = np.zeros((120, 10))
img = np.hstack((acol, img, acol)).astype(np.uint8)
fig, ax = plt.subplots()
ax.imshow(img, cmap=plt.cm.gray)
footprint = disk(6) # {0, 1}, 半径为6的圆, 中心元素为1其余为0
eroded = erosion(img, footprint)
plot_comparison(img, eroded, 'erosion')
dilation
dilation的效果是令图中的元素进行扩张, 一些扫描的文本图像可能字符剑有断痕, 通过此可以修复.
其集合定义为:
proof:
记上面四种定义各自为(C_1, C_2, C_3, C_4):
(C_1 = C_2):
(forall z in C_1):
故
(forall w in C_2):
故
(C_2 = C_3 = C_4):
显然.
最后两个定义是很直观的, (C_3)相当于对于每一个点(bin B)为中心画一个(A), (C_4)则是以每一个(a in A)为中心画一个(B).
示例
skimage.morphology.dilation
from skimage.morphology import dilation
footprint = disk(6) # {0, 1}, 半径为6的圆, 中心元素为1其余为0
dilated = dilation(eroded, footprint)
plot_comparison(eroded, dilated, 'dilation')
注: 圆角实际上是下一节的东西.
对偶性
Opening and Closing
二者都有一种将目标变圆滑的效果.
Opening
定义:
proof:
示例
skimage.morphology.opening
from skimage.morphology import opening
footprint = disk(6)
opened = opening(img, footprint)
plot_comparison(img, opened, 'opening')
Closing
定义:
注: 书中为:
但感觉不一样啊.
proof:
示例
skimage.morphology.closing
from skimage.morphology import closing
footprint = disk(6)
closed = opening(img, footprint)
plot_comparison(img, closed, 'closing')
对偶性
且
The Hit-or-Miss Transform
主要用于shape detection.
定义:
此为(B_1, B_2)不包含(0)元素的情形, 倘若允许(B)包含0元素, 那么
只是我们(B)通常需要一些特殊的性质来使其具有detection的作用.
具体怎么shape detection 还是请回看原文吧.
一些基本的操作
Boundary Extraction
定义:
直观的感觉就是把object的中间部分挖掉.
Hole Filling
假设在我们想填的hole中已知一个点, 以这个点为基础出发(记为(X_0)):
停止准则为
不过需要注意的是, (B)应该选择下面类型的(如果是全满的话可能跳出hole了).
Extraction of Connected Components
抓取连通区域, 假设已知在我们想抓取的连通区域的一点, 从这个点出发(记为(X_0)):
直到
Convex Hull
将一个object填补成凸的, 这个说实话没怎么看明白.
当
时停止, 记其为(D^i), 最后的convex hull 为
总感觉这个不是最小的凸包啊.
skimage.morphology.convex_hull_image
Thinning
定义:
skimage.morphology.thin
Thickening
相反的操作:
Skeletons
其严格的定义有些复杂, 感觉有点拓扑结构?
skimage.morphology.skeletonize
Pruning
pruning 方法用于去掉别的方法留下的一些spurs:
(B^k)为下图的一系列(而({B})为其中一部分不一定全部用到):
Morphological Reconstruction
Morphological Reconstruction除了之前用到的(F, B)外, 还要额外用到一个图片(称为mask)作为一个reconstruction的limit.
Geodesic Dilation and Erosion
假设(F subset G), geodesic dilation:
geodesic erosion:
直观上很好解释, 即geodesic dilation在扩张的时候不能超过(G), 而geodesic erosion在收缩的时候不会少于(G).
Morphological Reconstruction by Dilation and by Erosion
定义很简单, 即重复上述操作直到收敛:
Opening|Closing by Reconstruction
直观解释就是, 先erosion (n)次, 再在此基础上不断扩张(受限于(F)).
Closing by Reconstruction 就是:
Automatic Algorithm for Filling Holes
之前介绍的hole filling需要一个点为基础, 这个算法是全自动的.
感觉还是挺好理解的, 就是从边边, 由于中间部分的hole一定会被包围起来, 所以(H^c)一定不包含中间部分的hole.
Border Clearing
能够把边缘的一些部分给去了.