形态学操作主要包括腐蚀、膨胀、开运算、闭运算等,在opencv-python中,有相关函数可以满足要求,如cv2.erode(),cv2.dilate(),cv2.morphologyEx()等。形态学操作是根据图像形状进行的简单操作,一般情况下对二值化图像进行的操作。需要输入两个参数,一个是原始图像,第二个被称为结构化元素或核,它是用来决定操作的性质的。两个基本的形态学操作是腐蚀和膨胀,它们的变体构成了开运算、闭运算、梯度等,以下图为例逐一介绍。
首先对这张图进行腐蚀,代码如下:
import cv2
import numpy as np
img = cv2.imread('j.png',0)
kernel = np.ones((5,5),np.uint8)
erosion = cv2.erode(img,kernel,iterations = 1)
运行效果为:
可见腐蚀效果比较明显。查看函数说明,如下图所示:
其原理为:**找kernel尺寸中图片区域中灰度值最小值,并原图片的中心值替换。**我们对其原理进行分析,人为构造一个小维度数组,以此代表一张图像,代码如下所示:
img = np.uint8([[1,2,3,4,5],
[5,4,3,2,1],
[2,4,6,8,10],
[10,8,6,4,2],
[5,10,15,10,5]])
kernel = np.ones((3,3),np.uint8)
erosion = cv2.erode(img,kernel,iterations = 1)
print('img:', img)
print('erosion:', erosion)
运行结果为:
将原图片图示化,如下图所示:
可见,除了边缘以外的中部像素灰度值,均为以本体为中心3✖️3区域内的最小灰度值。而目标图像边缘的像素值,亦为kernel框大小范围内的最小像素值,只是可选择像素由于边缘效果减少了。