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))  # 矩形结构

img

或使用

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()