首页 > 解决方案 > 使用 skimage 和 fil_finder 测量骨架长度

问题描述

我正在尝试测量香蕉图片的最长和横向分支,使用 skimage 获取骨架,然后使用 fil_finder 获取最长分支的长度,代码改编自这篇文章

如何使用python测量骨架长度的想法

但我无法让它 fil_finder 与 skimage 的骨架输出一起工作,我收到以下错误:

raise TypeError("Data must be 2D. Please re-check the inputs.")
TypeError: Data must be 2D. Please re-check the inputs.

使用代码中使用的 skimage 香蕉图片制作的骨架

如果需要测量最长和横向长度的长度,任何帮助解决错误和更新代码

from skimage import io,img_as_float
from skimage.morphology import skeletonize
from matplotlib import pyplot as plt
from skimage.util import invert
import numpy as np
from fil_finder import FilFinder2D
import astropy.units as u

image=img_as_float(io.imread('C:/python/fruits/banana.jpg'))


gray = invert(image)
skeleton=skeletonize(gray)


fil = FilFinder2D(skeleton, distance=250 * u.pc, mask=skeleton)
fil.preprocess_image(flatten_percent=85)
fil.create_mask(border_masking=True, verbose=False,
use_existing_mask=True)
fil.medskel(verbose=False)
fil.analyze_skeletons(branch_thresh=40* u.pix, skel_thresh=10 * u.pix, prune_criteria='length')

plt.imshow(fil.skeleton, cmap='gray')
plt.contour(fil.skeleton_longpath, colors='r')
plt.axis('off')
plt.show()

标签: pythonimage-processingscikit-image

解决方案


(1) 您的图像可能是 RGB(彩色),并且

(2)骨架化需要二进制(黑白,甚至灰色)。

所以,你需要这样做:

from skimage.color import rgb2gray
from skimage import filters

image_rgb = img_as_float(io.imread('C:/python/fruits/banana.jpg'))

image_gray = invert(rgb2gray(image_rgb))
image_binary = image_gray > filters.threshold_otsu(image_gray)  # for example

skeleton = skeletonize(image_binary)

(3) 免责声明:我是 skan 的主要作者,但只是想把它作为 filfinder 的替代品扔出去:一个 n 维骨架分析工具:https ://jni.github.io/skan/


推荐阅读