计算机视觉-学习笔记-腐蚀与膨胀

腐蚀与膨胀

腐蚀与膨胀是图像形态学的两种核心操作,通过合理的使用,可以实现图像各类操作。

人生的奋斗目标不要太大,认准一件事情,投入兴趣与热情坚持去做,你就会成功。

俞敏洪(新东方教育集团创始人)

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

将仙人球图像进行腐蚀操作

原图像

cactus.jpg

代码

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) # 创建3*3的数组作为核
cv2.imshow("img", img) # 显示原图
dst = cv2.erode(img, k) # 腐蚀操作
cv2.imshow("dst", dst) # 显示腐蚀效果
cv2.imwrite("cactus1.jpg",dst) # 保存图片
cv2.waitKey() # 按下任何键盘按键后
cv2.destroyAllWindows() # 释放所有窗体

效果

cactus1.jpg

2.膨胀

  • 膨胀和腐蚀相反,当核在图像的边缘移动时,会将图像边缘填补新的像素。
1
dst = cv2.dilate(src, kernel, anchor, iterations, borderType, borderValue)

src: 原始图像

kernel:腐蚀使用的核

anchor:可选参数,核的锚点位置

iterations:可选参数,腐蚀迭代次数,默认为1

borderType:可选参数,边界样式,建议默认

borderValue:可选参数,边界值,建议默认

返回值说明:

dst:经过腐蚀之后的图像。

实例2

sunset.jpg

代码

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) # 创建9*9的数组作为核
cv2.imshow("img", img) # 显示原图
dst = cv2.dilate(img, k) # 膨胀操作
cv2.imshow("dst", dst) # 显示膨胀效果
cv2.imwrite("sunset1.jpg",dst) # 保存图片
cv2.waitKey() # 按下任何键盘按键后
cv2.destroyAllWindows() #释放所有窗体

效果

sunset1.jpg

3.开运算

  • 开运算就是将图片先进行腐蚀操作,在进行膨胀操作;
  • 开运算可以用来抹除图像外部的细节(或者噪声);
  • 在某些情况下,可用于统计二叉树节点数量;

实例3

nigella.png

代码

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) # 创建5*5的数组作为核
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() # 释放所有窗体

效果

nigella1.jpg

4.闭运算

  • 闭运算就是将图像先进行膨胀操作,再进行腐蚀操作;
  • 闭运算可以抹除图像内部的细节;
  • 除了抹除细节,还会让一些离得较近的区域合并成一块;

示例4

tianye.png

代码

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) # 创建15*15的数组作为核
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() # 释放所有窗体

效果

tianye1.jpg

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

spider.png

代码

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) # 创建5*5的数组作为核
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() # 释放所有窗体

效果

spider1.jpg

5.2顶帽运算

  • 原图-原图开运算=外部信息图
  • 开运算=先腐蚀,再膨胀
  • 开运算会抹除图像的外部信息
  • 所以会得到没有外部细节的图像

实例6

spider.png

代码

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) # 创建5*5的数组作为核
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() # 释放所有窗体

效果

spider2.jpg

5.3黑帽运算

  • 原图闭运算-原图=内部细节图
  • 闭运算=先膨胀,再腐蚀
  • 闭运算会抹掉内部细节
  • 所以会得到内部信息图

实例7

spider2.png

代码

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) # 创建5*5的数组作为核
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() # 释放所有窗体

效果

spider3.jpg

总结

本实验对图片的腐蚀与膨胀进行学习,腐蚀和膨胀是图像形态学的两种核心操作,通过合理的使用,可以实现图像各类操作。

参考书籍:《PythonOpenCV从入门到实践》


计算机视觉-学习笔记-腐蚀与膨胀
https://yelelalearn.github.io/2024/04/19/计算机视觉-学习笔记-腐蚀与膨胀/
作者
Yelearn
发布于
2024年4月19日
更新于
2024年4月22日
许可协议