Как выполнить быстрый наклон текстуры Catmull-Rom с помощью линейной интерполяции?

Я прочитал несколько статей, в которых представлена ​​быстрая интерполяция третьего порядка с использованием GL_LINEAR.

Поскольку [1] содержит много ошибок, я рекомендую прочитать [2], если вы хотите уловить формализм.

Оба они упоминают ограничение этого метода. Для отфильтрованной текстуры с GL_LINEAR следующее соотношение сохраняется, только если 0 <= b/(a ​​+ b) <= 1

a * f (i, j) + b * f (i + 1, j) = F (i + b / (a ​​+b), j)

где f - исходные данные изображения, а F - линейно интерполированная текстура с помощью OpenGL.

Здесь проблема. [1] упоминает, что этот метод также может быть применен к бикубической системе Catmull-Rom.

метод также может быть адаптирован к интерполяционным фильтрам, таким как сплайны Катмулла-Рома

Однако очевидно, что с весовой функцией Catmull-Rom, которая содержит отрицательные части, условие (0 <= b/(a ​​+b) <= 1) не может быть выполнено полностью. На самом деле, я пытался реализовать Catmull-Rom с той же логикой, он выдает только размытые изображения.

Есть ли особый способ применить метод из [1] и [2] к интерполяции Катмулла-Рома? Или я должен получить все 16 текселей для Catmull-Rom?

1 ответ

Решение

Я думаю, что статья Сигга и Хадвигера верна.

Catmull-Rom полином p(t) можно записать как

p(t) = 0.5 [ w0(t) * p0 + w1(t) * p1 + w2(t) * p2 + w3(t) * p3]

где

w0(t) = -t + 2*t^2 - t^3;
w1(t) = 2 - 5*t^2 + 3*t^3;
w2(t) = t + 4*t^2 - 3*t^3;
w3(t) = -t^2 + t^3;

а также p0, p1, p2, p3 являются выборочными значениями функций.

Для B-сплайна вы группируете первые два слагаемых, а именно w0(t) * p0 а также w1(t) * p1 и вторые два термина, а именно w2(t) * p2 а также w3(t) * p3, Для сплайна Catmull-Rom вы группируете w0(t) * p0 а также w3(t) * p3 а также w1(t) * p1 а также w2(t) * p2, Даже с помощью графика Матлаба легко проверить, что условие b/(a+b) доволен этим выбором. Таким образом, идея может быть использована и в интерполяции Катмулла-Рома. Однако для случая Кэтмулла-Рома мне кажется, что нет возможности продлить последний шаг, поскольку ни (w0(t) + w3(t))/(w0(t) + w1(t) + w2(t) + w3(t)) ни (w1(t) + w2(t))/(w0(t) + w1(t) + w2(t) + w3(t)) соответствовать указанному вами условию.

Другие вопросы по тегам