2D-интерполяция в Python

1

Какова эквивалентная функция в Python функции MATLAB interp2?

VqR = interp2(rR, fx(:), fy(:));

Это код MATLAB, который я пытаюсь перенести на python

function res = imgMeshWarp( img, flowmap )
img = im2double(img);
rR = img(:, :, 1);
rG = img(:, :, 2);
rB = img(:, :, 3);
fx = flowmap(:, :, 1); fy = flowmap(:, :, 2);
VqR = interp2(rR, fx(:), fy(:));
VqG = interp2(rG, fx(:), fy(:));
VqB = interp2(rB, fx(:), fy(:));
res = cat(3, VqR, VqG, VqB);
res = reshape(res, size(flowmap, 1), size(flowmap, 2), []);    
end

РЕДАКТИРОВАТЬ 1: я использую NumPy. В коде Matlab img - это изображение, а блок-схема - это деформированная сетка. Я пытаюсь деформировать изображение с помощью блок-схемы.

РЕДАКТИРОВАТЬ 2: я добавляю код Python, переведенный из Matlab.

def image_warp(img, fm):
    img = img[:,:, ::-1]
    rR = img[:, :, 0]
    rG = img[:, :, 1]
    rB = img[:, :, 2]

    fx = fm[:, :, 0]
    fy = fm[:, :, 1]

    VqR = scipy.ndimage.map_coordinates(rR, [fx.ravel(), fy.ravel()], order=1, mode='constant', cval=np.nan).reshape(rR.shape)
    VqG = scipy.ndimage.map_coordinates(rG, [fx.ravel(), fy.ravel()], order=1, mode='constant', cval=np.nan).reshape(rG.shape)
    VqB = scipy.ndimage.map_coordinates(rB, [fx.ravel(), fy.ravel()], order=1, mode='constant', cval=np.nan).reshape(rB.shape)

    res = np.dstack((VqR, VqG, VqB))
    res = np.reshape(res, (fm.shape[0], fm.shape[1], -1))

Моя задача - деформировать изображение в соответствии со случайно деформированной сеткой деформации. Поэтому я сделал UV-картирование, чтобы текстурировать сетку. Flowmap - это отображение. Он генерируется следующим образом. У меня есть разреженное ультрафиолетовое отображение (например, вершина [0 0] в сетке соответствует пиксельным координатам [0 0] изображения, которое является верхним левым углом). Тогда вопрос в том, как выяснить все остальные пиксели в сетке. Для каждого четырехугольника (4 вершины) вы можете вычислить матрицу преобразования из этих вершин в изображение текстуры, решая задачу наименьших квадратов в однородных координатах. Затем для каждого пикселя в квадрате мы можем умножить его координаты на матрицу преобразования, чтобы найти координаты пикселя в изображении текстуры.

  • 0
    К какой версии Python это относится? Вы используете NumPy? Я предлагаю вам предоставить небольшую выборку входов и выходов в дополнение к упоминанию функции, которую вы хотите использовать.
  • 0
    @Dev-iL Dev-iL Я добавил редактирование.
Показать ещё 2 комментария
Теги:
interpolation
2d
code-translation

1 ответ

1

scipy.interpolate.interp2d - это то, что вы ищете. Настройка с этой функцией немного отличается. Для одного вам нужно определить ваши исходные координаты x, y. Кроме того, в зависимости от того, что flowmap представляет собой flowmap, вам, возможно, придется отрегулировать ее (хотя, похоже, она отлично подойдет). Может выглядеть примерно так для одного из ваших цветовых каналов:

from scipy import interpolate

dy, dx = rR.shape
f = interpolate.interp2d(np.arange(dx), np.arange(dy), rR)
VqR = f(new_x, new_y)
  • 0
    Я получаю сообщение об ошибке RuntimeError: Cannot produce output of size 95744x95744 (size too large) . Что такое new_x, new_y в вашем ответе?
  • 0
    То же, что ваш fx и fy вероятно. Я не знаю, что это за значения, но я предполагаю координаты x, y, для которых вы хотите вычислить интерполированные значения. Вам также придется их сгладить. В Python вы можете использовать fx.flatten() .

Ещё вопросы

Сообщество Overcoder
Наверх
Меню