【基础】开运算与闭运算
1. 开运算
开运算进行的操作是先将图像腐蚀,再对腐蚀的结果进行膨胀。开运算可以用于去噪、计数等。
例如,在下图中,通过先腐蚀后膨胀的开运算操作实现了去噪:

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

其中,
左图是原始图像
中间的图是对原始图像进行腐蚀的结果
右图是对腐蚀后的图像进行膨胀的结果,即对原始图像进行开运算的处理结果
openCV提供cv2.morphologyEx()通用形态学函数进行各种形态学操作,包括腐蚀、膨胀、开运算、闭运算、形态学梯度计算、礼帽运算(顶帽运算)、黑帽运算等操作,其函数格式如下:
dst = cv2.morphologyEx(src, op, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]])
dst:经过形态学处理后的输出图像,该图像和原始图像具有相同的大小和类型src:输入图像op:操作类型,如下图所示:

程序演示:
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()

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

左图为原始图像,右图为开运算后的结果图像。
2. 闭运算
闭运算是先膨胀、后腐蚀的运算,它有助于关闭前景物体内部的小孔,或去除物体上的小黑点,还可以将不同的前景图像进行连接。
例如,在下图中,通过先膨胀后腐蚀的闭运算去除了原始图像内部的小孔(内部闭合的闭运算),

其中,
左图为原始图像
中间的图是对原始图像进行膨胀操作的结果
右图为对膨胀图像进行腐蚀的结果,也即是闭运算的结果
从上图可以看到,原始图像在经过膨胀、腐蚀后,实现了闭合内部小孔的目的。除此以外,闭运算还可以实现前景图像的连接。例如,在下图中,利用闭运算将原本独立的两部分前景图像连接在一起,

其中:
左图为原始图像
中间的图是对原始图像进行膨胀操作的结果
右图为对膨胀图像进行腐蚀的结果,也即是闭运算的结果
程序演示:
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()
