python计算机视觉

python计算机视觉涉及到图形图像,线性代数,概率论,python语言等知识。

形态学图像处理

形态学图像处理有两个关键概念:结构元与形态学操作,基础的形态学操作有腐蚀,膨胀,衍生的形态学操作有开运算,闭运算,顶帽运算,底帽运算,形态学梯度(获取轮廓),常见的应用有边界提取,孔洞填充,计算连通分量,计算凸包,骨架,水平垂直线提取,灰度图的阴影矫正,灰度图图像平滑,纹理分割等。有关形态学的教材一般从集合的形式阐述各种形态学操作,个人认为直接上手操作更直观,参考博客:https://blog.csdn.net/youcans/category_11459626.html
结构元的构建可以使用以下两种方式,两者等价

1
2
3
4
5
kSize = (3, 3)  # 卷积核的尺寸
kernel = np.ones(kSize, dtype=np.uint8) # 生成盒式卷积核

# 等价于
element = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))

基本的形态学操作记录如下,方便以后查阅

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 腐蚀
imgErode = cv2.erode(imgBin, kernel=kernel) # 图像腐蚀
# 膨胀
imgDilate = cv2.dilate(imgBin, kernel=kernel) # 图像膨胀
# 开运算
imgOpen = cv2.morphologyEx(imgGray, cv2.MORPH_OPEN, kernel)
# 闭运算
imgClose = cv2.morphologyEx(imgBin, cv2.MORPH_CLOSE, kernel)
# 顶帽运算
imgThat = cv2.morphologyEx(imgBin, cv2.MORPH_TOPHAT, kernel) # 顶帽运算
# 底帽运算
imgBhat = cv2.morphologyEx(imgBin, cv2.MORPH_BLACKHAT, kernel) # 底帽运算
# 形态学梯度
imgGrad = cv2.morphologyEx(imgBin, cv2.MORPH_GRADIENT, kernel) # 形态学梯度
# 击中与不击中操作在实现上相对复杂一些,涉及到两个结构元
kernB1 = np.array([[0, 0, 0],[0, -1, 1],[0, 0, 0]], dtype=np.int32) # B1
kernB2 = np.array([[0, 0, 0],[1, -1, 0],[0, 0, 0]], dtype=np.int32) # B2
imgH1 = cv2.morphologyEx(img, cv2.MORPH_HITMISS, kernB1)
imgH2 = cv2.morphologyEx(img, cv2.MORPH_HITMISS, kernB2)
imgHMT = cv2.add(imgH1, imgH2) # 击中击不中