通过阈值分割可以得到二值图,但往往会出现图像中物体形态不完整,变的残缺,或者有很多噪声点。可以通过形态学处理,使其变得丰满,或者去除掉多余的像素。常用的形态学处理算法包括:腐蚀,膨胀,开运算,闭运算,形态学梯度,顶帽运算和底帽运算。
0. 结构元素 opencv中可用的结构元素有三种:矩阵,椭圆形,十字架
kernel = cv2.getStructuringElement(shape,ksize,anchor)
shape:核的形状
cv2.MORPH_RECT: 矩形
cv2.MORPH_CROSS: 十字形(以矩形的锚点为中心的十字架)
cv2.MORPH_ELLIPSE:椭圆(矩形的内切椭圆)
ksize: 核的大小,格式为(width,height)
anchor: 核的锚点,默认值为(-1,-1),即核的中心点
注:也可以使用numpy.ndarray来自定义自己想要的各种结构元素
1. 腐蚀
- 作用:减小前景(白色)面积
- 原理:取结构元素当前位置中像素值的最小值代替锚点位置的像素值,这样就会使图像中较暗的区域面积增大,较亮的的区域面积减小。如果是一张黑底,白色前景的二值图,就会使白色的前景物体颜色变小,就像被腐蚀了一样。
- 代码
dst = cv2.erode(src,kernel,anchor,iterations,borderType,borderValue):
参数:
src: 输入图像对象矩阵,为二值化图像
kernel:进行腐蚀操作的核,可以通过函数getStructuringElement()获得
anchor:锚点,默认为(-1,-1)
iterations:腐蚀操作的次数,默认为1
borderType: 边界种类,有默认值
borderValue:边界值,有默认值
2. 膨胀
- 作用:增加前景面积
- 原理:取结构元素当前位置中像素值的最大值代替锚点位置的像素值
- 代码
dst = cv2.dilate(src,kernel,anchor,iterations,borderType,borderValue)
参数:
src: 输入图像对象矩阵,为二值化图像
kernel:进行腐蚀操作的核,可以通过函数getStructuringElement()获得
anchor:锚点,默认为(-1,-1)
iterations:腐蚀操作的次数,默认为1
borderType: 边界种类
borderValue:边界值
3. 开运算
- 作用:主要用于去除图像上的噪音斑点,毛刺和小桥,而总的位置和形状不便
- 原理:先腐蚀,后膨胀
- 代码
dst = cv2.morphologyEx(src,op,kernel,anchor,iterations,borderType,borderValue)
参数:
src: 输入图像对象矩阵,为二值化图像
op:形态学操作类型
cv2.MORPH_OPEN开运算
cv2.MORPH_CLOSE闭运算
cv2.MORPH_GRADIENT形态梯度
cv2.MORPH_TOPHAT顶帽运算
cv2.MORPH_BLACKHAT底帽运算kernel: 结构元素
anchor:锚点,默认为(-1,-1)
iterations:腐蚀操作的次数,默认为1
borderType: 边界种类
borderValue:边界值
4. 闭运算
- 作用:主要用来连接被误分为许多小块的前景对象,能够填平小孔,弥合小裂缝,而总的位置和形状不变。
- 原理:先膨胀,后腐蚀
- 原理:膨胀运算结果 减去 腐蚀运算结果
- 作用:获取轮廓信息
- 原理:原图像 减去 开运算
- 原理:原图 减去 闭运算
推荐阅读
- 人脸识别|【人脸识别系列】| 实现自动化妆
- OpenCV|OpenCV-Python实战(18)——深度学习简介与入门示例
- opencv|图像处理之椒盐噪声的添加与去除
- 人脸识别|【人脸识别系列】| 实现人脸截图保存并编写128维特征向量
- opencv|网络爬虫入门练习
- OpenCV|【OpenCV 完整例程】89. 带阻滤波器的传递函数
- OpenCV|【OpenCV 完整例程】90. 频率域陷波滤波器
- OpenCV|【OpenCV 完整例程】22. 图像添加非中文文字
- OpenCV|【OpenCV 完整例程】91. 高斯噪声、瑞利噪声、爱尔兰噪声
- opencv|python+opencv车道线,实线虚线的检测