美文网首页
解析形态学基本操作:腐蚀、膨胀、开/闭运算

解析形态学基本操作:腐蚀、膨胀、开/闭运算

作者: LiBiscuit | 来源:发表于2019-03-18 15:55 被阅读0次

    时隔一个月 小李又上线了!拖延症晚期实锤了。
    原本教资考完要更 结果考完心态不是很好 所以拖了…上礼拜要更 结果头摔破了 所以又拖到了这周…三月是没有断更了,但过得太艰难了,希望接下来都顺利!
    今天就记录一下在图像处理中形态学的几个操作。

    图像的膨胀(Dilation)和腐蚀(Erosion)是两种基本的形态学运算,主要用来寻找图像中的极大区域和极小区域。
    膨胀类似“领域扩张”,将图像的高亮区域或白色部分扩张,运行结果图比原图的高亮区域更大;
    腐蚀类似“领域被蚕食”,将图像的高亮区域或白色部分缩减细化,运行结果图比原图的高亮区域更小。

    1.图像膨胀

    公式:


    膨胀原理:求局部最大值
    ①定义一个卷积核B,
    核可以是任何的形状和大小,且拥有一个单独定义出来的参考点-锚点(anchorpoint);
    通常和为带参考点的正方形或者圆盘,可将核称为模板或掩膜;
    ②将核B与图像A进行卷积,计算核B覆盖区域的像素点最大值;
    ③将这个最大值赋值给参考点指定的像素;

    因此,图像中的高亮区域逐渐增长。也可理解为把图像变胖
    二值化图,只有0和255,所以小区域内有一个是局部最大像素点就为255:

    2.图像腐蚀

    公式:


    腐蚀:局部最小值(与膨胀相反);
    ①定义一个卷积核B,
    核可以是任何的形状和大小,且拥有一个单独定义出来的参考点-锚点(anchorpoint);
    通常和为带参考点的正方形或者圆盘,可将核称为模板或掩膜;
    ②将核B与图像A进行卷积,计算核B覆盖区域的像素点最小值;
    ③将这个最小值赋值给参考点指定的像素;
    因此,图像中的高亮区域逐渐减小。也可理解为图像变瘦
    二值化图,只有0和255,所以小区域内有一个是0该像素点就为0:

    对比效果(膨胀VS腐蚀)

    3.图像开/闭运算

    开运算和闭运算就是将腐蚀和膨胀按照一定的次序进行处理。但这两者并不是可逆的,即先开后闭并不能得到原先的图像。

    开运算:先腐蚀后膨胀
    作用:分离物体,消除小区域,常用于去除噪声
    闭运算:先膨胀后腐蚀
    作用:常用于填充前景物体中的小洞,或者前景物体上的小黑点.

    代码

    """
    腐蚀
    cv2.erode(src,                     # 输入图像
          kernel,                  # 卷积核
          dst=None, 
          anchor=None,
          iterations=None,         # 迭代次数,默认1
          borderType=None,
          borderValue=None) 
    
    膨胀
    cv2.dilate(src,                    # 输入图像
               kernel,                 # 卷积核
               dst=None, 
               anchor=None, 
               iterations=None,        # 迭代次数,默认1
               borderType=None, 
               borderValue=None)
    """
    
    import cv2
    import numpy as np
    original_img = cv2.imread('F:/image/8.jpg')
    res = cv2.resize(original_img,None,fx=0.6, fy=0.6,
                     interpolation = cv2.INTER_CUBIC) #图形太大了缩小一点
    B, G, R = cv2.split(res)                    #获取红色通道
    img = R
    _,RedThresh = cv2.threshold(img,160,255,cv2.THRESH_BINARY)
    #OpenCV定义的结构矩形元素
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(3, 3))
    eroded = cv2.erode(RedThresh,kernel)        #腐蚀图像
    dilated = cv2.dilate(RedThresh,kernel)      #膨胀图像
    cv2.imshow("original_img", res)             #原图像
    cv2.imshow("Eroded Image",eroded)           #显示腐蚀后的图像
    cv2.imshow("Dilated Image",dilated)         #显示膨胀后的图像
    
    #NumPy定义的结构元素
    NpKernel = np.uint8(np.ones((3,3)))
    Nperoded = cv2.erode(RedThresh,NpKernel)       #腐蚀图像
    cv2.imshow("Eroded by NumPy kernel",Nperoded)  #显示腐蚀后的图像
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    original_img = cv2.imread('F:/image/8.jpg',0)
    gray_res = cv2.resize(original_img,None,fx=0.8,fy=0.8,
                     interpolation = cv2.INTER_CUBIC)                #图形太大了缩小一点
    # B, G, img = cv2.split(res)
    # _,RedThresh = cv2.threshold(img,160,255,cv2.THRESH_BINARY)     #设定红色通道阈值160(阈值影响开闭运算效果)
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(3,3))         #定义矩形结构元素
    
    closed1 = cv2.morphologyEx(gray_res, cv2.MORPH_CLOSE, kernel,iterations=1)    #闭运算1
    closed2 = cv2.morphologyEx(gray_res, cv2.MORPH_CLOSE, kernel,iterations=3)    #闭运算2
    opened1 = cv2.morphologyEx(gray_res, cv2.MORPH_OPEN, kernel,iterations=1)     #开运算1
    opened2 = cv2.morphologyEx(gray_res, cv2.MORPH_OPEN, kernel,iterations=3)     #开运算2
    gradient = cv2.morphologyEx(gray_res, cv2.MORPH_GRADIENT, kernel)             #梯度
    
    #显示如下腐蚀后的图像
    cv2.imshow("Close1",closed1)
    cv2.imshow("Close2",closed2)
    cv2.imshow("Open1", opened1)
    cv2.imshow("Open2", opened2)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    

    END 三月顺利鸭~
    参考(https://www.jianshu.com/p/05ef50ac89ac
    https://blog.csdn.net/wsp_1138886114/article/details/82917661
    https://www.aiuai.cn/aifarm350.html

    相关文章

      网友评论

          本文标题:解析形态学基本操作:腐蚀、膨胀、开/闭运算

          本文链接:https://www.haomeiwen.com/subject/ndivmqtx.html