• python-opencv 图像处理基础 (十)图像膨胀腐蚀+开闭操作


    膨胀腐蚀

    膨胀

    • 结构元素与原图或操作
      腐蚀
    • 结构元素与原图与操作

    彩图和二值图都可进行膨胀腐蚀

    最好是前景白色,背景白色。
    腐蚀结果:
    在这里插入图片描述
    膨胀结果:
    在这里插入图片描述

    import cv2 as cv
    import numpy as np
    
    #腐蚀
    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.THRESH_BINARY_INV 二值图取反
        cv.imshow("binary", binary)
        kernel = cv.getStructuringElement(cv.MORPH_RECT, (15, 15))#结构元素支持rect矩形 cross十字交叉 ellipse椭圆形  15越大腐蚀越严重
        dst = cv.erode(binary, kernel)
        cv.imshow("erode_demo", 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", binary)
        kernel = cv.getStructuringElement(cv.MORPH_RECT, (5, 5))
        dst = cv.dilate(binary, kernel)
        cv.imshow("dilate_demo", dst)
    
    
    print("--------- Python OpenCV Tutorial ---------")
    src = cv.imread("../opencv-python-img/lena.png")
    cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
    cv.imshow("input image", src)
    
    #对二值图进行膨胀腐蚀
    erode_demo(src)
    #dilate_demo(src)
    
    #对彩图进行腐蚀膨胀
    # kernel = cv.getStructuringElement(cv.MORPH_RECT, (3, 3))
    # dst = cv.erode(src, kernel)
    # cv.imshow("result", dst)
    cv.waitKey(0)
    
    cv.destroyAllWindows()
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41

    开闭操作

    开操作

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

    闭操作

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

    开闭操作作用:

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

    开操作和腐蚀区别(同样是去除噪点):开操作去除噪点的同时,尽量保留其它结构元素不变。

    闭操作和膨胀区别:填充闭合区域,其它结构元素不变。

    kernel为(5,5)的开操作结果:
    在这里插入图片描述
    kernel 为(15,1)的开操作结果:
    在这里插入图片描述
    kernel 为(1,15)的开操作结果:
    在这里插入图片描述

    kernel 为(1,15)的闭操作结果:
    在这里插入图片描述kernel为(15,1)的闭操作:
    在这里插入图片描述

    (3,3)开操作:
    在这里插入图片描述

    import cv2 as cv
    import numpy as np
    
    
    def open_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, (1,15))#(15,1)提取水平线(1,15)提取竖直线 rect矩形 cross十字交叉 ellipse椭圆形
        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", binary)
        kernel = cv.getStructuringElement(cv.MORPH_RECT, (15, 1))
        binary = cv.morphologyEx(binary, cv.MORPH_CLOSE, kernel)
        cv.imshow("close_demo", binary)
    
    
    print("--------- Python OpenCV Tutorial ---------")
    src = cv.imread("../opencv-python-img/morph01.png")
    cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
    cv.imshow("input image", src)
    open_demo(src)
    #close_demo(src)
    cv.waitKey(0)
    
    cv.destroyAllWindows()
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    顶帽黑帽

    顶帽 tophat

    • 顶帽是原图像与开操作之间的差值图像

    黑帽blackhat

    • 黑帽是闭操作图像与源图像的差值图像

    灰度图 顶帽操作结果
    在这里插入图片描述

    灰度图 图像增强后的结果:理论上结果更清晰些
    在这里插入图片描述

    灰度图 黑帽操作结果:
    在这里插入图片描述二值图 顶帽操作:
    在这里插入图片描述
    二值图 黑帽操作

    在这里插入图片描述

    形态学梯度 Gradient

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

    基本梯度:(15,15)
    在这里插入图片描述基本梯度(3,3):
    在这里插入图片描述

    内梯度外梯度结果:
    在这里插入图片描述

    import cv2 as cv
    import numpy as np
    
    #顶帽tophat操作 
    def top_hat_demo(image):
        gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
        kernel = cv.getStructuringElement(cv.MORPH_RECT, (15, 15))
        dst = cv.morphologyEx(gray, cv.MORPH_TOPHAT, kernel) #直接显示dst不清楚
        cimage = np.array(gray.shape, np.uint8)#由于直接显示dst不清楚,进行图像增强。增加常量,大小是gray.shape
        cimage = 120;
        dst = cv.add(dst, cimage)
        cv.imshow("tophat", dst)
    
    #黑帽操作
    def black_hat_demo(image):
        gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
        kernel = cv.getStructuringElement(cv.MORPH_RECT, (15, 15))
        dst = cv.morphologyEx(gray, cv.MORPH_BLACKHAT, kernel)
        cimage = np.array(gray.shape, np.uint8)#由于直接显示dst不清楚,进行图像增强。增加常量,大小是gray.shape
        cimage = 120;
        dst = cv.add(dst, cimage)
        cv.imshow("black_hat", dst)
    
    
    #对二值图进行顶帽、黑帽、基本梯度操作
    def hat_binary_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))
        #dst = cv.morphologyEx(binary, cv.MORPH_TOPHAT, kernel)# (15,15)
        #dst = cv.morphologyEx(binary, cv.MORPH_BLACKHAT, kernel)# (15,15)
        #dst = cv.morphologyEx(binary, cv.MORPH_GRADIENT, kernel)# (3,3)
        cv.imshow("tophat", dst)
    
    
    #内梯度 外梯度操作
    def gradient2_demo(image):
        kernel = cv.getStructuringElement(cv.MORPH_RECT, (3, 3))
        dm = cv.dilate(image, kernel)
        em = cv.erode(image, kernel)
        dst1 = cv.subtract(image, em) # internal gradient 内梯度
        dst2 = cv.subtract(dm, image) # external gradient 外梯度
        cv.imshow("internal", dst1)
        cv.imshow("external", dst2)
    
    
    print("--------- Python OpenCV Tutorial ---------")
    src = cv.imread("../opencv-python-img/morph.png")
    cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
    cv.imshow("input image", src)
    top_hat_demo(src)
    # black_hat_demo(src)
    # hat_binary_demo(src)
    # gradient2_demo(src)
    cv.waitKey(0)
    
    cv.destroyAllWindows()
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
  • 相关阅读:
    p1.第一章 基础入门 -- Python开发环境安装 (一)
    python实现简单的神经网络,python的神经网络编程
    知识付费行业市场不断扩大,朝专业化、垂直化发展
    ELK配置记录
    Android---APK 瘦身
    eclipse项目导入教程
    leetcode - 03 树专题 450~230~572~208~100~剑指Offer 32~剑指Offer 33
    i2c驱动扫描注册
    Java框架 Spring--IOC
    Spring Boot 工程开发常见问题解决方案,日常开发全覆盖
  • 原文地址:https://blog.csdn.net/zml194849/article/details/126580903