本文最后更新于 2024-04-22T00:07:53+08:00
腐蚀与膨胀
腐蚀与膨胀是图像形态学的两种核心操作,通过合理的使用,可以实现图像各类操作。
人生的奋斗目标不要太大,认准一件事情,投入兴趣与热情坚持去做,你就会成功。
俞敏洪(新东方教育集团创始人)
1.腐蚀
1
| dst = cv2.erode(src, kernel, anchor, iterations, borderType, borderValue)
|
src: 原始图像
kernel:腐蚀使用的核
anchor:可选参数,核的锚点位置
iterations:可选参数,腐蚀迭代次数,默认为1
borderType:可选参数,边界样式,建议默认
borderValue:可选参数,边界值,建议默认
返回值说明: dst:经过腐蚀之后的图像。
在openCV做腐蚀通常使用Numpy模块来创建核数组
1 2
| import numpy as np k = np.ones((5, 5), np.uint8)
|
行列数越大,计算出的效果越粗糙;
行列数越小,解算出的结果越精细。
示例1
将仙人球图像进行腐蚀操作
原图像
代码:
1 2 3 4 5 6 7 8 9 10
| import cv2 import numpy as np img = cv2.imread("cactus.jpg") k = np.ones((3, 3), np.uint8) cv2.imshow("img", img) dst = cv2.erode(img, k) cv2.imshow("dst", dst) cv2.imwrite("cactus1.jpg",dst) cv2.waitKey() cv2.destroyAllWindows()
|
效果:
2.膨胀
- 膨胀和腐蚀相反,当核在图像的边缘移动时,会将图像边缘填补新的像素。
1
| dst = cv2.dilate(src, kernel, anchor, iterations, borderType, borderValue)
|
src: 原始图像
kernel:腐蚀使用的核
anchor:可选参数,核的锚点位置
iterations:可选参数,腐蚀迭代次数,默认为1
borderType:可选参数,边界样式,建议默认
borderValue:可选参数,边界值,建议默认
返回值说明:
dst:经过腐蚀之后的图像。
实例2
代码:
1 2 3 4 5 6 7 8 9 10
| import cv2 import numpy as np img = cv2.imread("sunset.jpg") k = np.ones((9, 9), np.uint8) cv2.imshow("img", img) dst = cv2.dilate(img, k) cv2.imshow("dst", dst) cv2.imwrite("sunset1.jpg",dst) cv2.waitKey() cv2.destroyAllWindows()
|
效果:
3.开运算
- 开运算就是将图片先进行腐蚀操作,在进行膨胀操作;
- 开运算可以用来抹除图像外部的细节(或者噪声);
- 在某些情况下,可用于统计二叉树节点数量;
实例3:
代码:
1 2 3 4 5 6 7 8 9 10 11
| import cv2 import numpy as np img = cv2.imread("nigella.png") k = np.ones((5, 5), np.uint8) cv2.imshow("img", img) dst = cv2.erode(img, k) dst = cv2.dilate(dst, k) cv2.imshow("dst", dst) cv2.imwrite("nigella1.jpg",dst) cv2.waitKey() cv2.destroyAllWindows()
|
效果:
4.闭运算
- 闭运算就是将图像先进行膨胀操作,再进行腐蚀操作;
- 闭运算可以抹除图像内部的细节;
- 除了抹除细节,还会让一些离得较近的区域合并成一块;
示例4:
代码:
1 2 3 4 5 6 7 8 9 10 11
| import cv2 import numpy as np img = cv2.imread("tianye.png") k = np.ones((15, 15), np.uint8) cv2.imshow("img", img) dst = cv2.dilate(img, k) dst = cv2.erode(dst, k) cv2.imshow("dst2", dst) cv2.imwrite("tianye1.jpg",dst) cv2.waitKey() cv2.destroyAllWindows()
|
效果:
5.形态学方法
1
| dst = cv2.morphologyEx(scr, op, kernel, anchor, iterations, borderType, bordreValue)
|
参数说明:
scr:原始图像
op:操作类型
c2.MORPH_ERODE |
腐蚀操作 |
cv.MORPH_DILATE |
膨胀操作 |
cv2.MORPH_OPEN |
开运算 |
cv2.MORPH_CLOSE |
闭运算 |
cv2.ORPH_GRADIENT |
梯度运算 |
cv.MORPH_TOPHAT |
顶帽运算 |
cv2.MORPH_BLACKHAT |
黑帽运算 |
kernel:操作过程中所使用的核;
anchor:可选参数,核的锚点位置
iterations:可选参数,腐蚀迭代次数,默认为1
borderType:可选参数,边界样式,建议默认
borderValue:可选参数,边界值,建议默认
返回值说明:
dst:经过腐蚀之后的图像。
5.1梯度运算
- 梯度指的是图像梯度,可以简单理解为图像像素的变化程度;
- 如果几个连续的像素,其像素的值跨度越大,则梯度值就越大;
- 膨胀-腐蚀=轮廓图像
- 得到的轮廓图像只是一个大致轮廓,不精准;
示例5:
代码:
1 2 3 4 5 6 7 8 9 10
| import cv2 import numpy as np img = cv2.imread("spider.png") k = np.ones((5,5), np.uint8) cv2.imshow("img", img) dst = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, k) cv2.imshow("dst", dst) cv2.imwrite("spider1.jpg",dst) cv2.waitKey() cv2.destroyAllWindows()
|
效果:
5.2顶帽运算
- 原图-原图开运算=外部信息图
- 开运算=先腐蚀,再膨胀
- 开运算会抹除图像的外部信息
- 所以会得到没有外部细节的图像
实例6:
代码:
1 2 3 4 5 6 7 8 9 10
| import cv2 import numpy as np img = cv2.imread("spider.png") k = np.ones((5, 5), np.uint8) cv2.imshow("img", img) dst = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, k) cv2.imshow("dst", dst) cv2.imwrite("spider2.jpg",dst) cv2.waitKey() cv2.destroyAllWindows()
|
效果:
5.3黑帽运算
- 原图闭运算-原图=内部细节图
- 闭运算=先膨胀,再腐蚀
- 闭运算会抹掉内部细节
- 所以会得到内部信息图
实例7:
代码:
1 2 3 4 5 6 7 8 9 10
| import cv2 import numpy as np img = cv2.imread("spider2.png") k = np.ones((5, 5), np.uint8) cv2.imshow("img", img) dst = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, k) cv2.imshow("dst", dst) cv2.imwrite("spider3.jpg",dst) cv2.waitKey() cv2.destroyAllWindows()
|
效果:
总结
本实验对图片的腐蚀与膨胀进行学习,腐蚀和膨胀是图像形态学的两种核心操作,通过合理的使用,可以实现图像各类操作。
参考书籍:《PythonOpenCV从入门到实践》