opencv|形态学处理及opencv-python函数

通过阈值分割可以得到二值图,但往往会出现图像中物体形态不完整,变的残缺,或者有很多噪声点。可以通过形态学处理,使其变得丰满,或者去除掉多余的像素。常用的形态学处理算法包括:腐蚀,膨胀,开运算,闭运算,形态学梯度,顶帽运算和底帽运算。
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. 闭运算
  • 作用:主要用来连接被误分为许多小块的前景对象,能够填平小孔,弥合小裂缝,而总的位置和形状不变。
  • 原理:先膨胀,后腐蚀
5. 形态学梯度
  • 原理:膨胀运算结果 减去 腐蚀运算结果
  • 作用:获取轮廓信息
6. 顶帽运算
  • 原理:原图像 减去 开运算
7. 底帽运算
  • 原理:原图 减去 闭运算
【opencv|形态学处理及opencv-python函数】

    推荐阅读