【基础】开运算与闭运算

1. 开运算

开运算进行的操作是先将图像腐蚀,再对腐蚀的结果进行膨胀。开运算可以用于去噪、计数等。

例如,在下图中,通过先腐蚀后膨胀的开运算操作实现了去噪:

image.png

其中,

  • 左图是原始图像

  • 中间的图是对原始图像进行腐蚀的结果

  • 右图是对腐蚀后的图像再进行膨胀的结果,即对原始图像进行开运算的处理结果

从上图中可以看到,原始图像在经过腐蚀、膨胀后实现了去噪的目的。除此以外,开运算还可以用于计数。例如,在对下图中的区域进行计数前,可以利用开运算将连接在一起的不同区域划分开:

image.png

其中,

  • 左图是原始图像

  • 中间的图是对原始图像进行腐蚀的结果

  • 右图是对腐蚀后的图像进行膨胀的结果,即对原始图像进行开运算的处理结果

openCV提供cv2.morphologyEx()通用形态学函数进行各种形态学操作,包括腐蚀、膨胀、开运算、闭运算、形态学梯度计算、礼帽运算(顶帽运算)、黑帽运算等操作,其函数格式如下:

dst = cv2.morphologyEx(src, op, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]])
  • dst:经过形态学处理后的输出图像,该图像和原始图像具有相同的大小和类型

  • src:输入图像

  • op:操作类型,如下图所示:

image.png

程序演示

import cv2
import numpy as np

image = cv2.imread('char_W.jpg', cv2.IMREAD_GRAYSCALE)

kernel = np.ones((5, 5), dtype=np.uint8)

opening = cv2.morphologyEx(image, cv2.MORPH_OPEN, kernel)

image_stack = np.hstack((image, opening))

cv2.imshow('image_stack', image_stack)

cv2.waitKey(0)
cv2.destroyAllWindows()

image.png

左图为原始图像,右图为开运算后的结果图像。

image.png

左图为原始图像,右图为开运算后的结果图像。

2. 闭运算

闭运算是先膨胀、后腐蚀的运算,它有助于关闭前景物体内部的小孔,或去除物体上的小黑点,还可以将不同的前景图像进行连接。

例如,在下图中,通过先膨胀后腐蚀的闭运算去除了原始图像内部的小孔(内部闭合的闭运算),

image.png

其中,

  • 左图为原始图像

  • 中间的图是对原始图像进行膨胀操作的结果

  • 右图为对膨胀图像进行腐蚀的结果,也即是闭运算的结果

从上图可以看到,原始图像在经过膨胀、腐蚀后,实现了闭合内部小孔的目的。除此以外,闭运算还可以实现前景图像的连接。例如,在下图中,利用闭运算将原本独立的两部分前景图像连接在一起,

image.png

其中:

  • 左图为原始图像

  • 中间的图是对原始图像进行膨胀操作的结果

  • 右图为对膨胀图像进行腐蚀的结果,也即是闭运算的结果

程序演示

import cv2
import numpy as np

image = cv2.imread('char_W2.jpg', cv2.IMREAD_GRAYSCALE)
image = cv2.resize(image, (512, 512))

kernel = np.ones((11, 11), dtype=np.uint8)

closing = cv2.morphologyEx(image, cv2.MORPH_CLOSE, kernel)

image_stack = np.hstack((image, closing))

cv2.imshow('image_stack', image_stack)

cv2.waitKey(0)
cv2.destroyAllWindows()

image.png