跳转至

形态学操作

形态学操作(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。

Erosion
Erosion

膨胀 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)

Dilation
Dilation

开运算 Opening

\[ \text{Open}(I)=\text{Dilate}(\text{Erode}(I)) \]

常用于去除噪声。腐蚀能去掉噪声,但也会缩小我们想要的白色区域,所以再加一个膨胀,还原大小。

opening = cv.morphologyEx(img, cv.MORPH_OPEN, kernel)

Opening
Opening

闭运算 Closing

\[ \text{Close}(I)=\text{Erode}(\text{Dilate}(I)) \]

常用于填补白色区域中的洞。

closing = cv.morphologyEx(img, cv.MORPH_CLOSE, kernel)

Closing
Closing

形态学梯度 Morphological Gradient

\[ \text{Gradient}(I)=\text{Dilate}(I)-\text{Erode}(I) \]

可以得到白色区域的描边。

gradient = cv.morphologyEx(img, cv.MORPH_GRADIENT, kernel)

Morphological Gradient
Morphological Gradient

顶帽 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)

参考


相关文章