【问题标题】:How make a correct gradient map using Numpy.gradient如何使用 Numpy.gradient 制作正确的渐变图
【发布时间】:2019-05-08 18:15:40
【问题描述】:

我使用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([])

我对结果地图的两件事感到困惑:

  1. 为什么蒙版区域中的渐变不指向绿色箭头;
  2. 为什么地图的边缘没有梯度计算?

如果有人能帮助我弄清楚我的困惑,我将不胜感激。如果你想玩我的数据'test_subim.fits',请访问my google drive。在播放之前,您必须安装包astropy,可能通过以下命令,pip install astropy

再次非常感谢任何可以帮助我的人。

【问题讨论】:

    标签: python numpy gradient


    【解决方案1】:

    1) 因为“白色部分”不是山顶,所以它是蓝色 -> 白色 -> 红色,您可以在右侧的栏中看到。所以蓝色是山谷,红色是山脉,箭头指向上坡。

    2) 地图的边缘没有梯度计算,因为梯度是相对于它的完整邻域计算的。梯度是衡量表面相对于周围的一切变化的程度,即它指向相对于整个邻域的最陡坡度。如果缺少一些它周围的所有东西,比如边缘,你就无法计算它。

    从数学上讲,你在边缘的函数是不可微的,所以你不能计算梯度。

    编辑:让我们更深入:

    梯度不仅仅是两点之间的差异。它是衡量该空间局部表面的多少。让我们看一个五乘五的例子。我们将计算中间点的梯度。它指向最陡峭的方向,如果您在山上行走,只需迈出一步即可将您带到最高的方向。你怎么知道这个方向,你看看所有的方向——比如说 1°、2°、.. 360°——(我在这里削减了一些数学上的角落,但现在这并不重要),迈出一步,看看如何你赢得了很多高度,然后你回到起始位置。使您到达最高点的方向是渐变的方向。您赢得的高度由渐变的大小(箭头的长度)决定。

    现在假设您站在顶部(在 2D 视图中是左上角的像素),并且您想朝各个方向迈出一步。左下,没问题,右下,没问题,但右上和左上?那里没有像素???现在我该怎么做?这就是为什么没有渐变。

    假设我们将地形从左侧图像更改为右侧图像中的地形。然后渐变将指向 - 现在是两个 - 最高像素之间的方向。

    【讨论】:

    • 非常感谢您提供有用的解释,@Frederik Bode。至于您的第 1 点,我同意黑色渐变箭头在绿色圆圈的遮罩区域中看起来不错,“如果蓝色是山谷,红色是山脉”。然而,这个假设似乎不能很好地解释黑色(渐变)箭头在右侧的一小部分区域中从相对深红色(即山)指向浅红色(可能下坡到山)蒙面的绿色圆圈。
    • 至于你的观点2,我认为你在理论上是完全正确的。但是,在实践中我仍然无法理解为什么图像边缘的某些像素具有梯度计算而其他像素没有。
    • 再次非常感谢@Frederik Bode 的进一步解释。总之,我知道地图边缘不应该有渐变,因为那里的功能不可微。对于边缘上的大多数像素都是如此,但是,我仍然很困惑为什么地图左侧边缘上的几个像素存在异常,即渐变出现在这些边缘像素上(见地图) .期待更多的cmets。非常感谢您。
    • 这与np.gradient的实现有关。图像中最好的例子是图像中的三个底部像素。从左到右,它们没有渐变 - 渐变 - 没有渐变。所以基本上,如果周围的所有像素都已知,如果像素是“墙”,即框的黑色边框,则可以计算梯度。在算法中,当朝着那个方向设置一步时,“那里没有像素?
    • 我现在该怎么办?”回答“我跳过这个方向”。这当然是一个任意选择。但是,算法只有在有“墙”时才会做出这个选择,而不是当像素具有未知值时(位于墙壁内的某处。如果是这种情况,算法会将梯度设置为零。如果您对您的答案感到满意,请将我的答案标记为正确。
    猜你喜欢
    • 2014-05-09
    • 1970-01-01
    • 2021-02-12
    • 1970-01-01
    • 1970-01-01
    • 2022-12-16
    • 2018-03-21
    • 2017-07-04
    • 1970-01-01
    相关资源
    最近更新 更多