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)

以下依次为:二值化图,细化后图

OpenCV—python

二、骨架提取函数 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


与上述函数方法效果不同。如下图。

OpenCV—python


以上是关于OpenCV—python 图片细化(骨架提取)二的主要内容,如果未能解决你的问题,请参考以下文章

opencv图像细化

youcans 的 OpenCV 例程200篇127. 形态算法之细化

图像的骨架提取

python数字图像处理(19):骨架提取与分水岭算法

OpenCV2:大学篇 形态学技术-腐蚀与膨胀操作

OpenCV 例程200篇224. 特征提取之提取骨架