我从图像创建了HSV蒙版。结果如下:
python - 将HSV蒙版转换为一组点-LMLPHP

我希望这个面具可以用一些观点来代表。我最初的想法是使用Skimage Skeletonize创建一条线,然后使用滑动窗口来计算创建点的局部均值。

但是,框架化时间太长。每帧需要0.4s。对于视频处理来说,这不是一个好主意。
python - 将HSV蒙版转换为一组点-LMLPHP

最佳答案

您是否需要蒙版中所有True元素的点,还是只需要骨骼?如果是前者..

import skimage as ski
from skimage import io
import numpy as np
mask = ski.io.imread('./mask.png')[:,:,0]/255
mask = mask.astype('bool')

s0,s1 = mask.shape # dimensions of mask
a0,a1 = np.arange(s0),np.arange(s1) # make two 1d coordinate arrays
coords = np.array(np.meshgrid(a0,a1)).T # cartesian product into a coordinate matrix
coords = coords[mask] # mask out the points of interest

如果是后者,则可以使用以下方法快速获取蒙版中对象的起点和终点(从左到右)
start_mat = np.stack((np.roll(mask,1,axis=1),mask),-1)
start_mask = np.fromiter(map(lambda p: np.alltrue(p==np.array([False,True])),start_mat[mask]),dtype=bool)
starts = coords[start_mask]

end_mat = np.stack((np.roll(mask,-1,axis=1),mask),-1)
end_mask = np.fromiter(map(lambda p: np.alltrue(p==np.array([False,True])),end_mat[mask]),dtype=bool)
ends = coords[end_mask]

这将为您提供对象的大致轮廓。在该图的斜率是0的任何地方,轮廓点都将丢失。您可能必须考虑这些区域的垂直差异方案。同样的想法适用于np.roll(...,axis=0)。您可以将滚动行中的唯一点连接到滚动列中的点连接起来,以获得完整的轮廓。

平均正确的配对以获得骨架并不是一件容易的事。

这是结果大纲。您绝对可以使速度快于0.4s:

python - 将HSV蒙版转换为一组点-LMLPHP

关于python - 将HSV蒙版转换为一组点,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51805471/

10-11 20:39