如何在图像上绘制矢量场?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在图像上绘制矢量场?相关的知识,希望对你有一定的参考价值。

为了在视觉上理解所涉及的矢量,图像操作的标量场,包括计算,梯度,发散,拉普拉斯等,我试图在所涉及的图像上绘制它们。我开始使用渐变,如下所示

  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()

输出:

enter image description here

所需的风格:(带有图像的矢量场代替):

enter image description here

使用的样本图像: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)似乎可以满足您的需求。 Image with quiver

以上是关于如何在图像上绘制矢量场?的主要内容,如果未能解决你的问题,请参考以下文章

matplotlib 中的 3D 矢量场

OpenCV如何在使用单个静态图像时将速度矢量绘制为箭头

matlab 在图像上画矢量

在 ANDROID NOUGAT 上显示模糊图像的矢量绘图

MATLAB可视化实战系列(二十四)-三维可视化如何利用圆锥图显示向量场?

在画布上绘制片段视图