目标
在这一章当中,
- 我们将学习不同的形态学操作,如腐蚀、膨胀、开、闭(Erosion, Dilation, Opening, Closing )等。
- 我们将看到不同的函数,例如:cv.erode()、cv.dilate()、cv.morphologyEx() 等。
理论
形态变换是基于图像形状的一些简单操作。 它通常在二进制图像上执行。 它需要两个输入,一个是我们的原始图像,第二个称为结构元素或内核,它决定了操作的性质。 两个基本的形态算子是侵蚀和膨胀。 然后它的变体形式,如Opening,Closing,Gradient等也开始发挥作用。 我们将在下图的帮助下一一看到它们:
1.侵蚀
侵蚀的基本思想就像土壤侵蚀一样,它侵蚀了前景物体的边界(总是尽量保持前景为白色)。 那么它有什么作用呢? 内核在图像中滑动(如在 2D 卷积中)。 只有当内核下的所有像素都为1时,原始图像中的一个像素(1或0)才会被认为是1,否则它会被侵蚀(变为0)。
所以发生的事情是,边界附近的所有像素都将根据内核的大小被丢弃。 因此,前景物体的厚度或大小会减小,或者只是图像中的白色区域减小。 它对于去除小的白噪声(正如我们在色彩空间章节中所见)、分离两个连接的对象等很有用。
在这里,作为一个例子,我会使用一个 5x5 的内核,里面装满了内核。 让我们看看它是如何工作的:
import cv2 as cv
import numpy as np
img = cv.imread('j.png',0)
kernel = np.ones((5,5),np.uint8)
erosion = cv.erode(img,kernel,iterations = 1)
2. 扩张
它与侵蚀正好相反。 这里,如果内核下的至少一个像素为“1”,则像素元素为“1”。 因此它增加了图像中的白色区域或前景对象的大小增加。 通常,在去除噪声等情况下,腐蚀之后是膨胀。 因为,侵蚀消除了白噪声,但它也缩小了我们的对象。 所以我们扩张它。 由于噪音消失了,它们不会回来,但我们的对象面积增加了。 它也可用于连接对象的损坏部分。
dilation = cv.dilate(img,kernel,iterations = 1)
3. 开幕 opening
打开只是腐蚀后膨胀的另一个名称。 正如我们上面解释的那样,它在消除噪音方面很有用。 这里我们使用函数 cv.morphologyEx()
opening = cv.morphologyEx(img, cv.MORPH_OPEN, kernel)
4. 结束 Closing
关闭与打开相反,膨胀后腐蚀。 它可用于关闭前景对象内部的小孔或对象上的小黑点。
closing = cv.morphologyEx(img, cv.MORPH_CLOSE, kernel)
5. 形态梯度
这是图像膨胀和腐蚀之间的区别。结果将看起来像对象的轮廓。
gradient = cv.morphologyEx(img, cv.MORPH_GRADIENT, kernel)
6. 礼帽 top hat
它是输入图像和图像打开之间的差异( difference between input image and Opening of the image. )。 下面的示例是针对 9x9 内核完成的。
tophat = cv.morphologyEx(img, cv.MORPH_TOPHAT, kernel)
7. Black Hat
It is the difference between the closing of the input image and input image
blackhat = cv.morphologyEx(img, cv.MORPH_BLACKHAT, kernel)