如何在图像上绘制矢量场?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在图像上绘制矢量场?相关的知识,希望对你有一定的参考价值。
为了在视觉上理解所涉及的矢量,图像操作的标量场,包括计算,梯度,发散,拉普拉斯等,我试图在所涉及的图像上绘制它们。我开始使用渐变,如下所示
- 使箭头设置旋转(看起来像这样),与下面的图像相比。我错过了什么?
- 另外我如何很好地扩展它们?
MWE:
test_img = cv2.imread('images/ring.png', cv2.IMREAD_GRAYSCALE)
r, c = test_img.shape
gd = 15
test_slice = test_img[::gd,::gd] # every 15th point
X, Y = np.mgrid[0:r:gd, 0:c:gd]
dY, dX = np.gradient(test_slice)
plt.figure(figsize=(10,10))
plt.quiver(X, Y, dX, dY, color='y')
plt.imshow(test_img, cmap='gray')
plt.show()
输出:
所需的风格:(带有图像的矢量场代替):
使用的样本图像:link
注意:我最初使用了一个png,然后alpha区域给了一个nan,所以现在我已经上传了jpg。
答案
简短的回答是:np.mgrid()
给你一个转置(即旋转)矩阵,例如参见this article。
在下面,我使用matplotlib.image
加载图像(我首先将其转换回.png)。我展平图像(即删除alpha通道)并使用imshow
和拟合色图(“Greys_r”)。然而,重要的部分是在Y, X = np.mgrid[0:r:gd, 0:c:gd]
,如果你的图像不是正方形,你可能会发现自己。
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
fname="/path/to/ring.png"
im = mpimg.imread(fname)
flat_image=(im[:,:,0]+im[:,:,1]+im[:,:,2])/3.
r, c = np.shape(flat_image)
gd = 4
test_slice = flat_image[::gd,::gd] # sampling
fig,ax=plt.subplots(1,1)
the_image = ax.imshow(
flat_image,
zorder=0,alpha=1.0,
cmap="Greys_r",
origin="upper",
interpolation="hermite",
)
plt.colorbar(the_image)
Y, X = np.mgrid[0:r:gd, 0:c:gd]
dY, dX = np.gradient(test_slice)
ax.quiver(X, Y, dX, dY, color='r')
plt.show()
然而,生成的图像(使用色图viridis
)似乎可以满足您的需求。
以上是关于如何在图像上绘制矢量场?的主要内容,如果未能解决你的问题,请参考以下文章