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

2024-04-27 00:57:34 发布

您现在位置:Python中文网/ 问答频道 /正文

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

  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。在


Tags: test图像imgpngnpslicepltcv2
1条回答
网友
1楼 · 发布于 2024-04-27 00:57:34

简单的回答是:np.mgrid()是给你一个转置(即旋转)矩阵,例如this article。在

在下面,我将使用matplotlib.image加载图像(我首先将其转换回.png)。 我将图像展平(即移除alpha通道)并使用imshow和合适的颜色贴图(“Greys\u 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()

生成的图像(但是带有colormapviridis)似乎可以满足您的需要。 Image with quiver

相关问题 更多 >