形态学滤波
形态学滤波基本操作
形态学本来是生物中的一个概念,但是对于图像处理来说,形态学指的是数学方面的形态学滤波,特别是对图像的滤波处理。它的本质和其他滤波器一样,都能够对图像进行去噪、增强等作用。
它包括的运算很多,最基本的两个形态学操作是腐蚀和膨胀,其他的高级形态学操作都是基于这两个基本的形态学操作进行的,比如开运算、闭运算、形态学梯度、顶帽、黑帽等。
膨胀
膨胀就是求一个局部最大值的过程,就是将要处理的图像与结构化元素进行卷积,选择一个瞄点,求这个结构化元素以这个瞄点为中心可以覆盖的最大面积。
如上图所示,(注意右图比左图其实是大一圈)经过膨胀在原图像周围上新围绕一圈像素,选取不同的结构化元素可以使得围绕的规则不同,但通常都会是边缘更加圆滑。
下面采用一个5*5的全1结构化元素来演示一下膨胀效果。
import cv2
import numpy as np
img = cv2.imread('j.png',0)
kernel = np.ones((5,5),np.uint8)
erosion = cv2.dilate(img,kernel,iterations = 1)
在代码中,kernel 表示用来膨胀的操作的结构化元素,我们也可以利用 getStructuringElement() 函数来指明它的形状。iterations 指的是膨胀的次数,这里默认为1次。
如图为原图
膨胀后的图片,可以看出,图像中的线条明显变胖了。
腐蚀
而腐蚀正好相反,同样是选择一个结构化元素和一个瞄点,但是运算变为以这个瞄点为中心,这个结构化元素可以消除的最大面积。
如上图所示,右边的比左边的少了周围一圈。直观的来看,原来的图像中的凸起的边缘经过腐蚀运算就被消除了。
代码实现与膨胀类似,这里不再写出全部代码,仅写出不同的部分。
erosion = cv2.erode(img,kernel,iterations = 1)
腐蚀后的图像,可以看出,线条明显变细,提取出了图像的骨架。
开运算
开运算就是先腐蚀后膨胀,他的主要作用就是用来去噪,可以消除一些小的像素点,并且在不改变物体形状的前提下对图像进行平滑操作。
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
右图是经过开运算的结果图,可以看到,图像中的噪声点都已经被消除,但是主体仍然不发生变化。
闭运算
闭运算就是先膨胀后腐蚀,他常被用来填充前景物体中的小洞,或者一些小的缝隙。
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
右图是经过闭运算的结果图,可以看到,原来图中的小黑洞都已经被消除了。
其他操作
其他基于膨胀和腐蚀的操作还包括形态学梯度,顶帽,黑帽。其中,形态学梯度的含义是膨胀后图像与腐蚀后图像的差,得到的结果是原图像的轮廓。顶帽是原图像与开运算后图像的差,黑帽是原图像与闭运算后图像的差。
欢迎大家关注公众号“计算机视觉与机器学习”
计算机视觉和机器学习