用户登录
用户注册

分享至

OpenCV—python 图片细化(骨架提取)二

  • 作者: 想嗦不能嗦不能嗦又想嗦
  • 来源: 51数据库
  • 2022-05-09

文章目录

      • 一、骨架提取函数 skeletonize()
      • 二、骨架提取函数 medial_axis()

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


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

特别鸣谢
https://www.cnblogs.com/denny402/p/5167414.html

软件
前端设计
程序设计
Java相关