美文网首页OpenCV
OpenCV-Python教程:14.形态变换

OpenCV-Python教程:14.形态变换

作者: xxxss | 来源:发表于2017-06-15 14:14 被阅读663次

    原理

    形态变换是根据图片的形状进行的简单运算。一般被用在二值图像上。它需要两个输入,一个是我们的原始图片,另一个是被叫做结构元素或者是核,用来决定运算的类型。两个基本的形态运算是腐蚀和Dilation.其他的变形如开,合,梯度等也会有。我们来看看他们在下面这张图上的表现。


    1. 腐蚀

    腐蚀的基本理念就和土壤腐蚀一样,它会腐蚀掉前景的边缘(所以前景应该用白色)。核腐蚀掉图片。原始图片里的一个像素(1或者0)只有在核下的所有像素都是1的时候才被认为是1.否则它就被腐蚀掉了(变成0)

    根据核的大小来决定在边界附近的多少像素会被丢弃掉,所以前景物体的厚度或大小会缩小,或者说白色区域会减小。这个在移除小的白色噪点时很有用。

    在下面的例子里,我用给一个5x5的核,来看看如何工作的:

    import cv2
    import numpy as np

    img = cv2.imread('j.png',0)
    kernel = np.ones((5,5), np.uint8)
    erosion = cv2.erode(img,kernel,iterations=1)

    结果:


    2.膨胀

    这个就是腐蚀的反义词,在核下只要有至少一个像素是1,像素的值就是1.所以它会增加图片上白色区域的范围或者前景物体的大小。一般来说,在去噪过程中,腐蚀后会再膨胀。因为腐蚀去掉了白噪点,但是它也缩小了我们的对象,所以我们再膨胀它,由于噪点已经没了,它不会回来,我们的物体区域会增加。在把分隔对象连起来也很有用。

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


    3. 开

    开就是腐蚀之后再膨胀的另一个名字。我们使用函数cv2.morphologyEx()

    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.顶帽

    这个是输入图片和图片的开运算结果的差别,下面是9x9的核的

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

    结果:


    7.黑帽

    这是输入图片的闭的结果和输入图片的差别。

    blackhat=cv2.morphologyEx(img,cv2.MORPH_BLACKHAT,kernel)

    结果:


    结构元素

    我们通过Numpy人工创建了结构元素。是个矩形,但是有些情况下,你可能会需要椭圆/圆型的核。为了这个目的,OpenCV有一个函数cv2.getStructuringElement()。你把形状和核的大小作为参数传给它,你就可以得到想要的核。

    # Rectangular Kernel
    >>>cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))
    array([[1,1,1,1,1],
              [1,1,1,1,1],
              [1,1,1,1,1],
              [1,1,1,1,1],
              [1,1,1,1,1]],dtype=uint8)

    # Elliptical Kernel
    >>>cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))
    array([[0,0,1,0,0],
              [1,1,1,1,1],
              [1,1,1,1,1],
              [1,1,1,1,1],
              [0,0,1,0,0]],dtype=uint8)

    # Cross-shaped Kernel
    >>>cv2.getStructuringElement(cv2.MORPH_CROSS,(5,5))
    array([[0,0,1,0,0],
              [0,0,1,0,0],
              [1,1,1,1,1],
              [0,0,1,0,0],
              [0,0,1,0,0]],dtype=uint8)

    相关文章

      网友评论

        本文标题:OpenCV-Python教程:14.形态变换

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