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

    技术2022-07-29  72

    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

    Processed: 0.009, SQL: 9