Dum_spiro_spero:
Спасибо, так уже смогу понять.
> Взрослые незнакомые люди обычно обращаются к друг другу на "вы", если у них нет других договоренностей обусловленных средой общения.
Сам не заметил как напечатал. Не хотел давать такой оттенок фразе.
Удачи!
Dum_spiro_spero:
Ну болтать то я могу.
> Одномерный массив? Т.е. y1, y2, y3 ? Или все же x1,y1; x2,y2; ...?
Да. Массив - одна строка одного канала изображения. Или столбец.
Переменная X лежит в диапазоне [0; 1] и отображает расстояние от ближайшей предыдущей точки исходного изображения до точки которую нужно получить.
Новая длина или новая ширина - число точек получаемой строки.
Вот картинка для наглядности: rghost.ru/private/8Blkbgz7K/cf6badcb0b29f567f74197...
Собственно чтобы найти значение точки в произвольном месте в исходной строке находятся ближайший пиксель до этой точки (pixelValuePrev) и после нее (pixelValueNext), и X который показывает где находится искомая точка между ними.
Если просто подставить X в качестве ratio далее получится bilinear:
result = pixelValuePrev * (1 - ratio) + pixelValueNext * ratio;
Что бы получилось похоже на бикубик преобразую X по формуле:
ratio = Math.cbrt(2 * x - 1) / 2 + 0.5;
* Math.cbrt - корень кубический
* (2 * x - 1) - это преобразование диапазона X [0; 1] в [-1; 1]
* / 2 + 0.5 - наоборот [-1; 1] -> [0; 1]
В общем виде не знаю как, и не понимаю что там в твоей формуле Y что a0 a1 a3 и X
Dum_spiro_spero:
Спасибо, что пытаетесь помочь, но так мы будем разбираться еще долго.
Ладно:
Это javascript (никто не читает теги =).
Идея по моему интуитивно понятна
На вход: массив точек, новая длина и функция интерполяции. Выход: новый массив точек.
Цикл от 0 до новой длины вызывает функцию интерполяции с параметрами:
pixelValuePrev - округлить_в_меньшую_сторону (индекс итерации цикла * длина входного массива / новую ширину)
pixelValueNext - округлить_в_большую_сторону (индекс итерации цикла * длина входного массива / новую ширину)
x = индекс итерации цикла * длина входного массива / новую ширину - pixelValuePrev
Функция возвращает значение равное pixelValuePrev * (1 - коэффициент) + pixelValueNext * коэффициент
Коэффициент число от 0 до 1, равное корень_третьей_степени(2 * x - 1) / 2 + 0.5
Результат функции добавляется в конец выходного массива.
FanatPHP: Я постоянно лазию на блог, где все графики сделаны JPEG, а фото в PNG. Надавать бы им по башке. Как и вам, за jpeg который на графиках весит в десятки раз больше.
function returnAverageValue (x, pixelValuePrev, pixelValueNext) {
var ratio = Math.cbrt(2 * x - 1) / 2 + 0.5;
return pixelValuePrev * (1 - ratio) + pixelValueNext * ratio;
}
где x - координата между точками pixelValuePrev и pixelValueNext.
Это 'идея', в реальности код сложнее, с предрасчитанными значениями, функция принимает две координаты, 3 точки и жесткость, которую я чуть снизил чтобы график был более плавным, неразрывным.
Спасибо, так уже смогу понять.
> Взрослые незнакомые люди обычно обращаются к друг другу на "вы", если у них нет других договоренностей обусловленных средой общения.
Сам не заметил как напечатал. Не хотел давать такой оттенок фразе.
Удачи!