如何使用Python OpenCV进行形态学操作?

更新于
2026-10-11 18:34:41
1阅读来源:SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计920个文字,预计阅读时间需要4分钟。

如何使用Python OpenCV进行形态学操作?

一、图像处理与展示

1.1 导入库

pythonimport cv2import numpy as np

1.2 读取图像

pythonimg=cv2.imread('DataPreprocessing/img/dige.png')

1.3 展示图像

pythoncv2.imshow('img', img)cv2.waitKey(0)cv2.destroyAllWindows()

一、 腐蚀与膨胀1.1 腐蚀操作

import cv2 import numpy as np img = cv2.imread('DataPreprocessing/img/dige.png') cv2.imshow("img", img) cv2.waitKey(0) cv2.destroyAllWindows()

dige.png原图1展示(注: 没有原图的可以截图下来保存本地。

腐蚀1轮次之后~ (iterations = 1)

kernel = np.ones((3, 3), np.uint8) erosion = cv2.erode(img, kernel, iterations=1) cv2.imshow('erosion', erosion) cv2.waitKey(0) cv2.destroyAllWindows()

腐蚀结果展示图2:

腐蚀圆多次的效果,以及腐蚀原理

pie = cv2.imread('DataPreprocessing/img/pie.png') cv2.imshow('pie', pie) cv2.waitKey(0) cv2.destroyAllWindows()

pie.png原图3:

腐蚀原理, 其中滤波器的大小越大腐蚀的程度越大 图4:

kernel = np.ones((30, 30), np.uint8) erosion_1 = cv2.erode(pie, kernel, iterations=1) erosion_2 = cv2.erode(pie, kernel, iterations=2) erosion_3 = cv2.erode(pie, kernel, iterations=3) res = np.hstack((erosion_1, erosion_2, erosion_3)) cv2.imshow('res', res) cv2.waitKey(0) cv2.destroyAllWindows()

圆腐蚀三次结果展示图5:

1.2 膨胀操作

kernel = np.ones((3, 3), np.uint8) dige_dilate = erosion dige_dilate = cv2.dilate(erosion, kernel, iterations=1) cv2.imshow('dilate', dige_dilate) cv2.waitKey(0) cv2.destroyAllWindows()

膨胀之前图2,发现线条变粗,跟原图对比的线条相差无几,但是没了那些长须装的噪音,图6:

膨胀圆多次的效果,以及膨胀原理与腐蚀相反,有白色点的滤波器则滤波器内数据全变为白色。

pie = cv2.imread('DataPreprocessing/img/pie.png') kernel = np.ones((30, 30), np.uint8) dilate_1 = cv2.dilate(pie, kernel, iterations=1) dilate_2 = cv2.dilate(pie, kernel, iterations=2) dilate_3 = cv2.dilate(pie, kernel, iterations=3) res = np.hstack((dilate_1, dilate_2, dilate_3)) cv2.imshow('res', res) cv2.waitKey(0) cv2.destroyAllWindows()

膨胀圆3次的结果展示,图7:

二、 开运算与闭运算2.1 开运算

# 开:先腐蚀,再膨胀 img = cv2.imread('DataPreprocessing/img/dige.png') kernel = np.ones((5, 5), np.uint8) opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel) cv2.imshow('opening', opening) cv2.waitKey(0) cv2.destroyAllWindows()

将原图1,先腐蚀,再膨胀,得到开运算结果图8:

如何使用Python OpenCV进行形态学操作?

2.2 闭运算

# 闭:先膨胀,再腐蚀 img = cv2.imread('DataPreprocessing/img/dige.png') kernel = np.ones((5, 5), np.uint8) closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel) cv2.imshow('closing', closing) cv2.waitKey(0) cv2.destroyAllWindows()

将原图1,先膨胀,再腐蚀,得到开运算结果图9:

三、梯度运算

拿原图3的圆,做5次膨胀,5次腐蚀,相减得到其轮廓。

# 梯度=膨胀-腐蚀 pie = cv2.imread('DataPreprocessing/img/pie.png') kernel = np.ones((7, 7), np.uint8) dilate = cv2.dilate(pie, kernel, iterations=5) erosion = cv2.erode(pie, kernel, iterations=5) res = np.hstack((dilate, erosion)) cv2.imshow('res', res) cv2.waitKey(0) cv2.destroyAllWindows() gradient = cv2.morphologyEx(pie, cv2.MORPH_GRADIENT, kernel) cv2.imshow('gradient', gradient) cv2.waitKey(0) cv2.destroyAllWindows()

得到梯度运算结果图10:

四、礼帽与黑帽4.1 礼帽

礼帽 = 原始输入-开运算结果

# 礼帽 img = cv2.imread('DataPreprocessing/img/dige.png') tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel) cv2.imshow('tophat', tophat) cv2.waitKey(0) cv2.destroyAllWindows()

得到礼帽结果图11:

4.2 黑帽

黑帽 = 闭运算-原始输入

# 黑帽 img = cv2.imread('DataPreprocessing/img/dige.png') blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel) cv2.imshow('blackhat ', blackhat) cv2.waitKey(0) cv2.destroyAllWindows()

得到礼帽结果图12:

本文共计920个文字,预计阅读时间需要4分钟。

如何使用Python OpenCV进行形态学操作?

一、图像处理与展示

1.1 导入库

pythonimport cv2import numpy as np

1.2 读取图像

pythonimg=cv2.imread('DataPreprocessing/img/dige.png')

1.3 展示图像

pythoncv2.imshow('img', img)cv2.waitKey(0)cv2.destroyAllWindows()

一、 腐蚀与膨胀1.1 腐蚀操作

import cv2 import numpy as np img = cv2.imread('DataPreprocessing/img/dige.png') cv2.imshow("img", img) cv2.waitKey(0) cv2.destroyAllWindows()

dige.png原图1展示(注: 没有原图的可以截图下来保存本地。

腐蚀1轮次之后~ (iterations = 1)

kernel = np.ones((3, 3), np.uint8) erosion = cv2.erode(img, kernel, iterations=1) cv2.imshow('erosion', erosion) cv2.waitKey(0) cv2.destroyAllWindows()

腐蚀结果展示图2:

腐蚀圆多次的效果,以及腐蚀原理

pie = cv2.imread('DataPreprocessing/img/pie.png') cv2.imshow('pie', pie) cv2.waitKey(0) cv2.destroyAllWindows()

pie.png原图3:

腐蚀原理, 其中滤波器的大小越大腐蚀的程度越大 图4:

kernel = np.ones((30, 30), np.uint8) erosion_1 = cv2.erode(pie, kernel, iterations=1) erosion_2 = cv2.erode(pie, kernel, iterations=2) erosion_3 = cv2.erode(pie, kernel, iterations=3) res = np.hstack((erosion_1, erosion_2, erosion_3)) cv2.imshow('res', res) cv2.waitKey(0) cv2.destroyAllWindows()

圆腐蚀三次结果展示图5:

1.2 膨胀操作

kernel = np.ones((3, 3), np.uint8) dige_dilate = erosion dige_dilate = cv2.dilate(erosion, kernel, iterations=1) cv2.imshow('dilate', dige_dilate) cv2.waitKey(0) cv2.destroyAllWindows()

膨胀之前图2,发现线条变粗,跟原图对比的线条相差无几,但是没了那些长须装的噪音,图6:

膨胀圆多次的效果,以及膨胀原理与腐蚀相反,有白色点的滤波器则滤波器内数据全变为白色。

pie = cv2.imread('DataPreprocessing/img/pie.png') kernel = np.ones((30, 30), np.uint8) dilate_1 = cv2.dilate(pie, kernel, iterations=1) dilate_2 = cv2.dilate(pie, kernel, iterations=2) dilate_3 = cv2.dilate(pie, kernel, iterations=3) res = np.hstack((dilate_1, dilate_2, dilate_3)) cv2.imshow('res', res) cv2.waitKey(0) cv2.destroyAllWindows()

膨胀圆3次的结果展示,图7:

二、 开运算与闭运算2.1 开运算

# 开:先腐蚀,再膨胀 img = cv2.imread('DataPreprocessing/img/dige.png') kernel = np.ones((5, 5), np.uint8) opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel) cv2.imshow('opening', opening) cv2.waitKey(0) cv2.destroyAllWindows()

将原图1,先腐蚀,再膨胀,得到开运算结果图8:

如何使用Python OpenCV进行形态学操作?

2.2 闭运算

# 闭:先膨胀,再腐蚀 img = cv2.imread('DataPreprocessing/img/dige.png') kernel = np.ones((5, 5), np.uint8) closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel) cv2.imshow('closing', closing) cv2.waitKey(0) cv2.destroyAllWindows()

将原图1,先膨胀,再腐蚀,得到开运算结果图9:

三、梯度运算

拿原图3的圆,做5次膨胀,5次腐蚀,相减得到其轮廓。

# 梯度=膨胀-腐蚀 pie = cv2.imread('DataPreprocessing/img/pie.png') kernel = np.ones((7, 7), np.uint8) dilate = cv2.dilate(pie, kernel, iterations=5) erosion = cv2.erode(pie, kernel, iterations=5) res = np.hstack((dilate, erosion)) cv2.imshow('res', res) cv2.waitKey(0) cv2.destroyAllWindows() gradient = cv2.morphologyEx(pie, cv2.MORPH_GRADIENT, kernel) cv2.imshow('gradient', gradient) cv2.waitKey(0) cv2.destroyAllWindows()

得到梯度运算结果图10:

四、礼帽与黑帽4.1 礼帽

礼帽 = 原始输入-开运算结果

# 礼帽 img = cv2.imread('DataPreprocessing/img/dige.png') tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel) cv2.imshow('tophat', tophat) cv2.waitKey(0) cv2.destroyAllWindows()

得到礼帽结果图11:

4.2 黑帽

黑帽 = 闭运算-原始输入

# 黑帽 img = cv2.imread('DataPreprocessing/img/dige.png') blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel) cv2.imshow('blackhat ', blackhat) cv2.waitKey(0) cv2.destroyAllWindows()

得到礼帽结果图12: