Как построить векторное поле на изображении? - PullRequest
1 голос
/ 12 апреля 2019

Чтобы визуально понять вовлеченный вектор, скалярные поля операции с изображением, которая включает в себя вычисление, градиент, расхождение, лапласиан и т. Д., Я пытаюсь нанести их также на вовлеченное изображение. Я начал с градиента, как показано ниже, но

  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

Образец используемого изображения: ссылка

Примечание: я сначала использовал png, затем альфа-область давала nan, так что теперь я загрузил jpg.

1 Ответ

0 голосов
/ 14 апреля 2019

Краткий ответ: np.mgrid() дает вам транспонированную (то есть повернутую) матрицу, см., Например, эту статью .

Далее я использую matplotlib.image загрузить изображение (которое я сначала преобразовал обратно в .png).Я сглаживаю изображение (т.е. удаляю альфа-канал) и использую imshow с подходящей цветовой картой ("Greys_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()

Результирующее изображение (однако с цветовой картой viridis)кажется, делать то, что вы хотите.Image with quiver

...