【问题标题】:How to plot vector field on image?如何在图像上绘制矢量场?
【发布时间】:2019-04-12 14:20:03
【问题描述】:

为了直观地理解涉及计算、梯度、散度、拉普拉斯等的图像操作中所涉及的矢量、标量场,我试图将它们也绘制在所涉及的图像上。我从下面的渐变开始,但是

  1. 与下面的图像相比,旋转箭头组(看起来像这样)。我错过了什么?
  2. 另外,我如何很好地缩放它们?

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。

【问题讨论】:

  • 我觉得你应该看看这个post
  • 正如我所说,那些帖子正在处理 (x,y) 函数,然后在顶部覆盖 quiver。相反,我想使用图像。我找不到任何使用图像的 SO 帖子,并绘制了它的梯度向量。
  • 如果没有原始数据集,很难验证——你能上传你的 ring.png 吗?
  • 哦,当然。对于那个很抱歉。我刚刚上传。

标签: python numpy matplotlib gradient calculus


【解决方案1】:

简短的回答是:np.mgrid() 为您提供了一个转置(即旋转)矩阵,例如,参见this article

在下文中,我使用matplotlib.image 加载图像(我首先将其转换回.png)。 我将图像展平(即删除 alpha 通道)并使用带有合适颜色图(“Greys_r”)的imshow。然而,重要的部分在 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)似乎符合您的要求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-17
    • 2015-10-21
    • 2021-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多