我希望此蒙版可以用一组点表示。我最初的想法是使用Skimage Skeletonize创建一条线,然后使用滑动窗口来计算创建点的局部均值。
答案 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:
答案 1 :(得分:0)
一个简单的 For 循环无法工作吗?
扫描位图的每个“跨”行以查找...
X个位置,其中 from Black
与 White
=新的start point
。
现在也在同一条扫描线中寻找新的X-pos:
其中 from White
与 Black
=新的end point
。
要么将点放在“概述”效果的开始/结束点上,要么
否则用dot.x = (end_point - start_point) / 2