Интерполяция массива

Прежде чем я начну, примите мои извинения за то, что я не математик и на самом деле не знаю правильных названий того, что я пытаюсь сделать... ;) Указатели на любые Буду очень признателен за пояснения на простом английском языке, которые могли бы помочь (поскольку я просто гуглю в данный момент, основываясь на том, что я думаюв решении можетбыть).

Если у меня есть многомерный массив исходных значений и я хочу масштабировать этот массив с коэффициентом n, я думаю, что мне нужно использовать ] Бикубическая интерполяцияБезусловно, верхнее правое изображение на этой странице представляет то, к чему я стремлюсь — создание градуированного потока значений между базовыми исходными точками данных на основе значений окружающих их соседей. Я полностью согласен с тем, что, не увеличивая объем данных, я не увеличиваю разрешение данных; просто размытие краев.

Что-то вроде выхода из этого;

Source grid

к этому (и далее);

Target grid

Переход по ссылке в статье Википедии дает мне (предполагаемый) пример реализациитого, к чему я стремлюсь, но если это произойдет, я боюсь, что в настоящее время я упустил логический скачок, чтобы добраться туда. . Когда я вызываю getValue(source, 0.5, 0.5) для BicubicInterpolator, что я получаю в ответ? Я подумал, что если я дам x/y, равный (0,0,0.0) Я бы вернул нижнее левое значение сетки, и если бы я посмотрел на (1,1), я бы получил верхнее правое, и любое значение между ними дало бы мне указанную позицию в интерполированной сетке.

double[][] source  = new double[][] {{1, 1, 1, 2}, {1, 2, 2, 3}, {1, 2, 2, 3}, {1, 1, 3, 3}};
BicubicInterpolator bi = new BicubicInterpolator();
for (double idx = 0; idx <= 1; idx += 0.1) {
  LOG.info("Result (" + String.format("%3.1f", idx) + ", " + String.format("%3.1f", idx) + ") : " + bi.getValue(source, idx, idx));         
}

Однако вывод для диагональной линии по моей исходной сетке:

Result (0.0, 0.0) : 2.0
Result (0.1, 0.1) : 2.08222625
Result (0.2, 0.2) : 2.128
Result (0.3, 0.3) : 2.13747125
Result (0.4, 0.4) : 2.11424
Result (0.5, 0.5) : 2.06640625
Result (0.6, 0.6) : 2.00672
Result (0.7, 0.7) : 1.9518312500000001
Result (0.8, 0.8) : 1.92064
Result (0.9, 0.9) : 1.93174625
Result (1.0, 1.0) : 2.0

Я запутался, потому что диагонали идут от 1 до 3 и от 1 до 2; ничего не происходит от 2 до 2 с очень небольшим (общим) изменением. Я совершенно неправильно понимаю вещи?


РЕДАКТИРОВАТЬ: Следуя предложению Питера расширить границы для анализа, сетка теперь может быть сгенерирована как быстрое масштабирование до матрицы 30x30;

Grid from Peter's answer

Теперь, когда происходящее обретает немного больше смысла, я вижу, что мне нужно рассмотреть несколько дополнительных моментов;

  • Контролируйте выброс (видно в середине сетки, где источник имеет блок из четырех ячеек со значением 2, но интерполированное значение достигает пика при 2,2).
  • Учитывайте пустые значения в исходной сетке и их рассматривают как пробелы, а не как ноль, чтобы они не искажали расчет.
  • Будьте готовы к тому, что вам скажут, что я выполняю дурацкую миссию и что нужно другое решение
  • Посмотрите, было ли это то, что заказчик думали, что на самом деле хотели, когда сказали «сделать его менее блочным»

5
задан Stu.C 13 March 2012 в 17:27
поделиться