Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 形状多边形到二元遮罩_Python_Mask_Geopandas_Shapely - Fatal编程技术网

Python 形状多边形到二元遮罩

Python 形状多边形到二元遮罩,python,mask,geopandas,shapely,Python,Mask,Geopandas,Shapely,我看到有人问这个问题,但还没有找到一个完整的答案。我有一个简单的多边形,叫做多边形。我想将此多边形提取为二进制掩码(理想情况下为numpy数组)。我该怎么做呢 我还成功地将shapely转换为geopandas,如图所示,因此从geopandas提取蒙版也可以,但不幸的是,我还没有真正找到这方面的线索 编辑: 为了清楚起见,如果我要使用坐标网格,我的网格包含x和y笛卡尔坐标(无序),对应于构成形状轮廓的点。这些都是浮点数,因此需要int输入的解决方案不会很有效。理想情况下,我希望起点是一个匀称的

我看到有人问这个问题,但还没有找到一个完整的答案。我有一个简单的多边形,叫做
多边形
。我想将此多边形提取为二进制掩码(理想情况下为numpy数组)。我该怎么做呢

我还成功地将shapely转换为geopandas,如图所示,因此从geopandas提取蒙版也可以,但不幸的是,我还没有真正找到这方面的线索

编辑: 为了清楚起见,如果我要使用坐标网格,我的网格包含x和y笛卡尔坐标(无序),对应于构成形状轮廓的点。这些都是浮点数,因此需要int输入的解决方案不会很有效。理想情况下,我希望起点是一个匀称的多边形,而不是一组点,但如果这更可取,我可以使用一组无序的点(或者从匀称的多边形中以某种方式顺时针提取顶点)

我尝试过Yusuke描述的方法,但我得到的面具不太有意义

Yusuke的方法:

#%% create grid and plot
nx, ny = 100, 100
poly_verts = Plane1verts #this is a list of tuples containing cartesian coordinate pairs of the shape contour in x and y
# Create vertex coordinates for each grid cell...
# (<0,0> is at the top left of the grid in this system)
x, y = np.meshgrid(np.arange(nx), np.arange(ny))
x, y = x.flatten(), y.flatten()

points = np.vstack((x,y)).T

path = Path(poly_verts)
grid = path.contains_points(points)
grid = grid.reshape((ny,nx))

plt.imshow(grid)
plt.title('Grid plot')
plt.show()
导致阴谋

编辑2: 这是我用作元组列表的坐标网格的副本

[(-8.982, -12.535), (-7.478, -12.535), (-5.975, -12.535), (-4.471, -12.535), (-4.471, -12.535), (-2.967, -11.031), (-1.463, -11.031), (-1.463, -11.031), (0.041, -9.527), (0.041, -9.527), (1.544, -8.023), (3.048, -8.023), (4.552, -8.023), (4.552, -8.023), (6.056, -6.52), (7.559, -6.52), (7.559, -6.52), (7.559, -5.016), (9.063, -3.512), (10.567, -3.512), (10.567, -3.512), (10.567, -2.008), (10.567, -0.505), (10.567, 0.999), (10.567, 2.503), (10.567, 4.007), (10.567, 4.007), (9.063, 5.51), (9.063, 5.51), (7.559, 7.014), (7.559, 7.014), (6.056, 8.518), (6.056, 8.518), (4.552, 10.022), (4.552, 11.526), (4.552, 11.526), (3.048, 11.526), (1.544, 11.526), (1.544, 11.526), (1.544, 10.022), (0.041, 8.518), (0.041, 8.518), (0.041, 7.014), (-1.463, 5.51), (-2.967, 5.51), (-4.471, 5.51), (-4.471, 5.51), (-5.975, 4.007), (-7.478, 4.007), (-8.982, 4.007), (-10.486, 4.007), (-11.99, 4.007), (-13.493, 4.007), (-13.493, 4.007), (-14.997, 2.503), (-14.997, 2.503), (-16.501, 0.999), (-18.005, 0.999), (-18.005, 0.999), (-18.005, -0.505), (-19.508, -2.008), (-19.508, -2.008), (-19.508, -3.512), (-19.508, -5.016), (-19.508, -5.016), (-18.005, -6.52), (-18.005, -8.023), (-18.005, -8.023), (-16.501, -9.527), (-16.501, -9.527), (-14.997, -9.527), (-13.493, -11.031), (-13.493, -11.031), (-11.99, -11.031), (-10.486, -12.535), (-10.486, -12.535)]
听起来正是你要找的

