• OpenCV---膨胀与腐蚀


    膨胀

     腐蚀

    一:膨胀实现dilate

    import cv2 as cv
    import numpy as np
    
    def dilate_demo(image):  #膨胀
        print(image.shape)
        gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)
        ret,binary = cv.threshold(gray,0,255,cv.THRESH_BINARY_INV|cv.THRESH_OTSU)
        cv.imshow("binary",binary)
        kernel = cv.getStructuringElement(cv.MORPH_RECT,(5,5))
        dst = cv.dilate(binary,kernel)
        cv.imshow("dilate_demo",dst)
    
    src = cv.imread("./5.png")  #读取图片
    cv.namedWindow("input image",cv.WINDOW_AUTOSIZE)    #创建GUI窗口,形式为自适应
    cv.imshow("input image",src)    #通过名字将图像和窗口联系
    
    dilate_demo(src)
    
    cv.waitKey(0)   #等待用户操作,里面等待参数是毫秒,我们填写0,代表是永远,等待用户操作
    cv.destroyAllWindows()  #销毁所有窗口 

     

    二:实现腐蚀erode

    def erode_demo(image):  #腐蚀
        print(image.shape)
        gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)
        ret,binary = cv.threshold(gray,0,255,cv.THRESH_BINARY_INV|cv.THRESH_OTSU)
        cv.imshow("binary",binary)
        kernel = cv.getStructuringElement(cv.MORPH_RECT,(3,3))  #可以修改卷积核大小来增加腐蚀效果,越大腐蚀越强
        dst = cv.erode(binary,kernel)
        cv.imshow("erode_demo",dst)
    
    src = cv.imread("./5.png")  #读取图片
    cv.namedWindow("input image",cv.WINDOW_AUTOSIZE)    #创建GUI窗口,形式为自适应
    cv.imshow("input image",src)    #通过名字将图像和窗口联系
    
    erode_demo(src)
    
    cv.waitKey(0)   #等待用户操作,里面等待参数是毫秒,我们填写0,代表是永远,等待用户操作
    cv.destroyAllWindows()  #销毁所有窗口

    kernel = cv.getStructuringElement(cv.MORPH_RECT,(5,5))

     相关知识补充

    (一)可以看做膨胀是将白色区域扩大,腐蚀是将黑色区域扩大

    (二)可以不进行灰度处理,对彩色图片进行处理

    (1)膨胀

    kernel = cv.getStructuringElement(cv.MORPH_RECT, (5, 5))
    dst = cv.dilate(src,kernel)
    cv.imshow("result",dst)

    (2)腐蚀

    kernel = cv.getStructuringElement(cv.MORPH_RECT, (5, 5))
    dst = cv.erode(src,kernel)
    cv.imshow("result",dst)

    (三)getStructuringElement方法

     推文:OpenCV中获取不同形状的结构元素getStructuringElement

    自定义一个结构元素kernel,要声明一个Mat,然后对Mat的元素赋值;这种方法灵活但略显复杂
    OpenCV提供了一个函数getStructuringElement,可以获取常用的结构元素的形状:矩形(包括线形)、椭圆(包括圆形)及十字形。
    getStructuringElement的内部并没有什么优化实现,只是封装了一下功能。其原理同样是声明一个Mat,然后求形状,指定Mat的值。
    十字形为单线宽。
    总之:getStructuringElement是一种更加简便的方法实现一个kernel
    MORPH_RECT, MORPH_ELLIPSE, MORPH_CROSS

    参数:

    cv.getStructuringElement(cv.MORPH_RECT, (3, 3))
    def getStructuringElement(shape, ksize, anchor=None): # real signature unknown; restored from __doc__
    第一个参数shape:表示内核的形状,有三种形状可以选择
    矩形:MORPH_RECT;
    交叉形:MORPH_CORSS;
    椭圆形:MORPH_ELLIPSE;
    第二个参数ksize:是内核的尺寸(n,n)
    第三个参数anchor:锚点的位置

    返回值:

    getStructuringElement函数会返回指定形状和尺寸的结构元素。
  • 相关阅读:
    2019年2月8日训练日记(文件操作知识点小结)
    2019年2月7日训练日记
    2019年2月6日训练日记
    2019年2月5日训练日记
    2019年2月4日训练日记(递归学习小结)
    【Java】Java中的IO流
    【Java】Java中线程的使用
    【Java】Java图形化用户界面-GUI
    【Java】Java中的集合类
    C++程序学习之实现手机通讯录功能模拟
  • 原文地址:https://www.cnblogs.com/ssyfj/p/9276999.html
Copyright © 2020-2023  润新知