opencv 形态学操作——腐蚀、膨胀、开运算、闭运算等
1. opencv 形态学操作
腐蚀、膨胀、开运算、闭运算等
膨胀和腐蚀是图像形态学的两个基本操作. 典型应用是在二值图像中的使用,是很多识别技术中重要的中间处理步骤.
在灰度图像中根据阈值同样可以完成膨胀与腐蚀操作.
1.1 原理
二值图像fx,y 的膨胀操作,类似于对图像的卷积操作.
需要有个 kernel 操作矩阵,类似于卷积核filters,kernel,常见的是 3X3 的矩阵. 这是形态学处理的核心.
但与卷积不同的是,如果矩阵中的像素点有任意一个点的值是前景色,则设置中心像素点为前景色;否则不变.
1.2 图像形态学运算中腐蚀,膨胀,开运算和闭运算
1.2.1 腐蚀
腐蚀是一种消除边界点,使边界向内部收缩的过程可以用来消除小且无意义的物体.
腐蚀算法:
用 3x3 的 kernel,扫描图像的每一个像素;
用 kernel 与其覆盖的二值图像做 “与” 操作;
如果都为1,结果图像的该像素为1;否则为0.结果:使二值图像减小一圈.
1.2.2 膨胀
膨胀是将与物体接触的所有背景点合并到该物体中,使边界向外部扩张的过程可以用来填补物体中的空洞.
膨胀算法:
用 3x3 的 kernel,扫描图像的每一个像素;
用 kernel 与其覆盖的二值图像做 “与” 操作;
如果都为0,结果图像的该像素为0;否则为1.结果:使二值图像扩大一圈.
1.2.3 开运算
先腐蚀后膨胀的过程称为开运算
用来消除小物体、在纤细点处分离物体、平滑较大物体的边界的同时并不明显改变其面积.
1.2.4 闭运算
先膨胀后腐蚀的过程称为闭运算
用来填充物体内细小空洞、连接邻近物体、平滑其边界的同时并不明显改变其面积
1.3 opencv 代码实现
1.3.1 定义kernel 矩阵
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3)) # 椭圆结构
kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (3, 3)) # 十字结构
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3)) # 矩形结构
或使用
kernel = np.ones((3,3),np.uint8)
# 同矩阵结构
1.3.2 腐蚀与膨胀
cv2.erode 和 cv2.dilate 函数
import cv2
import numpy as np
img = cv2.imread('dige.png')
kernel = np.ones((3,3),np.uint8)
erosion = cv2.erode(img,kernel,iterations = 1) # 迭代次数
dilate = cv2.dilate(img,kernel,iterations = 1)
res = np.hstack((img,erosion,dilate))
cv_show('dige and erode and dilate',res)
1.3.3 开运算和闭运算
cv2.morphologyEx 函数
# 开闭运算
import cv2
import numpy as np
img = cv2.imread('dige.png')
kernel = np.ones((5,5),np.uint8)
opening = cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel)
closing = cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel)
result = np.hstack((img,opening,closing))
cv2.imshow('open and close',result)
cv2.waitKey(0)
cv2.destroyAllWindows()