Концепция билинейной интерполяции путем доступа к двумерному массиву, подобному одномерному массиву

В двумерном массиве находятся пиксели файлов bmp. и его размер составляет ширину (3 * 65536) * высоту (3 * 65536), которую я масштабировал. Это вот так.

1   2   3   4 

5   6   7   8

9  10  11  12

Между 1 и 2 есть 2 отверстия, так как я увеличил исходный двумерный массив. (умножить на 3)

Я использую 1-й метод доступа, подобный массиву, подобный этому.

массив [у * ширина + х]

index
0 1 2 3 4 5 6 7 8 9...   
1     2     3     4    5    6    7    8    9    10    11    12
(this array is actually 2-d array and is scaled by multiplying 3)

теперь я могу залатать дыру, как это решение. В двойном цикле for в условии (j%3==1)

Image[i*width+j] = Image[i*width+(j-1)]*(1-1/3) + Image[i*width+(j+2)]*(1-2/3)

В другом условии ( j%3==2 )

Image[i*width+j] = Image[i*width+(j-2)]*(1-2/3) + Image[i*width+(j+1)]*(1-1/3)

Именно так я знаю, что могу залатать дыры, так называемая «билинейная интерполяция».

Я хочу быть уверенным в том, что знаю, прежде чем внедрять эту логику в свой код. Спасибо за чтение.


person jay    schedule 07.06.2016    source источник
comment
Вы можете реализовать его, а затем проверить, соответствует ли поведение ожидаемому, если нет, отлаживать :)   -  person Rakete1111    schedule 07.06.2016
comment
Просто помните: 1/3 равно 0 из-за целочисленного деления. Вы можете сделать свою (линейную) интерполяцию более явной: c = lerp(a, b, t); с a,b,c пикселями/компонентами цвета и t с плавающей запятой (в вашем случае (j % 3) / 3.0f).   -  person BeyelerStudios    schedule 07.06.2016


Ответы (1)


Двулинейная интерполяция требует либо 2 проходов линейной интерполяции (горизонтальной и вертикальной) на интерполируемый пиксель (ну, некоторые из них требуют только 1), либо требует до 4 исходных пикселей на интерполированный пиксель.

Между 1 и 2 есть два отверстия. Между 1 и 5 есть 2 отверстия. Между 1 и 6 есть 4 отверстия. Ваш код, как написано, может правильно исправлять дыры только между 1 и 2, а не другие дыры.

Кроме того, ваше деление является целочисленным делением и не делает того, что вы хотите.

Как правило, вам гораздо лучше написать функцию r=interpolate_between(a,b,x,y), которая выполняет интерполяцию между a и b на шаге x из y. Потом тестить и исправлять. Теперь масштабируйте изображение по горизонтали с его помощью и визуально проверьте, все ли правильно (особенно края!)

Теперь попробуйте использовать его для масштабирования только по вертикали.

Теперь сделайте как горизонтальные, так и вертикальные.

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

Сравните с двухлинейной шкалой. Оно должно отличаться только ошибкой округления.

На каждом из этих этапов у вас будет одна «новая» операция, которая может пойти не так, а предыдущий код уже проверен.

Написание всего сразу приведет к сложному коду с ошибками.

person Yakk - Adam Nevraumont    schedule 07.06.2016