Как применить векторное поле к изображению в 2D с помощью Python? - PullRequest
1 голос
/ 04 ноября 2019

Я генерирую два гауссовых случайных поля с библиотекой FyeldGenerator. Если они построены, это выглядит так:

from FyeldGenerator import generate_field
import matplotlib.pyplot as plt
import numpy as np

# Helper that generates power-law power spectrum
def Pkgen(n):
    def Pk(k):
        return np.power(k, -n)
    return Pk

# Draw samples from a normal distribution
def distrib(shape):
    a = np.random.normal(loc=0, scale=1, size=shape)
    b = np.random.normal(loc=0, scale=1, size=shape)
    return a + 1j * b

shape = (512, 512)

field_x = generate_field(distrib, Pkgen(3), shape)
field_y = generate_field(distrib, Pkgen(3), shape)

plt.imshow(field_x, cmap='seismic')
plt.show()
plt.imshow(field_y, cmap='seismic')

enter image description here

Затем я строю график с помощью matplotlib с quiver векторным полем.

enter image description here

Теперь я хотел бы применить к изображению случайных полей того же размера векторное поле. Я бы хотел, чтобы пиксель в точке (i, j) двигался в направлении (в 2D), что показано в функции колчана. Есть ли способ сделать это?

Это пример этой проблемы, выполненной на matlab, но в 3D:

Ссылка на stackoverflow: Применение векторного поля к изображению в matlab enter image description here

1 Ответ

1 голос
/ 06 ноября 2019

Я думаю, что вы ищете функцию переотображения в opencv . Как описано в ссылке, функция переназначает значения на основе индексирования массивов mapx и mapy: ??? (x, y) = ??? (mapx (x, y), mapy (x, y))

ЕслиЯ правильно понял, что вы хотели бы сделать, для начала вам нужно создать базовые индексы для mapx и mapy:

mapx_base, mapy_base = np.meshgrid(np.arange(shape[0]), np.arange(shape[1]))

Затем деформировать индексы изображений с вашим векторным полем. Здесь я умножаюсь, чтобы увеличить деформацию.

mapx = mapx_base + field_x*30
mapy = mapy_base + field_y*30

Наконец, повторно сэмплируем ваше изображение

img = cv2.imread('apple.jpg', 0).astype(np.float32)
deformed_apple = cv2.remap(img, mapx.astype(np.float32), mapy.astype(np.float32), cv2.INTER_LINEAR)

Конечно, поле должно быть сглажено, если вы хотите иметь менее шумную деформацию.

Надеюсь, это поможет!

appleenter image description here

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