切片与闭合的路径的numpy数组

时间:2014-06-25 16:39:47

标签: numpy matplotlib

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)

1 个答案:

答案 0 :(得分:3)

这里的问题是path.contains_points期望接收坐标数组(Nx2数组)。然后它返回一个带有N个点的向量,每个点都有TrueFalse

因此,您需要为要搜索的区域创建一个坐标数组(例如[[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是个不错的伎俩!