从shapely.geometry导入多边形
导入光栅特征
将matplotlib.pyplot作为plt导入
多边形=多边形([(0,50)、(10,10)、(30,0)、(45,45)、(0,50)])
img=rasterio.features.rasterize([poly],out_shape=(60,50))
plt.imshow(img)

这是否回答了您的问题?我已经看到了这个线程,但不幸的是,我的坐标网格不是由浮点组成的,而是由int |组成的(包括负x和y方向的坐标)。我有一组笛卡尔坐标,而不是像素坐标,因此建议的解决方案似乎不起作用。我用Yusuke的方法绘制的图与直接用shapely绘制的图不一致。出于某种原因,我得到了一个非常不同的形状。你在使用geopandas吗?我在使用geopandas,尽管目前我这样做只是为了绘制轮廓并验证它是否正常工作。如果多边形上的点没有任何特定的顺序,这会起作用吗?不幸的是,我的问题与我原来的帖子中的问题相同,也就是说,gpd图看起来与使用Yusuke的方法相同。我也尝试过直接输入多边形以进行栅格化,但我从我的原始帖子的第一个图中得到了相同的奇怪形状。你可以尝试将
.convertic\u hull
应用于多边形/点集?试试看,形状有点变化,但我仍然有同样的问题,它只占左上角输出的一小部分,并且形状与geopandas上的不匹配。奇怪!(感谢您迄今为止的建议)您可以尝试使用
光栅化()
变换
参数将多边形变换到图像坐标范围。栅格化多边形显示在左上角,因为多边形顶点的坐标位于左上角。
[(-8.982, -12.535), (-7.478, -12.535), (-5.975, -12.535), (-4.471, -12.535), (-4.471, -12.535), (-2.967, -11.031), (-1.463, -11.031), (-1.463, -11.031), (0.041, -9.527), (0.041, -9.527), (1.544, -8.023), (3.048, -8.023), (4.552, -8.023), (4.552, -8.023), (6.056, -6.52), (7.559, -6.52), (7.559, -6.52), (7.559, -5.016), (9.063, -3.512), (10.567, -3.512), (10.567, -3.512), (10.567, -2.008), (10.567, -0.505), (10.567, 0.999), (10.567, 2.503), (10.567, 4.007), (10.567, 4.007), (9.063, 5.51), (9.063, 5.51), (7.559, 7.014), (7.559, 7.014), (6.056, 8.518), (6.056, 8.518), (4.552, 10.022), (4.552, 11.526), (4.552, 11.526), (3.048, 11.526), (1.544, 11.526), (1.544, 11.526), (1.544, 10.022), (0.041, 8.518), (0.041, 8.518), (0.041, 7.014), (-1.463, 5.51), (-2.967, 5.51), (-4.471, 5.51), (-4.471, 5.51), (-5.975, 4.007), (-7.478, 4.007), (-8.982, 4.007), (-10.486, 4.007), (-11.99, 4.007), (-13.493, 4.007), (-13.493, 4.007), (-14.997, 2.503), (-14.997, 2.503), (-16.501, 0.999), (-18.005, 0.999), (-18.005, 0.999), (-18.005, -0.505), (-19.508, -2.008), (-19.508, -2.008), (-19.508, -3.512), (-19.508, -5.016), (-19.508, -5.016), (-18.005, -6.52), (-18.005, -8.023), (-18.005, -8.023), (-16.501, -9.527), (-16.501, -9.527), (-14.997, -9.527), (-13.493, -11.031), (-13.493, -11.031), (-11.99, -11.031), (-10.486, -12.535), (-10.486, -12.535)]