import numpy as np
from matplotlib.path import Path
w, h = 300, 200
mask = np.zeros((h, w))
verts = [(0, h), (w/2, 0), (w, h), (0, h)]
codes = [Path.MOVETO, Path.LINETO, Path.LINETO, Path.CLOSEPOLY]
path = Path(verts, codes)
mask[path.contains_points(mask)] = 1
结果:
Traceback (most recent call last):
File "test.py", line 13, in <module>
mask[path.contains_points(mask)] = 1
File "C:\Python27\lib\site-packages\matplotlib\path.py", line 488, in contains_points
result = _path.points_in_path(points, radius, self, transform)
TypeError: Argument 0 to points_in_path must be an Nx2 numpy array
因此matplotlib.path.Path.contains_points()
不会扩展对掩码创建有用的数组索引。
如何使用封闭路径掩盖numpy数组(如果可能的话,使用matplotlib或不使用matplotlib)
答案 0 :(得分:3)
这里的问题是path.contains_points
期望接收坐标数组(Nx2数组)。然后它返回一个带有N个点的向量,每个点都有True
或False
。
因此,您需要为要搜索的区域创建一个坐标数组(例如[[0,0],[0,1],[0,2] ...])。然后,您可以将其提供给contains_points
,以了解路径中的哪些点。
有几种方法可以实现这一点,例如:
coordinates = np.dstack(np.meshgrid(np.arange(w), np.arange(h))).reshape(-1,2)
within = coordinates[path.contains_points(coordinates)]
mask = np.zeros((h,w))
mask[within[:,1], within[:,0]] = 1
现在你应该有一个大小为h x w且掩码内有1的数组。
顺便说一句,使用matplotlib.path
是个不错的伎俩!