【youcans 的 OpenCV 例程200篇】130. 形态学之提取水平和垂直线
3. 形态学算法
形态学处理的主要应用是提取图像中用来表示和描述形状的元素和成分,例如提取边界、连通分量、凸壳和区域骨架。
### 3.8 提取水平和垂直线
提取图像中的水平线和垂直线,能够筛选出对自己有用的、感兴趣的部分。
腐蚀是用指定的结构元(卷积核)侵蚀图像,结构元确定像素邻域的形状,在该邻域上取最小值;膨胀是用指定的结构元(卷积核)膨胀图像,结构元确定像素邻域的形状,在该邻域上取最大值。
通过自定义的结构元素,使结构元对输入图像的一些对象敏感,而对另一些对象不敏感,就会滤去敏感对象、保留不敏感对象。对于水平或垂直线,可以通过定义水平线或垂直线的结构元素去除水平线或垂直线的干扰,也可以提取水平或垂直线。
也就是说,定义反映水平或垂直线特征的结构元,通过开操作(腐蚀+膨胀)就可以提取图像中的水平与垂直线。
例程 10.19:提取水平和垂直线
# 10.19:提取水平和垂直线
imgGray = cv2.imread("../images/imgLine2.png", flags=0) # flags=0 灰度图像
ret, imgBin = cv2.threshold(imgGray, 205, 255, cv2.THRESH_BINARY_INV) # 二值化处理,反白
h, w = imgBin.shape[0], imgBin.shape[1]
# 提取水平线
hline = cv2.getStructuringElement(cv2.MORPH_RECT, ((w//16),1), (-1,-1)) # 水平结构元
imgOpenHline = cv2.morphologyEx(imgBin, cv2.MORPH_OPEN, hline) # 开运算提取水平结构
imgHline = cv2.bitwise_not(imgOpenHline) # 恢复白色背景
# 提取垂直线
vline = cv2.getStructuringElement(cv2.MORPH_RECT, (1,(h//16)), (-1,-1)) # 垂直结构元
imgOpenVline = cv2.morphologyEx(imgBin, cv2.MORPH_OPEN, vline) # 开运算提取垂直结构
imgVline = cv2.bitwise_not(imgOpenVline)
lineRemoved = imgBin - imgOpenHline # 删除水平线 (白底为 0)
lineRemoved = lineRemoved - imgOpenVline # 删除垂直线
imgRebuild = cv2.bitwise_not(lineRemoved) # 恢复白色背景
plt.figure(figsize=(9, 6))
plt.subplot(141), plt.axis('off'), plt.title("origin")
plt.imshow(imgGray, cmap='gray', vmin=0, vmax=255)
plt.subplot(142), plt.title("horizontal line"), plt.axis('off')
plt.imshow(imgHline, cmap='gray', vmin=0, vmax=255)
plt.subplot(143), plt.title("vertical line"), plt.axis('off')
plt.imshow(imgVline, cmap='gray', vmin=0, vmax=255)
plt.subplot(144), plt.title("h/v line removed"), plt.axis('off')
plt.imshow(imgRebuild, cmap='gray', vmin=0, vmax=255)
plt.tight_layout()
plt.show()
(本节完)
版权声明:
youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/123498231)
Copyright 2022 youcans, XUPT
Crated:2022-3-15