美文网首页
opencv+python -- 开闭操作、顶帽、黑帽、形态学

opencv+python -- 开闭操作、顶帽、黑帽、形态学

作者: 小兵12138 | 来源:发表于2019-04-18 08:20 被阅读0次

    开操作 (Open) 闭操作(Close)

    • 图像形态学的重要操作之一,基于膨胀与腐蚀操作组合形成的
    • 主要是应用在二值图像分析中,灰度图像亦可
    • 开操作 = 腐蚀 + 膨胀,输入图像 + 结构元素
    • 闭操作 = 膨胀 + 腐蚀,输入图像 + 结构元素

    开闭操作作用

    • 去除小的干扰块 - 开操作
    • 填充闭合区域 - 闭操作
    • 水平或者垂直线提取

    顶帽 - tophat 黑帽 - blackhat

    • 顶帽原图像与开操作之间得差值图像
    • 黑帽闭操作与原图像得差值图像

    形态学梯度 - gradient

    • 基本梯度
      基本梯度是用膨胀后的图像减去腐蚀后的图像得到差值图像,称为梯度图像也是opencv中支持的计算形态学梯度的方法,而此方法得到梯度又被称为基本梯度
    • 内部梯度
      是用原图像减去腐蚀之后的图像得到差值图像,称为图像的内部梯度
    • 外部梯度
      图像膨胀之后再减去原来的图像得到的差值图像,称为图像的外部梯度

    开闭操作

    import cv2 as cv
    
    
    def open_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)
        # (15, 1)提取水平线, (1, 15)提取垂直线
        kernel = cv.getStructuringElement(cv.MORPH_RECT, (5, 5))
        binary = cv.morphologyEx(binary, cv.MORPH_OPEN, kernel)
        cv.imshow("open-result", binary)
    
    
    def close_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))
        binary = cv.morphologyEx(binary, cv.MORPH_CLOSE, kernel)
        cv.imshow("close-result", binary)
    
    
    src = cv.imread("./data/LinuxLogo.jpg", cv.IMREAD_COLOR)
    # src = cv.imread("./data/tmpl.png", cv.IMREAD_COLOR)
    cv.namedWindow("lena", cv.WINDOW_AUTOSIZE)
    cv.imshow("lena", src)
    # close_demo(src)
    open_demo(src)
    cv.waitKey(0)
    cv.destroyAllWindows()
    
    

    运行结果图

    开操作.png

    开操作去掉了小点

    顶帽、黑帽、形态学梯度

    import cv2 as cv
    import numpy
    
    
    def hat_demo(image):
        gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
        kernel = cv.getStructuringElement(cv.MORPH_RECT, (15, 15))
        top_dst = cv.morphologyEx(gray, cv.MORPH_TOPHAT, kernel)
        black_dst = cv.morphologyEx(gray, cv.MORPH_BLACKHAT, kernel)
        cimage = numpy.array(gray.shape, numpy.uint8)
        cimage = 100
        top_dst = cv.add(top_dst, cimage)
        black_dst = cv.add(black_dst, cimage)
        cv.imshow("top_hat", top_dst)
        cv.imshow("black_hat", black_dst)
    
    
    def hat_gray_demo(image):
        gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
        ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
        kernel = cv.getStructuringElement(cv.MORPH_RECT, (15, 15))
        top_dst = cv.morphologyEx(binary, cv.MORPH_TOPHAT, kernel)
        black_dst = cv.morphologyEx(binary, cv.MORPH_BLACKHAT, kernel)
        cv.imshow("binary_top_hat", top_dst)
        cv.imshow("binary_black_hat", black_dst)
    
    
    def gradient_demo(image):
        gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
        ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
        kernel = cv.getStructuringElement(cv.MORPH_RECT, (3, 3))
        basic_dst = cv.morphologyEx(binary, cv.MORPH_GRADIENT, kernel)
        cv.imshow("gradient", basic_dst)
    
        dm = cv.dilate(image, kernel)
        em = cv.erode(image, kernel)
    
        internal_dst = cv.subtract(image, em)  # internal gradient
        external_dst = cv.subtract(dm, image)  # external gradient
    
        cv.imshow("internal_gradient", internal_dst)
        cv.imshow("external_gradient", external_dst)
    
    
    src = cv.imread("./data/bin.png", cv.IMREAD_COLOR)
    cv.namedWindow("lena", cv.WINDOW_AUTOSIZE)
    cv.imshow("lena", src)
    # hat_demo(src)
    # hat_gray_demo(src)
    gradient_demo(src)
    cv.waitKey(0)
    cv.destroyAllWindows()
    
    

    运行结果图

    顶帽黑帽.png 梯度运算.png

    API PS:C / C++操作

    morphologyEx()
    void morphologyEx(InputArray src, OutputArray dst, int op, InputArray kernel, Point anchor=Point(-1,-1), intiterations=1, int borderType=BORDER_CONSTANT, const Scalar& borderValue=morphologyDefaultBorderValue() )

    第一个参数,输入图像
    第二个参数,输出图像
    第三个参数,使用的形态学方法即:
    MORPH_OPEN – 开运算(Opening operation)
    开运算是对图像先腐蚀再膨胀,可以排除小团的物体转换公式为:


    image.png

    MORPH_CLOSE – 闭运算(Closing operation)
    闭运算是对图像先膨胀再腐蚀,可以排除小型黑洞,变换的公式:


    image.png

    MORPH_GRADIENT -形态学梯度(Morphological gradient)
    返回图片为膨胀图与腐蚀图之差,可以保留物体的边缘轮廓,变换公式为:


    image.png

    MORPH_TOPHAT - “顶帽”(“Top hat”)
    返回图像为原图像与开运算结果图之差,变换公式:


    image.png

    MORPH_BLACKHAT - “黑帽”(“Black hat“)
    返回图片为闭运算结果图与原图像之差,变换公式为:


    image.png

    第四个参数,InputArray类型的kernel,形态学运算的内核。若为NULL时,表示的是使用参考点位于中心3x3的核。如果设置5*5的即:Mat(5, 5, CV_8U)
    第五个参数,Point类型的anchor,锚的位置,其有默认值(-1,-1),表示锚位于中心。
    第六个参数,int类型的iterations,迭代使用函数的次数,默认值为1。
    第七个参数,int类型的borderType,用于推断图像外部像素的某种边界模式。注意它有默认值BORDER_ CONSTANT。
    第八个参数,const Scalar&类型的borderValue,当边界为常数时的边界值,有默认值morphologyDefaultBorderValue(),

    相关文章

      网友评论

          本文标题:opencv+python -- 开闭操作、顶帽、黑帽、形态学

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