图像的形态学运算又分为二值图像的形态学运算以及灰度图像的形态学运算。形态学运算的基本操作有腐蚀、膨胀、开运算、闭运算等。开运算以及闭运算都属于腐蚀和膨胀两种操作的结合。腐蚀和膨胀都是通过卷积核在目标图像中移动进行卷积操作完成的。腐蚀能够使图像中目标区域缩小,膨胀是目标区域变大。
1.腐蚀
简单来说,腐蚀是通过缩小目标区域边界实现图像缩小的一种运算。一般腐蚀运算用于消除较小的多余目标物。对于二值图像的腐蚀运算,卷积核在二值图像上进行移动,在卷积核覆盖的目标图像区域中,若卷积核为1的位置所对应的原图像也均为1,则中心像素赋值1,否则赋值0。完成腐蚀操作的图像会比原图像中前景区域更小。对于灰度图像的腐蚀运算,将卷积核当前覆盖目标图像的区域记为P,用P减去卷积核,并将得到结果中的最小值赋给中心像素,一次完成一次卷积运算。
2.膨胀
膨胀运算与腐蚀运算相反,能够通过扩大目标区域边界实现图像扩大。可以用于连通目标中的断裂区域、填补目标区域中的空洞。二值图像的膨胀运算,若卷积核对应的目标图像区域中有至少一个位置上原图像以及卷积核均为1,则赋值中心像素为1,否则赋值为0。对于灰度图像的膨胀运算,将P区域与卷积核相加,并将结果中的最大值赋给中心像素,完成膨胀运算。
3.开运算
开运算即为先腐蚀后膨胀。通过开运算能够把目标区域中细微连在一起的区域断开、去除孤立的小点、毛刺来完成目标边界平滑等,并保持总的形状和位置不变。
4.闭运算
闭运算为先膨胀后腐蚀。能够填补目标区域中的小洞、弥合小的裂缝、平滑边界,并且不会改变目标的形状和位置。
在opencv中,可以通过特定的函数完成各类形态学操作。通过cv2.erode()以及cv2.dilate()函数分别实现腐蚀以及膨胀运算。参数分别为输入图像、定义好的卷积核、迭代次数(默认为1)。Cv2.morphlolgy()函数实现开或闭运算,第一个参数为输入图像,第二个参数cv2.MORPH_CLOSE或者cv2.MORPH_OPEN确定闭运算还是开运算,第三个参数为卷积核。以上函数中卷积核的定义可以是通过numpy库自定义的零值图像,也可以通过函数 cv2.getStructuringElement()定义不同形状的卷积核。第一个参数通过cv2.MORPH_RECT或cv2.MORPH_ELLIPSE、cv2.MORPH_CROS确定卷积核形状。第二个参数确定卷积核大小。