一、引言
在计算机视觉领域,形态学变换是一种基于图像形状的简单操作,常用于图像预处理、特征提取等任务。OpenCV 作为一个强大的计算机视觉库,提供了丰富的形态学变换函数。本文将详细介绍 OpenCV 中常见的形态学变换操作,并通过 Python 代码展示如何对一张猫咪图像进行这些操作。
二、环境准备
在运行代码之前,你需要安装 OpenCV 库。可以使用以下命令进行安装:
bash
pip install opencv-python
三、代码实现
1. 导入必要的库
python
import cv2
import numpy as np
2. 腐蚀操作
腐蚀操作会使图像中的前景物体变小,通常用于去除小的噪声点。
二值图腐蚀后白色像素(非0)变少了。
python
# 腐蚀
def test001():
img = cv2.imread("./opencv_work/src/cat.jpg", cv2.IMREAD_GRAYSCALE)
kernel = np.ones((3, 3), np.uint8)
# img_erode=cv2.erode(img,kernel=kernel,iterations=2)
img_erode = cv2.erode(img, kernel=kernel)
img_erode = cv2.erode(img_erode, kernel=kernel)
cv2.imshow("img", img)
cv2.imshow("img_erode", img_erode)
cv2.waitKey(0)
3. 膨胀操作
膨胀操作会使图像中的前景物体变大,通常用于连接断裂的物体。
二值图膨胀后白色像素变多了。
python
# 膨胀
def test002():
img = cv2.imread("./opencv_work/src/cat.jpg", cv2.IMREAD_GRAYSCALE)
kernel = np.ones((3, 3), np.uint8)
img_dilate = cv2.dilate(img, kernel=kernel, iterations=2)
cv2.imshow("img", img)
cv2.imshow("img_dilate", img_dilate)
cv2.waitKey(0)
4. 开运算
开运算先进行腐蚀操作,再进行膨胀操作,常用于去除小的前景物体。
python
# 开运算:先腐蚀后膨胀
def test003():
img = cv2.imread("./opencv_work/src/cat.jpg", cv2.IMREAD_GRAYSCALE)
kernel = np.ones((3, 3), np.uint8)
img_open = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel=kernel)
cv2.imshow("img", img)
cv2.imshow("img_open", img_open)
cv2.waitKey(0)
5. 闭运算
闭运算先进行膨胀操作,再进行腐蚀操作,常用于填充前景物体内部的小孔。
python
# 闭运算:先膨胀后腐蚀
def test004():
img = cv2.imread("./opencv_work/src/cat.jpg", cv2.IMREAD_GRAYSCALE)
kernel = np.ones((3, 3), np.uint8)
img_close = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel=kernel)
cv2.imshow("img", img)
cv2.imshow("img_close", img_close)
cv2.waitKey(0)
6. 礼帽操作
礼帽操作是原始图像与开运算结果之差,常用于突出图像中的噪声点。
python
# 礼帽:原始图像与开运算之差
def test005():
img = cv2.imread("./opencv_work/src/cat.jpg", cv2.IMREAD_GRAYSCALE)
kernel = np.ones((3, 3), np.uint8)
img_tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel=kernel)
cv2.imshow("img", img)
cv2.imshow("img_tophat", img_tophat)
cv2.waitKey(0)
7. 黑帽操作
黑帽操作是闭运算结果与原始图像之差,常用于突出图像中的小孔。
python
# 黑帽:闭运算与原始图像之差
def test006():
img = cv2.imread("./opencv_work/src/cat.jpg", cv2.IMREAD_GRAYSCALE)
kernel = np.ones((3, 3), np.uint8)
img_blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel=kernel)
cv2.imshow("img", img)
cv2.imshow("img_blackhat", img_blackhat)
cv2.waitKey(0)
8. 形态学梯度操作
形态学梯度操作是膨胀结果与腐蚀结果之差,常用于突出图像的边缘。
python
# 形态学梯度:膨胀与腐蚀之差
def test007():
img = cv2.imread("./opencv_work/src/cat.jpg", cv2.IMREAD_GRAYSCALE)
kernel = np.ones((3, 3), np.uint8)
img2 = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)
cv2.imshow("img", img)
cv2.imshow("img2", img2)
cv2.waitKey(0)
9. 主函数调用
python
if __name__ == '__main__':
# test001()
# test002()
# test003()
# test004()
# test005()
# test006()
test007()
四、代码解释
- 导入库 :导入了
cv2
和numpy
库,cv2
用于图像处理,numpy
用于创建核。 - 读取图像 :使用
cv2.imread
函数读取猫咪图像,并将其转换为灰度图像。 - 创建核 :使用
np.ones
函数创建一个 3x3 的核,用于形态学变换。 - 形态学变换 :使用
cv2.erode
、cv2.dilate
和cv2.morphologyEx
函数进行不同的形态学变换。 - 显示图像 :使用
cv2.imshow
函数显示原始图像和变换后的图像。 - 等待按键 :使用
cv2.waitKey
函数等待用户按下任意键关闭窗口。
五、总结
通过本文的介绍,你学会了如何使用 OpenCV 进行常见的形态学变换操作。这些操作在图像预处理、特征提取等任务中非常有用。你可以根据自己的需求选择合适的形态学变换操作,对图像进行处理。
希望本文对你有所帮助!如果你有任何问题或建议,欢迎在评论区留言。