📜  Python OpenCV – 形态学运算(1)

📅  最后修改于: 2023-12-03 14:46:01.570000             🧑  作者: Mango

Python OpenCV – 形态学运算

在计算机视觉中,形态学运算是指基于形状的图像处理技术,用于处理二值图像(如:黑白图像)。OpenCV 提供了一系列形态学运算函数,包括膨胀、腐蚀、开运算、闭运算、梯度运算等。

1. 膨胀运算

膨胀运算是指使用结构元素将原始图像中的白色区域扩张,以填充边界空洞和连接各个相邻的元素,从而使它们更加连续和稳定。在 OpenCV 中,可以使用 cv2.dilate() 函数实现膨胀运算。例如:

import cv2
import numpy as np

img = cv2.imread("input.png", 0)
kernel = np.ones((5,5),np.uint8)
dilation = cv2.dilate(img, kernel, iterations = 1)
cv2.imshow("Input", img)
cv2.imshow("Dilation", dilation)
cv2.waitKey(0)
cv2.destroyAllWindows()

其中,cv2.imread() 函数用于读取输入图像,np.ones() 函数生成了一个 $5 \times 5$ 的矩阵作为结构元素,而 cv2.dilate() 函数执行一次膨胀运算。运行代码可以得到如下输出图像:

膨胀运算

2. 腐蚀运算

腐蚀运算是指使用结构元素将原始图像中的白色区域收缩,以达到消除噪点、分离物体和断开各个相邻元素的目的。在 OpenCV 中,可以使用 cv2.erode() 函数实现腐蚀运算。例如:

import cv2
import numpy as np

img = cv2.imread("input.png", 0)
kernel = np.ones((5,5),np.uint8)
erosion = cv2.erode(img, kernel, iterations = 1)
cv2.imshow("Input", img)
cv2.imshow("Erosion", erosion)
cv2.waitKey(0)
cv2.destroyAllWindows()

其中,cv2.erode() 函数执行一次腐蚀运算。运行代码可以得到如下输出图像:

腐蚀运算

3. 开运算

开运算是指先进行腐蚀运算,再进行膨胀运算,其目的是消除噪点,分离物体和断开相邻元素,同时保持原始物体的形状和大小不变。在 OpenCV 中,可以使用 cv2.morphologyEx() 函数实现开运算。例如:

import cv2
import numpy as np

img = cv2.imread("input.png", 0)
kernel = np.ones((5,5),np.uint8)
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
cv2.imshow("Input", img)
cv2.imshow("Opening", opening)
cv2.waitKey(0)
cv2.destroyAllWindows()

其中,cv2.morphologyEx() 函数第二个参数指定为 cv2.MORPH_OPEN,表示进行开运算。运行代码可以得到如下输出图像:

开运算

4. 闭运算

闭运算是指先进行膨胀运算,再进行腐蚀运算,其目的是填充物体内的小孔洞、连接相邻物体和平滑物体的边界线,同时保持原始物体的形状和大小不变。在 OpenCV 中,可以使用 cv2.morphologyEx() 函数实现闭运算。例如:

import cv2
import numpy as np

img = cv2.imread("input.png", 0)
kernel = np.ones((5,5),np.uint8)
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
cv2.imshow("Input", img)
cv2.imshow("Closing", closing)
cv2.waitKey(0)
cv2.destroyAllWindows()

其中,cv2.morphologyEx() 函数第二个参数指定为 cv2.MORPH_CLOSE,表示进行闭运算。运行代码可以得到如下输出图像:

闭运算

5. 梯度运算

梯度运算是指通过对输入图像执行膨胀和腐蚀操作,找到边缘和轮廓的方法。在 OpenCV 中,可以使用 cv2.morphologyEx() 函数指定运算类型为 cv2.MORPH_GRADIENT 实现梯度运算。例如:

import cv2
import numpy as np

img = cv2.imread("input.png", 0)
kernel = np.ones((5,5),np.uint8)
gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)
cv2.imshow("Input", img)
cv2.imshow("Gradient", gradient)
cv2.waitKey(0)
cv2.destroyAllWindows()

其中,cv2.morphologyEx() 函数第二个参数指定为 cv2.MORPH_GRADIENT,表示进行梯度运算。运行代码可以得到如下输出图像:

梯度运算

总结

本文介绍了 OpenCV 中的形态学运算函数,并通过实例代码演示了其基本用法。形态学运算是图像处理中常用的技术,通过对二值图像进行膨胀、腐蚀、开运算、闭运算和梯度运算等操作,可以提取出图像的重要特征,从而方便后续处理。