一. 膨胀和腐蚀的粗略理解
因为膨胀和腐蚀都属于形态学滤波范畴,所以必须先有一个结构体元素。结构体元素就是滤波器矩阵,其有多种类型,包括x形、矩形、十字交叉形、菱形等。其中cv2有默认getStructingElement()方法获取矩形和十字交叉形的结构体元素,当然也可以通过numpy库中的numpy.array()自定义,下面通过一个代码例子列举:
A. cv2内部方法默认分别获取 矩形滤波器,十字交叉形滤波器:
其中第一个参数是类型,第二个参数是内核大小ksize,即滤波器大小,最好为奇数(3,5,7)
kernel_rect=cv2.getStructuringElement(cv2.MORPH_RECT,(5,5)),
kernel_cross=cv2.getStructuringElement(cv2.MORPH_CROSS,(5,5))
B. numpy.array()自定义
#x形滤波器结构体元素
kernel_x=np.array([[1,0,0,0,1],[0,1,0,1,0],[0,0,1,0,0],[0,1,0,1,0],[1,0,0,0,1]],dtype=np.uint8)
#菱形滤波器结构体元素
kernel_diamond = np.array([[0,0,1,0,0],[0,1,1,1,0],[1,1,1,1,1],[0,1,1,1,0],[0,0,1,0,0]],dtype=np.uint8)
在获取完结构体元素后,就进行膨胀或者腐蚀操作,所谓膨胀就是把上面获得的结构体元素与原图像的灰度图逐个遍历,获取该区域内的最大值。所以膨胀过后的效果图是,原本图中的亮的区域更多,暗的区域变少,有利于背景的提取。如果连续多次膨胀,最终会得到原图大小的全为255像素的全白图片。而腐蚀就是膨胀的非操作,获取的是区域内的最小值,原本图中的暗的区域更多,亮的区域变少,有利于前景的提取。如果连续多次膨胀,最终会得到原图大小的全为0像素的黑色图片,下面利用一张二值图来演示一下:
原图:
膨胀后: