作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
如果我绘制一个 2D 数组并绘制它的轮廓,我可以通过 cs = plt.contour(...); 访问分割图。 cs.allsegs
但它被参数化为一行。我想要一个线段内部的 segmap bool 掩码,这样我就可以快速总结该轮廓内的所有内容。
非常感谢!
最佳答案
我认为没有真正简单的方法,主要是因为您想混合光栅数据和矢量数据。幸运的是,Matplotlib 路径有一种方法可以检查一个点是否在路径内,对所有像素执行此操作将生成一个掩码,但我认为这种方法对于大型数据集来说会变得非常慢。
import matplotlib.patches as patches
from matplotlib.nxutils import points_inside_poly
import matplotlib.pyplot as plt
import numpy as np
# generate some data
X, Y = np.meshgrid(np.arange(-3.0, 3.0, 0.025), np.arange(-3.0, 3.0, 0.025))
Z1 = mlab.bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0)
Z2 = mlab.bivariate_normal(X, Y, 1.5, 0.5, 1, 1)
# difference of Gaussians
Z = 10.0 * (Z2 - Z1)
fig, axs = plt.subplots(1,2, figsize=(12,6), subplot_kw={'xticks': [], 'yticks': [], 'frameon': False})
# create a normal contour plot
axs[0].set_title('Standard contour plot')
im = axs[0].imshow(Z, cmap=plt.cm.Greys_r)
cs = axs[0].contour(Z, np.arange(-3, 4, .5), linewidths=2, colors='red', linestyles='solid')
# get the path from 1 of the contour lines
verts = cs.collections[7].get_paths()[0]
# highlight the selected contour with yellow
axs[0].add_patch(patches.PathPatch(verts, facecolor='none', ec='yellow', lw=2, zorder=50))
# make a mask from it with the dimensions of Z
mask = verts.contains_points(list(np.ndindex(Z.shape)))
mask = mask.reshape(Z.shape).T
axs[1].set_title('Mask of everything within one contour line')
axs[1].imshow(mask, cmap=plt.cm.Greys_r, interpolation='none')
# get the sum of everything within the contour
# the mask is inverted because everything within the contour should not be masked
print np.ma.MaskedArray(Z, mask=~mask).sum()
请注意,默认情况下在不同边缘“离开”绘图的等高线不会形成沿着这些边缘的路径。这些行需要一些额外的处理。
关于python - 如何使用 Matplotlib 从轮廓到图像蒙版,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16975458/
我是一名优秀的程序员,十分优秀!