Vla*_*lov 7 python numpy matplotlib
如何勾勒出像素边界matplotlib?例如,对于如下所示的半随机数据集,
# the code block that follows is irrelevant
import numpy as np
k = []
for s in [2103, 1936, 2247, 2987]:
np.random.seed(s)
k.append(np.random.randint(0, 2, size=(2,6)))
arr = np.hstack([np.vstack(k)[:, :-1], np.vstack(k).T[::-1].T ])
image = np.zeros(shape=(arr.shape[0]+2, arr.shape[1]+2))
image[1:-1, 1:-1] = arr
Run Code Online (Sandbox Code Playgroud)
很明显,与像素边缘匹配的轮廓image优于轮廓函数的默认行为,其中轮廓线有效地绘制在边缘像素的对角线上.
import matplotlib.pyplot as plt
plt.contour(image[::-1], [0.5], colors='r')
Run Code Online (Sandbox Code Playgroud)
如何使轮廓与像素对齐?我正在寻找一个解决方案numpy和matplotlib库.
如果图像的每单位分辨率为1像素,您将如何定义像素的"边缘"?"边缘"的概念仅在与像素本身相比增加分辨率的帧中才有意义,并且contour如果它使用与图像本身相同的分辨率则不能绘制任何边缘.
另一方面,当然可以增加分辨率,使得概念"边缘"具有含义.因此,假设我们将分辨率提高了100倍,我们可以使用contour绘图轻松绘制边缘.
import matplotlib.pyplot as plt
import numpy as np
k = []
for s in [2103, 1936, 2247, 2987]:
np.random.seed(s)
k.append(np.random.randint(0, 2, size=(2,6)))
arr = np.hstack([np.vstack(k)[:, :-1], np.vstack(k).T[::-1].T ])
image = np.zeros(shape=(arr.shape[0]+2, arr.shape[1]+2))
image[1:-1, 1:-1] = arr
f = lambda x,y: image[int(y),int(x) ]
g = np.vectorize(f)
x = np.linspace(0,image.shape[1], image.shape[1]*100)
y = np.linspace(0,image.shape[0], image.shape[0]*100)
X, Y= np.meshgrid(x[:-1],y[:-1])
Z = g(X[:-1],Y[:-1])
plt.imshow(image[::-1], origin="lower", interpolation="none", cmap="Blues")
plt.contour(Z[::-1], [0.5], colors='r', linewidths=[3],
extent=[0-0.5, x[:-1].max()-0.5,0-0.5, y[:-1].max()-0.5])
plt.show()
Run Code Online (Sandbox Code Playgroud)
为了比较,我们也可以使用相同的图绘制图像本身imshow.