美文网首页
opencv+python -- 膨胀与腐蚀

opencv+python -- 膨胀与腐蚀

作者: 小兵12138 | 来源:发表于2019-04-17 16:49 被阅读0次

    图像形态学
    -是图像处理学科的一个单独分支学科
    -灰度与二值图像处理中重要手段
    -是由数学的集合论等相关理论发展起来的

    膨胀的作用
    -对象大小增加一个像素(3*3)
    -平滑对象边缘
    -减少或者填充对象之间的距离

    过程:

    1. 用结构元素B,扫描图像A的每一个像素
    2. 用结构元素与其覆盖的二值图像做 “与” 操作
    3. 如果都为0,结果图像的该像素为0;否则为1

    腐蚀的作用
    -对象大小减少一个像素(3*3)
    -平滑对象边缘
    -弱化或者分割图像之间的半岛型连接
    过程:

    1. 用结构元素B,扫描图像A的每一个像素
    2. 用结构元素与其覆盖的二值图像做 “与”操作
    3. 如果都为1,结果图像的该像素为1. 否则为0

    腐蚀处理的结果是使原来的二值图像减小一圈

    Code

    import cv2 as cv
    
    
    def erode_demo(image):
        print(image.shape)
        gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
        ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
        cv.imshow("binary image", binary)
        kernel = cv.getStructuringElement(cv.MORPH_RECT, (5, 5))
        dst = cv.erode(binary, kernel)
        cv.imshow("erode image", dst)
    
    
    def dilate_demo(image):
        print(image.shape)
        gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
        ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
        cv.imshow("binary image", binary)
        kernel = cv.getStructuringElement(cv.MORPH_RECT, (5, 5))
        dst = cv.dilate(binary, kernel)
        cv.imshow("dilate image", dst)
    
    
    def color_erode_dilate_demo(image):
        temp = image.copy() 
        kernel = cv.getStructuringElement(cv.MORPH_RECT, (10, 10))
        erode_dst = cv.erode(temp, kernel)
        cv.imshow("erode color image", erode_dst)
    
        dilate_dst = cv.dilate(image, kernel)
        cv.imshow("dilate color image", dilate_dst)
    
    
    src = cv.imread("./data/lena.jpg", cv.IMREAD_COLOR)
    # src = cv.imread("./data/LinuxLogo.jpg", cv.IMREAD_COLOR)
    cv.namedWindow("lena", cv.WINDOW_AUTOSIZE)
    cv.imshow("lena", src)
    # erode_demo(src)
    # dilate_demo(src)
    color_erode_dilate_demo(src)
    cv.waitKey(0)
    cv.destroyAllWindows()
    
    

    API

    getStructuringElement((shape, esize, anchor);
    shape参数有
    cv2.MORPH_RECT # 矩形结构
    cv2.MORPH_ELLIPSE # 椭圆结构
    cv2.MORPH_CROSS # 十字形结构

    结构元素.png

    esize参数表示结构参数大小

    使用NumPy 的 ndarray 来定义结构元素
    kernel = np.ones((5, 5), np.uint8)
    getStructuringElement 与 Numpy 定义的元素结构是完全一样的

    C/C++

    void erode( const Mat& src, Mat& dst, const Mat& element,Point anchor=Point(-1,-1), int iterations=1,int borderType=BORDER_CONSTANT,
    const Scalar& borderValue=morphologyDefaultBorderValue() );

    void dilate( const Mat& src, Mat& dst, const Mat& element,Point anchor=Point(-1,-1), int iterations=1,int borderType=BORDER_CONSTANT,
    const Scalar& borderValue=morphologyDefaultBorderValue() );
    参数:

    src:原图像。

    dst:目标图像。

    element:腐蚀操作的内核。 如果不指定,默认为一个简单的 3*3矩阵。否则,我们就要明确指定它的形状,可以使用函数getStructuringElement().

    anchor:默认为Point(-1,-1),内核中心点。省略时为默认值。

    iterations:腐蚀次数。省略时为默认值1。

    borderType:推断边缘类型,具体参见borderInterpolate函数。默认为BORDER_DEFAULT,省略时为默认值。

    borderValue:边缘值,具体可参见createMorphoogyFilter函数。可省略。

    相关文章

      网友评论

          本文标题:opencv+python -- 膨胀与腐蚀

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