Как сделать правильную карту градиента, используя Numpy.gradient - PullRequest
0 голосов
/ 08 мая 2019

Я использовал 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([])

The resulting map with associated two questions

Меня смущает две вещи в моей получившейся карте:

  1. Почему градиенты в замаскированной области не указывают на зеленые стрелки;
  2. Почему на краях карты нет расчета градиента?

Буду признателен, если кто-нибудь поможет мне разобраться в моих заблуждениях. Если вы хотите поиграть с моими данными 'test_subim.fits', посетите мой гугл-диск . Перед воспроизведением вы должны установить пакет astropy, вероятно, с помощью следующей команды pip install astropy.

Большое спасибо заранее за всех, кто может мне помочь.

1 Ответ

1 голос
/ 08 мая 2019

1) Поскольку «белая часть» - это не вершина горы, она становится синей -> белой -> красной, как вы можете видеть на панели справа. Таким образом, синий цвет - это долина, а красный - горы, а стрелки указывают, где он находится в гору.

2) На краях карты нет градиента, потому что градиент рассчитывается относительно его полной окрестности. Градиент - это мера того, насколько поверхность меняется относительно всего, что вокруг нее , то есть оно указывает на самый крутой подъем по отношению ко всему соседству. Если некоторые из всего вокруг отсутствуют, как, например, по краям, вы не можете рассчитать это.

Более математически, ваша функция по краям не дифференцируема, поэтому вы не можете вычислить градиент.

РЕДАКТИРОВАТЬ: Давайте углубимся:

Градиент - это не просто разница между двумя точками. Это мера того, сколько поверхности находится в этом пространстве локально. Давайте рассмотрим пример пять на пять. Мы рассчитаем градиент для средней точки. Он указывает в самом крутом направлении, в котором, если бы вы шли по холму, вы поднялись бы на самый высокий уровень, сделав только один шаг. Откуда ты знаешь это направление, ты смотришь на все направления - скажем, 1 °, 2 °, .. 360 ° - (здесь я режу некоторые математические углы, но это не важно), сделай шаг, посмотри как На большую высоту вы выиграли, а затем вы возвращаетесь в исходное положение. Направление, которое привело вас к самой высокой точке, является направлением градиента. Сколько высоты вы выиграли, определяется размером градиента (какова длина стрелки).

Теперь предположим, что вы стоите сверху (это верхний левый пиксель в 2D-виде) и хотите сделать шаг в каждом направлении. Вниз налево, без проблем, вниз вправо, без проблем, но вверх вправо и вверх влево? Там нет пикселя там ??? Что мне теперь делать? Вот почему нет градиента.

Допустим, мы меняем ландшафт с левого изображения на ландшафт на правом изображении. Затем градиент будет указывать в направлении между - теперь двумя - самыми высокими пикселями.

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...