OpenCV形态学处理
opencv的形态学处理主要包括:腐蚀、膨胀、开运算、闭运算等函数,还有其他的形态学处理函数,但平时任务用的不多。
形态学处理的图像为二值图像,主要是针对图像像素“1”在做处理。
1. 腐蚀操作: cv2.erode()
腐蚀是最基本的形态学操作之一,它能够将图像的边界点消除,使图像沿着边界向内收缩,也可以将小于指定结构体元素的部分去除。腐蚀主要用来“收缩”或者“细化”二值图像中的前景,借此实现去噪声,元素分割等功能。
在腐蚀的过程中,是将二值图中亮度高的部分也就是白色的部分向内腐蚀。类似之前学到的图像滤波处理(卷积滤波),形态学处理也需要一个卷积核来表示腐蚀或者膨胀的大小。
卷积核
kernel
又叫“结构元”,既可以用cv2.getStructuringElement()函数生成,也可以用numpy生成,卷积核越大,形态学处理的面积也就越大,处理的强度也越大。
示例代码如下:
先导入图像
import cv2
img = cv2.imread('./1.png')
然后我们使用腐蚀函数cv2.erode()
对原图像进行腐蚀操作:
先定义核函数kernel
:
kernel = np.ones((5,5)) #矩形核,元素值为1
再使用腐蚀操作:
res = cv2.erode(img, kernel=kernel, iterations=None)
cv2.erode()
函数常用的参数有3个, img
为输入的图像,kernel
为定义的卷积核, iterations
是迭代的次数,次数越高,腐蚀的越厉害。
2. 膨胀操作: cv2.dilate()
膨胀操作和腐蚀操作作用相反,也可以说是腐蚀的逆操作,具体的用法和腐蚀函数erode()
一样,同样需要一个kernel
代表膨胀的大小,也可以设置iterations
参数的数值。
使用膨胀操作的示例代码:
res_dilation = cv2.dilate(img, kernel, iterations=None)
3. 开、闭运算cv2.morphologyEx()
我们可以看到,单纯的腐蚀和膨胀操作会使得图像在原有的形状的基础上发生改变。为了在不改变图像的基础上,而又完成一系列的功能,则需要结合这两种操作。通俗地讲,开闭运算可以节省腐蚀和膨胀的两步操作。
开运算:先腐蚀后膨胀,用来去除图像中一些小的噪点;
闭运算:先膨胀后腐蚀,用来连接被误分为许多小块的图像(例如轮廓的边缘没有连接)
示例代码:
开运算:先读取一张带有盐噪声的图像
img = cv2.imread('./2.png')
然后在对其进行开运算
res_open = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
cv2.morphologyEx()
函数共有3个常用参数,img
为输入的图像,cv2.MORPH_OPEN
证明此时是开运算,kernel
代表开运算同样需要一个核来对原图像处理。
4. 闭运算
闭运算和开运算使用同样的函数,只不过是把参数cv2.MORPH_OPEN
改成cv2.MORPH_CLOSE
即可。