常见的基础形态学操作有:
- scikit-image库的skimage.morphology内有很多图像形态学相关的api。形态学滤波介绍了skimage中基础的形态学滤波。
- opencv库相关的api不多,好像就7个操作:膨胀,腐蚀,开,闭,梯度,黑帽,白帽,相比skimage,好像少了骨骼提取。
skimage中含有针对0-1binary图像优化过的形态学操作,可以更快的实现。
骨骼提取(图象细化 / image thinning)
这是一种形态学处理,我在提取手写笔迹的骨骼的时候用到了,因为之间简单的开闭运算的话,容易破坏图像的结构连通性。而骨骼提取则会在保证结构连通性的前提下,细化图像。
API调用
在scikit-image
包有两种实现,使用方法如下:
skimage.morphology.skeletonize
:可用于2D,3D和ndarray图片的骨骼提取skimage.morphology.thin
:只能用于binary imageskimage.morphology.medial_axis
:binary image,是有超过1个最近点到对象边界的点的集合。通常被称为拓扑骨骼。
from skimage import morphology
import cv2
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 转成灰度图
_, img_bin = cv2.threshold(img_gray, 100, 255, cv2.THRESH_BINARY_INV) # 二值化处理
img_bin[img_bin == 255] = 1 # 将值变成0-1,骨骼提取函数必须要输入01的二值化图象
# 方法一 skeletonize
img_skeleton = morphology.skeletonize(img_bin) # 骨骼提取
img = img_skeleton.astype(np.uint8) * 255 # 值从01重新映射回0-255
# 方法二 thin
img_thin = thin(img_bin)
img = img_thin.astype(np.uint8)
# 方法三 medial_axis
img_
应用
- 笔迹细化:我在识别数学公式的时候,识别经常会将加号和除号混淆,所以对公式图像进行了细化处理,让除号的两点尽可能的分开,不被识别成加号。有效果,但是不大。
膨胀(dilate)
腐蚀(erode)
开运算 -> 白顶帽变换
白顶帽:
会返回图像中的亮点,这些黑点都小于结构元素
闭运算 -> 黑顶帽变换
对于0-1的binary图片,更快的闭运算:skimage.morphology.binary_closing
黑顶帽:闭运算 - 原图
skimage.morphology.black_tophat
会返回图像中的黑点,这些黑点都小于结构元素