传统图像处理 --二值形态学

https://blog.csdn.net/u014453898/article/details/105525651

一、原理

无论是膨胀还是腐蚀,都是对白色区域(明亮区域)而言的。膨胀或者腐蚀操作都会有一个核,核的形状可以是圆形或者正方形,核在输入图像上滑动。膨胀是用核与二值图像元素做“与”运算,如果都为0,那么目标像素点为0,否则为1,这样的将会扩大1的区域,达到膨胀白色区域(明亮区域)的目的。腐蚀操作则相反,如果核与其覆盖区域都为1,那么目标像素点为1,否则为0,这样达到的效果是白色区域(明亮区域)会被削减,即腐蚀。

 

二、对灰度图或者二值图

对于灰度图和二值图:

膨胀:

膨胀可以扩大细节性特征,如:

左图是原图,我们可以看到周边其实是有一小圈红色圈的,经过膨胀操作后,即右图,红色圈更明显了。而且也符合膨胀原理,右图更加强调了明亮区域。

而且膨胀还有去除噪声的作用,如下图:

左边是原图,经过膨胀操作后,很多小点都没了,当然比较大的点还是有的,(下面会有更好的解决方法)。但是也可以通过修改迭代次数来解决这个问题,迭代次数就是核在在图片上遍历的次数,若迭代次数为1,那核就会从左到右,上到下划完整张图片一次,若迭代次数是 2,则会滑2次。一般默认的迭代次数是1。那我们看看把迭代次数修改成2后的效果:

黑洞是没了,但是可以看到,整个 j 也大了不少,因为膨胀了两次嘛。

 

腐蚀:

腐蚀可以去掉细节性特征:

如下图:

我们可以看到,一些毛刺没了,但是 j 也变得更小了,当然腐蚀也是可以增加迭代次数的。

我们看到下图,通过一次迭代后,一些细线没了。

然后我们试试把迭代次数改成8.

我们可以看到,连比较粗的线条都没有了。

 

三,对RGB图:

膨胀:

对于RGB图而言,膨胀会更多地保留明暗区域。(迭代次数为1)

迭代次数为5:

 

腐蚀:

对于RGB图而言,腐蚀则是更多地保留暗区域:(迭代次数为1)

迭代次数为5:

 

四,膨胀和腐蚀代码:

膨胀代码:

    import cv2
    import numpy as np
    src = cv2.imread(r'C:\Users\Administrator\Desktop\pic\car.jpg')
    kernel = np.ones((5,5),np.uint8)  #设置核的尺寸为 5x5
    dialate = cv2.dilate(src,kernel,iterations=5)
    cv2.imshow("src",src)
    cv2.imshow("result",dialate)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

腐蚀代码:

    import cv2
    import numpy as np
    src = cv2.imread(r'C:\Users\Administrator\Desktop\pic\car.jpg')
    kernel = np.ones((5,5),np.uint8)  #设置核的尺寸为 5x5
    erosion = cv2.erode(src,kernel,iterations=1)
    #print(erosion)
    cv2.imshow("src",src)
    cv2.imshow("result",erosion)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

 

五,开运算和闭运算

1)开运算:先对图像腐蚀后膨胀。

作用:消除主体外的瑕疵部分,但不改变主体物体大小,不像腐蚀,虽然腐蚀可以消除瑕疵部分,但是主体部分也会变小。

但是开运算不适宜消除主体内的瑕疵:

可以看到,对主体内的瑕疵,开运算的效果并不行。

对于RGB图片,开运算的先腐蚀再膨胀,会使明亮部分丢失,所以图片会比较凸显颜色较暗的特征:

代码:

    import cv2
    import numpy as np
    src = cv2.imread(r'C:\Users\Administrator\Desktop\pic\holej.jpg')
    kernel = np.ones((5,5),np.uint8)  #设置核的尺寸为 5x5
    res = cv2.erode(src,kernel,iterations=1)  #腐蚀
    res = cv2.dilate(res,kernel,iterations=1)  #膨胀
    cv2.imshow("src",src)
    cv2.imshow("result",res)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

2)闭运算:先对图像膨胀后腐蚀

作用:用来填充物体内的小空洞,连接邻近的物体,连接断开的轮廓线,平滑其边界的同时不改变面积。

但是可以见到还是有瑕疵,我们接着把,腐蚀和膨胀的迭代次数提高到2:

可以看到瑕疵空洞已经没了。

对于RGB图片,闭运算的先膨胀再腐蚀,会使明亮部分增强,所以图片会比较凸显颜色较亮的特征:

代码:

    import cv2
    import numpy as np
    src = cv2.imread(r'C:\Users\Administrator\Desktop\pic\car.jpg')
    #src = cv2.resize(src,(512,512))
    kernel = np.ones((5,5),np.uint8)  #设置核的尺寸为 5x5
    res=src
    res = cv2.dilate(res,kernel,iterations=1)
    res = cv2.erode(res,kernel,iterations=1)
     
    cv2.imshow("src",src)
    cv2.imshow("result",res)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

 

六、黑帽和顶帽

1)黑帽:

黑帽图像 = 闭运算图像 - 原图像

作用:得到前景中的瑕疵(小孔)

对于RGB图片:

代码:

    import cv2
    import numpy as np
    def black_hat_demo(image):
        '黑帽'
        gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
        kernel = np.ones((5, 5), np.uint8)
     
        open = cv2.erode(cv2.dilate(gray,kernel,iterations=2),kernel,iterations=2)
        cv2.imshow("close",open)
     
        #黑帽处理
        dst=cv2.morphologyEx(gray,cv2.MORPH_BLACKHAT,kernel,iterations=2)
        cv2.imshow('black_hat',dst)
     
    src = cv2.imread(r'C:\Users\Administrator\Desktop\pic\holej.jpg')
    cv2.imshow("src", src)
    black_hat_demo(src)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

2)顶帽

顶帽图像 = 原始图像 - 开运算图像

作用:得到前境外的瑕疵

对于RGB图片:

代码:

    import cv2
    import numpy as np
     
    def top_hat_demo(image):
        '顶帽'
        gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
        kernel = np.ones((5, 5), np.uint8)
        open = cv2.dilate(cv2.erode(gray, kernel, iterations=2), kernel, iterations=2)
        cv2.imshow("open", open)
     
        dst = cv2.morphologyEx(gray, cv2.MORPH_TOPHAT, kernel, iterations=2)
        cv2.imshow('top_hat', dst)
     
     
    src = cv2.imread(r'C:\Users\Administrator\Desktop\pic\car.jpg')
    src = cv2.resize(src,(512,512))
    cv2.imshow("src", src)
    top_hat_demo(src)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
https://blog.csdn.net/u014453898/article/details/105525651

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章