OpenCV—python 图片细化(骨架提取)二
Posted SongpingWang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenCV—python 图片细化(骨架提取)二相关的知识,希望对你有一定的参考价值。
文章目录
一、骨架提取函数 skeletonize()
骨架提取,也叫二值图像细化。这种算法能将一个连通区域细化成一个像素的宽度,用于特征提取和目标拓扑表示。骨架提取与分水岭算法也属于形态学处理范畴,都放在morphology子模块内。
morphology子模块提供了两个函数用于骨架提取,分别是Skeletonize()函数和medial_axis()函数。
在模块:skimage.morphology.skeletonize(binary_image)下:输入和输出都是二值图像。
pip install scikit-image -i https://pypi.tuna.tsinghua.edu.cn/simple
【安装地址】
import cv2
from skimage import morphology
import numpy as np
img = cv2.imread(xihua_test.png,0)
_,binary = cv2.threshold(img,200,255,cv2.THRESH_BINARY_INV)
cv2.imwrite("binary.png",binary)
binary[binary==255] = 1
skeleton0 = morphology.skeletonize(binary)
skeleton = skeleton0.astype(np.uint8)*255
cv2.imwrite("skeleton.png",skeleton)
以下依次为:二值化图,细化后图
二、骨架提取函数 medial_axis()
medial_axis就是中轴的意思,利用中轴变换方法计算前景(1值)目标对象的宽度,格式为:
skimage.morphology.medial_axis(image, mask=None, return_distance=False)
mask: 掩模。默认为None, 如果给定一个掩模,则在掩模内的像素值才执行骨架算法。
return_distance: bool型值,默认为False. 如果为True, 则除了返回骨架,还将距离变换值也同时返回。这里的距离指的是中轴线上的所有点与背景点的距离。
import cv2
from skimage import morphology
import numpy as np
img = cv2.imread(xihua_test.png,0)
_,binary = cv2.threshold(img,200,255,cv2.THRESH_BINARY_INV)
binary[binary==255] = 1
skel, distance =morphology.medial_axis(binary, return_distance=True)
dist_on_skel = distance * skel
dist_on_skel = dist_on_skel.astype(np.uint8)*255
cv2.imwrite("dist_on_skel.png",dist_on_skel)
与上述函数方法效果不同。如下图。
以上是关于OpenCV—python 图片细化(骨架提取)二的主要内容,如果未能解决你的问题,请参考以下文章