形态学操作¶
形态学操作(Morphological Transformations)是基于图像形状的简单操作,通常在二值化后的图像上使用。
结构元素 Structuring Element¶
Structuring Element 也叫 Kernel,就是用矩阵记录了一个固定大小的形状,元素 1 表示有效区域。
# Rectangular Kernel
>>> cv.getStructuringElement(cv.MORPH_RECT,(5,5))
array([[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]], dtype=uint8)
# Elliptical Kernel
>>> cv.getStructuringElement(cv.MORPH_ELLIPSE,(5,5))
array([[0, 0, 1, 0, 0],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[0, 0, 1, 0, 0]], dtype=uint8)
# Cross-shaped Kernel
>>> cv.getStructuringElement(cv.MORPH_CROSS,(5,5))
array([[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[1, 1, 1, 1, 1],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0]], dtype=uint8)
也可以用 numpy
手动创建。
腐蚀 Erosion¶
腐蚀操作会侵蚀掉白色区域的边界,常用于去除白色的噪点。侵蚀的程度和方式取决于 Kernel。
import cv2 as cv
import numpy as np
img = cv.imread('j.png', cv.IMREAD_GRAYSCALE)
kernel = np.ones((5,5), np.uint8)
erosion = cv.erode(img, kernel, iterations=1)
代码中使用的 Kernel 为
只有每个像素周围 5x5 区域都是 1,它才是 1,否则被侵蚀为 0。

膨胀 Dilation¶
膨胀操作和腐蚀操作相反,会扩大白色区域的边界,常用于将断开的地方重新连接起来。扩大程度和方式同样取决于 Kernel,对于每个像素,只要它周围存在 1,它就是 1。
dilation = cv.dilate(img, kernel, iterations=1)

开运算 Opening¶
常用于去除噪声。腐蚀能去掉噪声,但也会缩小我们想要的白色区域,所以再加一个膨胀,还原大小。
opening = cv.morphologyEx(img, cv.MORPH_OPEN, kernel)

闭运算 Closing¶
常用于填补白色区域中的洞。
closing = cv.morphologyEx(img, cv.MORPH_CLOSE, kernel)

形态学梯度 Morphological Gradient¶
可以得到白色区域的描边。
gradient = cv.morphologyEx(img, cv.MORPH_GRADIENT, kernel)

顶帽 Top Hat¶
可以提取白色噪点。
tophat = cv.morphologyEx(img, cv.MORPH_TOPHAT, kernel)
黑帽 Black Hat¶
可以提取白色区域中的洞。
blackhat = cv.morphologyEx(img, cv.MORPH_BLACKHAT, kernel)