Python 定义二维对象并将其面积用作布尔值

Python 定义二维对象并将其面积用作布尔值,python,boolean,area,Python,Boolean,Area,我已经定义了两个空间维度(x和z),我能够手动“绘制”一个对象,将其用作求解方程的布尔值。我对它的定义如下: A = np.zeros((nz,nx)) object = np.ones_like(A) object[ int(5/dz):int(10/dz) , int(5/dx):int(10/dz) ] = 2 object = object == 2 通过这样做,我可以定义一个z维的正方形5x10和x维的正方形5x10,并应用我认为可以理解为面积的算法。但当涉及到绘制复杂区域时,很难通

我已经定义了两个空间维度(x和z),我能够手动“绘制”一个对象,将其用作求解方程的布尔值。我对它的定义如下:

A = np.zeros((nz,nx))
object = np.ones_like(A)
object[ int(5/dz):int(10/dz) , int(5/dx):int(10/dz) ] = 2
object = object == 2
通过这样做,我可以定义一个z维的正方形5x10和x维的正方形5x10,并应用我认为可以理解为面积的算法。但当涉及到绘制复杂区域时,很难通过小正方形和矩形来完成

所以我想通过鼠标点击来自动生成一个区域,并且我想能够使用这个区域作为布尔值

我能够使用以下工具绘制多边形:

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.patches import Polygon

fig, ax = plt.subplots()

object = np.array(plt.ginput(n=-100,mouse_stop=2))
p = Polygon(object, alpha=0.5)
plt.gca().add_artist(p)


plt.draw()
plt.show()
但这会输出顶点的z和x坐标,我尝试将其用作boleean,但我无法编写它,以便python将其视为由这些点定义的区域


这个问题容易解决吗?

如果您只想计算一般多边形的面积,您可以使用python包,例如:

将numpy导入为np
将matplotlib.pyplot作为plt导入
从shapely.ops导入多边形
从matplotlib.patches将多边形导入为PltPolygon
#获取坐标输入
canvas_size=np.array([1,1])
canvas\u lim=np.array([[0,canvas\u size[0]],[0,canvas\u size[1]]))
图,ax=plt.子批次()
plt.xlim(canvas_lim[0])
plt.ylim(canvas_lim[1])
ax.设置相位(“相等”)
坐标=np.数组(plt.ginput(n=-100,鼠标停止=2))
#使用shapely.ops.Polygon计算面积
多边形=多边形(坐标)
面积=多边形面积
打印(“面积为{}单位^2”。格式(面积))
#画多边形
p=PltPolygon(坐标,α=0.5)
ax.添加艺术家(p)
plt.show()
如果您确实需要掩码,这里有一种方法可以使用
numpy
matplotlib.path
对其进行光栅化。有关详细信息,请参见代码中的注释:

将numpy导入为np
将matplotlib.path导入为mpltPath
将matplotlib.pyplot作为plt导入
#定义多边形的极限
画布所需大小=np.数组([110100])
#我们计算的像素大小(要考虑的点数)
#这个数字越高,我们需要计算的就越多,但是
#近似值将更接近
像素大小=0.1
#计算画布的实际大小
num\u pxiels=np.ceil(画布所需大小/像素大小)。astype(int)
画布实际大小=像素大小
#让我们创建一个网格,每个像素的值就是它在2d图像中的位置
x_coords=np.linspace(
开始=0,
停止=画布实际大小[0],
端点=False,
num=画布所需大小[0]/像素大小,
)
y_coords=np.linspace(
开始=0,
停止=画布实际大小[1],
端点=False,
num=画布所需大小[1]/像素大小,
)
#因为检查像素的中间是否在图像中更有意义
#polygion,我们用半像素大小移动所有东西
像素偏移=像素大小/2
x_中心=x_坐标+像素偏移
y_中心=y_坐标+像素偏移
xx,yy=np.meshgrid(x_中心,y_中心,索引=“ij”)
#将xx和yy矩阵展平为N*2数组,其中包含
#网格中的每个点
像素\u中心=np阵列(
列表(zip(xx.flatte(),yy.flatte()),dtype=np.dtype(“float64”)
)
#现在提示输入形状
canvas\u lim=np.array([[0,canvas\u实际大小[0]],[0,canvas\u实际大小[1]]))
图,ax=plt.子批次()
plt.xlim(canvas_lim[0])
plt.ylim(canvas_lim[1])
ax.设置相位(“相等”)
shape\u points=np.array(plt.ginput(n=-100,鼠标停止=2))
#创建路径对象
形状=mpltPath.路径(形状点)
#使用Path.contains_points计算每个点是否为
#在我们的形状之内
形状包含=形状。包含点(像素中心)
#再次将结果重塑为矩阵
蒙版=np.重塑(形状包含,数量)
#计算面积
印刷品(
“形状区域大约为{}个单位^2”。格式(
np.和(形状包含)*像素大小**2
)
)
#显示光栅化形状以确认其外观是否正确
plt.imshow(np.transpose(mask),aspect=“equal”,origin=“lower”)
plt.xlim([0,num_pxiels[0]]))
plt.ylim([0,num_pxiels[1]]))
plt.show()

或者,一个更简单的解决方案是对其进行阈值化,以获得布尔掩码。谷歌上应该有很多这样做的例子。

为了澄清,你想做的是将任意多边形转换成布尔掩码?我想能够使用任意多边形的面积作为我定义的名称(布尔),因此我能够调用该多边形的不同属性(应该存在于z和x维度内)。比如这个例子,K是导电性:
code
K=Kgeneral*np。像(A)/K[object]=100
code
“object”是我的多边形的区域,我想在那里添加一个与其周围不同的属性。正如我在谷歌搜索的那样,我想这正是你所说的,如果我能光栅化多边形,它可以工作,因为它可以生成z和x坐标,作为构成多边形的正方形或矩形,我可以使用它。