zoukankan      html  css  js  c++  java
  • OpenCV-Python学习笔记6:图像形态学转化

    原文为段立辉翻译,感谢Linux公社
    此文档为自学转述,如有侵权请联系本人。

    目标:

    • 学习不同的形态学操作,例如腐蚀,膨胀,开运算,闭运算等

    • 学习的函数有:cv2.erode(),cv2.dilate(),cv2.morphologyEx() 等

    形态学转换原理:一般情况下对二值化图像进行操作。需要两个参数,一个是原始图像,第二个被称为结构化元素或者核,它是用来决定操作的性质的。基本操作为腐蚀和膨胀,他们的变体构成了开运算,闭运算,梯度等。

    1、腐蚀

    把前景物体的边界腐蚀掉,但是前景仍然是白色的。卷积核沿着图像滑动,如果与卷积核对应的原图像的所有像素值都是1,那么中心元素就保持原来的像素值,否则就变为零。根据卷积核的大小靠近前景的所有像素都会被腐蚀掉(变为0),所以前景物体会变小,整幅图像的白色区域会减少。这对于去除白噪音很有用,也可以用来断开两个连在一块的物体。

    erosion = cv2.erode(img, kernel, iterations=1)

    2、膨胀

    与腐蚀相反,与卷积核对应的原图像的像素值中只要有一个是1,中心元素的像素值就是1。所以这个操作会增加图像中白色区域(前景)。一般在去噪音时先腐蚀再膨胀,因为腐蚀再去掉白噪音的同时,也会使前景对象变小,所以我们再膨胀。这时噪音已经被去除,不会再回来了,但是前景还在并会增加,膨胀也可以用来连接两个分开的物体。

    dilation = cv2.dilate(img, kernel, iterations=1)

    3、开运算

    先进行腐蚀再进行膨胀就叫做开运算。被用来去除噪音,函数可以使用cv2.morphotogyEx()

    opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
    

    4、闭运算

    先膨胀再腐蚀。被用来填充前景物体中的小洞,或者前景上的小黑点。

    closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
    

    5、形态学梯度

    其实就是一幅图像膨胀与腐蚀的差别。结果看上去就像前景物体的轮廓。

    gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)
    

    6、礼帽

    原始图像与进行开运算之后得到的图像的差。

    tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
    

    7、黑帽

    进行闭运算之后得到的图像与原始图像的差。

    blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)
    
    import cv2
    import numpy as np
    
    img = cv2.imread('./opencv_learn/image3.png',0)
    
    kernel = np.ones((5,5),np.uint8)
    # 腐蚀
    erosion = cv2.erode(img, kernel, iterations=1)
    # 膨胀
    dilation = cv2.dilate(img, kernel, iterations=1)
    # 开运算,先腐蚀在膨胀
    opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
    # 闭运算,先膨胀在腐蚀
    closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
    # 形态学梯度,腐蚀和膨胀的差别
    gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)
    # 礼貌,开运算后与原图的差
    tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
    # 黑帽, 闭运算后与原图的差
    blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)
    
    
    while(1):
        cv2.imshow('img',img)
        cv2.imshow('erosion',erosion)
        cv2.imshow('dilation', dilation)
        cv2.imshow('opening', opening)
        cv2.imshow('closing',closing)
        cv2.imshow('gradient',gradient)
        cv2.imshow('tophat', tophat)
        cv2.imshow('blackhat', blackhat)
        k = cv2.waitKey(1)
        if k == ord('q'):
            break
    
    cv2.destroyAllWindows()

    结构化元素

    之前的例子都是使用numpy构建了结构化元素,但是是正方形的,若需要构建椭圆或者圆形的核,可以使用OpenCV提供的函数cv2.getStructuringElemenet(),只需要告诉它你需要的核的形状和大小。

  • 相关阅读:
    构建调试Linux内核网络代码的环境MenuOS系统
    stm32内存管理
    STM32CubeMx——ADC多通道采集
    STM32CubeMx——串口使用DMA收发数据
    STM32CubeMx——串口收发
    stm32CubeMx+TrueSTUDIO+uc/os-III移植开发(二)
    stm32CubeMx+TrueSTUDIO+uc/os-III移植开发(一)
    STM32F103RCT6移植到STM32F103C8T6注意事项
    关于STM32F103系列从大容量向中容量移植的若干问题
    KEIL软件中编译时出现的Error L6200E: symbol multiply defined ...的解决方法
  • 原文地址:https://www.cnblogs.com/zheng1076/p/10684381.html
Copyright © 2011-2022 走看看