形态学处理及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. 底帽运算

  • 原理:原图 减去 闭运算

 

猜你喜欢

转载自blog.csdn.net/yzy__zju/article/details/107115820