我使用numpy.gradient
来计算标量场图的梯度图。我想我对numpy.gradient
不太了解,因此我可能会生成错误的渐变图。我在下面发布了我的代码和生成的地图:
from astropy.io import fits
import matplotlib.pyplot as plt
import numpy as np
subhdu = fits.open('test_subim.fits')[0]
subhdu = subhdu.data
fig = plt.figure(1, figsize = (30,30))
ax = fig.add_axes([0.1,0.7,0.5,0.2])
xr = np.arange(0, subhdu.shape[1], 1)
yr = np.arange(0, subhdu.shape[0], 1)
xx, yy = np.meshgrid(xr,yr)
dx, dy = np.gradient(subhdu.astype('float'))
im = ax.imshow(subhdu,origin='lower',cmap='bwr')
ax.quiver(xx,yy,dx,dy,scale=5,angles="uv",headwidth = 5)
fig.colorbar(im,pad=0)
ax.xaxis.set_ticks([])
ax.yaxis.set_ticks([])
我对生成的地图有两点感到困惑:
如果有人能帮助我弄清我的困惑,我将不胜感激。如果您想使用我的数据'test_subim.fits'
,请访问my google drive。在播放之前,您可能必须通过以下命令astropy
安装软件包pip install astropy
。
非常感谢您能帮助我的人。
答案 0 :(得分:1)
1)因为“白色部分”不在山顶,所以它变成了蓝色->白色->红色,正如您在右侧栏中看到的那样。因此,蓝色是山谷,红色是山脉,箭头指向上坡的地方。
2)地图的边缘没有进行梯度计算,因为梯度是针对整个邻域计算的。坡度是表面相对于周围周围所有物体变化的量度,即,它指向相对于整个邻居而言最陡峭的上升。如果缺少某些周围的东西(例如边缘),则无法计算。
从数学上来说,边缘的函数是不可微的,因此无法计算梯度。
编辑:让我们更深入:
梯度不仅是两点之间的差。它是局部测量该空间上表面的多少的度量。让我们看一个五乘五的例子。我们将计算中间点的梯度。它指向最陡峭的方向,如果您在山上行走,则仅需迈出一步即可将您带到最高的方向。您怎么知道这个方向,看所有方向-假设1°,2°..... 360°-(我在这里开了一些数学角,但是现在不重要了),迈出一步,看看如何赢得了很多高度,然后又回到起始位置。使您到达最高点的方向是渐变的方向。您所赢得的高度取决于梯度的大小(箭头的长度)。
现在,假设您站在顶部(在2D视图中位于左上方的像素),并且您想在每个方向上都迈出一步。左下,没问题,右下,没问题,但右上和左上?那里没有像素???现在我该怎么做?这就是为什么没有渐变的原因。
假设我们将地形从左侧图像更改为右侧图像中的地形。然后,渐变将指向(现在是两个)最高像素之间的方向。