将HSV蒙版转化为一组点

时间:2018-08-12 03:33:00

标签: python algorithm opencv image-processing video-processing

我从图像创建了HSV蒙版。结果如下: enter image description here

我希望此蒙版可以用一组点表示。我最初的想法是使用Skimage Skeletonize创建一条线,然后使用滑动窗口来计算创建点的局部均值。

但是,骨架化花费的时间太长。每帧需要0.4s。对于视频处理来说,这不是一个好主意。 enter image description here

2 个答案:

答案 0 :(得分:1)

您要蒙版的所有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:

enter image description here

答案 1 :(得分:0)

一个简单的 For 循环无法工作吗?

扫描位图的每个“跨”行以查找...

  • X个位置,其中 from Black White =新的start point

  • 现在也在同一条扫描线中寻找新的X-pos:
    其中 from White Black =新的end point

  • 要么将点放在“概述”效果的开始/结束点上,要么
    否则用dot.x = (end_point - start_point) / 2

  • 将点放在“中心”效果中