天天看点

[传统图像处理]-----图像的膨胀和腐蚀、开运算、闭运算、黑帽、顶帽(python+opencv)

一、原理

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

[传统图像处理]-----图像的膨胀和腐蚀、开运算、闭运算、黑帽、顶帽(python+opencv)
[传统图像处理]-----图像的膨胀和腐蚀、开运算、闭运算、黑帽、顶帽(python+opencv)

二、对灰度图或者二值图

对于灰度图和二值图:

膨胀:

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

[传统图像处理]-----图像的膨胀和腐蚀、开运算、闭运算、黑帽、顶帽(python+opencv)

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

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

[传统图像处理]-----图像的膨胀和腐蚀、开运算、闭运算、黑帽、顶帽(python+opencv)

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

[传统图像处理]-----图像的膨胀和腐蚀、开运算、闭运算、黑帽、顶帽(python+opencv)

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

腐蚀:

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

如下图:

[传统图像处理]-----图像的膨胀和腐蚀、开运算、闭运算、黑帽、顶帽(python+opencv)

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

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

[传统图像处理]-----图像的膨胀和腐蚀、开运算、闭运算、黑帽、顶帽(python+opencv)

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

[传统图像处理]-----图像的膨胀和腐蚀、开运算、闭运算、黑帽、顶帽(python+opencv)

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

三,对RGB图:

膨胀:

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

[传统图像处理]-----图像的膨胀和腐蚀、开运算、闭运算、黑帽、顶帽(python+opencv)

迭代次数为5:

[传统图像处理]-----图像的膨胀和腐蚀、开运算、闭运算、黑帽、顶帽(python+opencv)

腐蚀:

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

[传统图像处理]-----图像的膨胀和腐蚀、开运算、闭运算、黑帽、顶帽(python+opencv)

迭代次数为5:

[传统图像处理]-----图像的膨胀和腐蚀、开运算、闭运算、黑帽、顶帽(python+opencv)

四,膨胀和腐蚀代码:

膨胀代码:

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)开运算:先对图像腐蚀后膨胀。

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

[传统图像处理]-----图像的膨胀和腐蚀、开运算、闭运算、黑帽、顶帽(python+opencv)

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

[传统图像处理]-----图像的膨胀和腐蚀、开运算、闭运算、黑帽、顶帽(python+opencv)

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

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

[传统图像处理]-----图像的膨胀和腐蚀、开运算、闭运算、黑帽、顶帽(python+opencv)

代码:

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)闭运算:先对图像膨胀后腐蚀

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

[传统图像处理]-----图像的膨胀和腐蚀、开运算、闭运算、黑帽、顶帽(python+opencv)

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

[传统图像处理]-----图像的膨胀和腐蚀、开运算、闭运算、黑帽、顶帽(python+opencv)

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

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

[传统图像处理]-----图像的膨胀和腐蚀、开运算、闭运算、黑帽、顶帽(python+opencv)

代码:

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)黑帽:

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

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

[传统图像处理]-----图像的膨胀和腐蚀、开运算、闭运算、黑帽、顶帽(python+opencv)

对于RGB图片:

[传统图像处理]-----图像的膨胀和腐蚀、开运算、闭运算、黑帽、顶帽(python+opencv)

代码:

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

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

作用:得到前境外的瑕疵

[传统图像处理]-----图像的膨胀和腐蚀、开运算、闭运算、黑帽、顶帽(python+opencv)

对于RGB图片:

[传统图像处理]-----图像的膨胀和腐蚀、开运算、闭运算、黑帽、顶帽(python+opencv)

代码:

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()
           

继续阅读