如何使用 Numpy.gradient 制作正确的渐变贴图
How make a correct gradient map using Numpy.gradient
我利用numpy.gradient
计算标量场图的梯度图。我想我不太了解 numpy.gradient
,所以我可能会生成不正确的渐变图。我 post 我的代码和生成的地图如下:
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
。
再次感谢任何能帮助我的人。
1) 因为 'white part' 不是山顶,所以它是蓝色 -> 白色 -> 红色,如您在右侧栏中所见。所以蓝色是山谷,红色是山脉,箭头指向的是上坡。
2) 地图的边缘没有梯度计算,因为梯度是相对于它的完整邻域计算的。梯度是衡量表面相对于它周围的一切变化的程度,即它指向相对于整个邻域的最陡峭的上升。如果某些它周围的所有东西都缺失了,比如在边缘,你就无法计算它。
从数学上讲,边缘处的函数不可微分,因此您无法计算梯度。
编辑:让我们更深入地探讨:
梯度不仅仅是两点之间的差异。它是衡量表面在 space 局部有多少的量度。让我们来看一个五乘五的例子。我们将计算中间点的梯度。它指向最陡峭的方向,如果你在山上行走,你只需要迈出一步就能爬到最高的方向。你怎么知道这个方向,你看看所有的方向 - 比如说 1°, 2°, .. 360° -(我在这里削减了一些数学角落,但现在这并不重要),走一步,看看如何你赢得多少高度,然后你回到起始位置。让你到达最高点的方向就是梯度的方向。你赢得多少高度由渐变的大小给出(箭头有多长)。
现在假设您站在顶部(在 2D 视图中是左上角的像素),并且您想朝每个方向迈出一步。左下没问题,右下没问题,但是右上和左上呢?那里没有像素???现在我该怎么做?这就是为什么没有渐变。
假设我们将地形从左图更改为右图的地形。然后梯度将指向 - 现在两个 - 最高像素之间的方向。
我利用numpy.gradient
计算标量场图的梯度图。我想我不太了解 numpy.gradient
,所以我可能会生成不正确的渐变图。我 post 我的代码和生成的地图如下:
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
。
再次感谢任何能帮助我的人。
1) 因为 'white part' 不是山顶,所以它是蓝色 -> 白色 -> 红色,如您在右侧栏中所见。所以蓝色是山谷,红色是山脉,箭头指向的是上坡。
2) 地图的边缘没有梯度计算,因为梯度是相对于它的完整邻域计算的。梯度是衡量表面相对于它周围的一切变化的程度,即它指向相对于整个邻域的最陡峭的上升。如果某些它周围的所有东西都缺失了,比如在边缘,你就无法计算它。
从数学上讲,边缘处的函数不可微分,因此您无法计算梯度。
编辑:让我们更深入地探讨:
梯度不仅仅是两点之间的差异。它是衡量表面在 space 局部有多少的量度。让我们来看一个五乘五的例子。我们将计算中间点的梯度。它指向最陡峭的方向,如果你在山上行走,你只需要迈出一步就能爬到最高的方向。你怎么知道这个方向,你看看所有的方向 - 比如说 1°, 2°, .. 360° -(我在这里削减了一些数学角落,但现在这并不重要),走一步,看看如何你赢得多少高度,然后你回到起始位置。让你到达最高点的方向就是梯度的方向。你赢得多少高度由渐变的大小给出(箭头有多长)。
现在假设您站在顶部(在 2D 视图中是左上角的像素),并且您想朝每个方向迈出一步。左下没问题,右下没问题,但是右上和左上呢?那里没有像素???现在我该怎么做?这就是为什么没有渐变。
假设我们将地形从左图更改为右图的地形。然后梯度将指向 - 现在两个 - 最高像素之间的方向。