本教程将学习如下内容:
- 学习多种形态学操作,如侵蚀、膨胀、开运算、闭运算等。
- 看到不同的函数,例如:
cv2.erotic()
,cv2.dilate()
、cv2.morphologyEx()
等。
理论基础
形态变换是一些基于图像形状。它通常在二进制图像上执行。 需要两种输入,一个是原始图像,第二个被称为结构元素或内核,决定操作的性质。 两个基本的形态学运算符是侵蚀和膨胀。它的变体形式,如打开、关闭、渐变等也开始发挥作用。 我们将在下图的帮助下逐一看到:
侵蚀
侵蚀(Erosion)的基本概念就像土壤侵蚀一样,它侵蚀了前景对象的边界(始终尽量保持前景为白色)。 那么,它有什么作用呢?内核在图像中滑动(如2D卷积)。 只有当内核下的所有像素都为1时,原始图像中的像素(1或0)才会被视为1,否则它会被侵蚀(变为零)。
因此,根据内核的大小,边界附近的所有像素都将被丢弃。前景对象的厚度或大小减小,或者只是图像中的白色区域减小。 它可用于去除小的白噪声(如我们在颜色空间一章中看到的),分离两个连接的对象等。
在这里使用一个5x5的内核作为示例,其中包含很多内核。让我们看看它是如何工作的:
import cv2
import numpy as np
img = cv2.imread('/data/cvdata/j.png',0)
kernel = np.ones((5,5),np.uint8)
erosion = cv2.erode(img,kernel,iterations = 1)
%matplotlib inline
import matplotlib.pyplot as plt
plt.imshow(erosion)
<matplotlib.image.AxesImage at 0x7f8d247308c0>
dilation = cv2.dilate(img,kernel,iterations = 1)
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)
# Rectangular Kernel
cv2.getStructuringElement(cv2.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)
cv2.getStructuringElement(cv2.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)
cv2.getStructuringElement(cv2.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)