形态学操作¶
形态学操作(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¶
\[ I_\text{Erosion}(x,y)=\min_{(i,j) \in \text{Kernel}} I(x+i,y+j) \]
腐蚀操作会侵蚀掉白色区域的边界,常用于去除白色的噪点。侵蚀的程度和方式取决于 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 为
\[ \begin{bmatrix} 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 \end{bmatrix} \]
只有每个像素周围 5x5 区域都是 1,它才是 1,否则被侵蚀为 0。
膨胀 Dilation¶
\[ I_\text{Dilation}(x,y)=\max_{(i,j) \in \text{Kernel}} I(x+i,y+j) \]
膨胀操作和腐蚀操作相反,会扩大白色区域的边界,常用于将断开的地方重新连接起来。扩大程度和方式同样取决于 Kernel,对于每个像素,只要它周围存在 1,它就是 1。
dilation = cv.dilate(img, kernel, iterations=1)
开运算 Opening¶
\[ \text{Open}(I)=\text{Dilate}(\text{Erode}(I)) \]
常用于去除噪声。腐蚀能去掉噪声,但也会缩小我们想要的白色区域,所以再加一个膨胀,还原大小。
opening = cv.morphologyEx(img, cv.MORPH_OPEN, kernel)
闭运算 Closing¶
\[ \text{Close}(I)=\text{Erode}(\text{Dilate}(I)) \]
常用于填补白色区域中的洞。
closing = cv.morphologyEx(img, cv.MORPH_CLOSE, kernel)
形态学梯度 Morphological Gradient¶
\[ \text{Gradient}(I)=\text{Dilate}(I)-\text{Erode}(I) \]
可以得到白色区域的描边。
gradient = cv.morphologyEx(img, cv.MORPH_GRADIENT, kernel)
顶帽 Top Hat¶
\[ \text{TopHat}(I)=I-\text{Open}(I) \]
可以提取白色噪点。
tophat = cv.morphologyEx(img, cv.MORPH_TOPHAT, kernel)
黑帽 Black Hat¶
\[ \text{BlackHat}(I)=\text{Close}(I)-I \]
可以提取白色区域中的洞。
blackhat = cv.morphologyEx(img, cv.MORPH_BLACKHAT, kernel)
参考¶
相关文章