Интерполяция / масштабирование билинейных изображений-пример расчета
Я хотел бы спросить вас о некоторых деталях билинейной интерполяции / масштабирования. Предположим, что у нас есть такая матрица:
|100 | 50 |
|70 | 20 |
это изображение в оттенках серого 2 x 2. Теперь я хотел бы масштабировать его в два раза, и моя матрица выглядит так:
| 100 | f1 | 50 | f2 |
| f3 | f4 | f5 | f6 |
| 70 | f7 | 20 | f8 |
Итак, если мы хотим вычислить f4
, расчет определяется как
f1 = 100 + 0.5(50 - 100) = 75
f7 = 70 + 0.5(20 - 70) = 45
и наконец:
f4 = 75 + 0.5(45 - 75) = 60
однако я не могу понять, какие вычисления правильны для Ф3 или f1
делаем ли мы билинейное масштабирование в каждом направлении отдельно? Следовательно, это означало бы, что:
f3 = 100 + 0.5(70 - 100) = 85
f1 = 100 + 0.5(50 - 100) = 75
кроме того, как я должен относиться f2, f6, f8. Эти точки просто копируются, как в алгоритме ближайшего соседа?
1 ответов
я хотел бы указать вам на эту очень проницательную графику из Википедии, которая иллюстрирует, как сделать билинейную интерполяцию для одной точки:
источник: Википедия
как вы можете видеть, четыре красные точки чем знаменит. Эти моменты вы знаете перед рукой и P
это точка, которую мы хотим интерполировать. Таким образом, мы должны сделать два шага (как вы указали в ваших сообщениях.) Чтобы справиться с x
координата (горизонтальная), мы должны вычислить, что интерполированное значение является строкой мудрой для верхней строки красных точек и нижней строки красных точек. Это приводит к двум синим точкам R1
и R2
. Чтобы справиться с y
координата (вертикальная), мы используем две синие точки и интерполируем вертикально, чтобы получить окончательный P
точка.
при изменении размера изображения, даже если мы визуально не видим, что я собираюсь сказать, но представьте что это изображение 3D сигнала f
. Каждая точка в матрице на самом деле является 3D-координатой, где расположение столбца равно x
значением, расположение строки y
значение и z
значение-это значение количества / оттенков серого самой матрицы. Поэтому делаю z = f(x,y)
значение матрицы в точке (x,y)
в матрице. В нашем случае, поскольку вы имеете дело с изображениями, каждый стоимостью (x,y)
- целые числа, которые идут от 1 до строки / столбцы, как у нас, в зависимости от того, какое измерение вы смотрите.
поэтому, учитывая координату, которую вы хотите интерполировать в (x,y)
, и учитывая красные координаты на изображении выше, которые мы называем их x1,y1,x2,y2
в соответствии с диаграммой-в частности, с соглашением диаграммы и ссылкой на то, как доступны изображения:x1 = 1, x2 = 2, y1 = 2, y2 = 1
синий координатами R1
и R2
вычисляются с помощью столбца интерполяции 1D, используя одну и ту же строку, обе точки совпадают on:
R1 = f(x1,y1) + (x - x1)/(x2 - x1)*(f(x2,y1) - f(x1,y1))
R2 = f(x1,y2) + (x - x1)/(x2 - x1)*(f(x2,y2) - f(x1,y2))
важно отметить, что (x - x1) / (x2 - x1)
это вес / доля из того, сколько смеси выход состоит из двух значений, видимых в f(x1,y1)
и f(x2,y1)
на R1
или f(x1,y2)
и f(x2,y2)
на R2
. В частности, x1
является отправной точкой и (x2 - x1)
разница в x
значения. Вы можете проверить, что подстановка x1
as x
дает нам 0, а x2
as x
дает нам 1. Этот вес колеблется между [0,1]
который необходим для вычислений для работы.
следует отметить, что происхождение изображения находится в левом верхнем углу и так (1,1)
в левом верхнем углу. Как только вы найдете R1
и R2
можно найти P
путем интерполяции строки мудрый:
P = R2 + (y - y2)/(y2 - y1)*(R1 - R2)
опять (y - y2) / (y2 - y1)
обозначьте пропорцию / смесь того, сколько R1
и R2
свой вклад в конечный результат P
. Таким образом, вы из расчета f5
правильно, потому что вы использовали четыре известные точки: верхний левый-100, верхний правый-50, нижний левый-70 и нижний правый-20. В частности, если вы хотите вычислить f5
, это означает, что (x,y) = (1.5,1.5)
потому что мы на полпути между 100 и 50 из-за того, что вы масштабируете изображение на два. Если вы подключите эти значения к приведенному выше вычислению, вы получите значение 60, как и ожидалось. Веса для обоих вычислений также приведут к 0.5
, которым это то, что вы получили в своих расчетах, и это то, что мы ожидаем.
если вы вычисляете f1
, что соответствует (x,y) = (1.5,1)
и если вы подставите это в приведенное выше уравнение, вы увидите, что (y - y2)/(y2 - y1)
дает вам 0 или вес равен 0, и поэтому то, что вычисляется, просто R2
, соответствующий линейной интерполяции только по верхней строке. Аналогично, если мы вычислили f7
, это означает, что мы хотим интерполировать на (x,y) = (1.5,2)
. В этом случае, вы увидите, что (y - y2) / (y2 - y1)
is 1 или вес 1 и поэтому P = R2 + (R1 - R2)
, что упрощает до R1
и является линейной интерполяцией только по нижней строке.
теперь есть случай f3
и f5
. Оба они соответствуют (x,y) = (1,1.5)
и (x,y) = (2,1.5)
соответственно. Подставляя эти значения в R1
и R2
и P
для обоих случаев дайте:
f3
R1 = f(1,2) + (1 - 1)/(2 - 1)*(f(2,2) - f(1,2)) = f(1,2)
R2 = f(1,1) + (1 - 1)/(2 - 1)*(f(1,2) - f(1,1)) = f(1,1)
P = R1 + (1.5 - 1)*(R1 - R2) = f(1,2) + 0.5*(f(1,2) - f(1,1))
P = 70 + 0.5*(100 - 70) = 85
f5
R1 = f(1,2) + (2 - 1)/(2 - 1)*(f(2,2) - f(1,2)) = f(2,2)
R2 = f(1,1) + (2 - 1)/(2 - 1)*(f(1,2) - f(1,1)) = f(1,2)
P = R1 + (1.5 - 1)*(R1 - R2) = f(2,2) + 0.5*(f(2,2) - f(1,2))
P = 20 + 0.5*(50 - 20) = 35
так что это нам говорит? Это означает, что вы интерполируете только по y-направлению. Это очевидно, когда мы смотрим на P
. Более тщательное изучение расчетов P
для каждого f3
и f5
, вы видите, что мы рассматриваем значения только вдоль вертикального направления.
таким образом, если вы хотите однозначного ответа, f1
и f7
найдены путем интерполяции вдоль x
/ направление столбца только вдоль той же строки. f3
и f5
найдены путем интерполяции y
/ направление строки вдоль того же столбца. f4
использует смесь f1
и f7
для вычисления конечного значения, как вы уже видели.
чтобы ответить на ваш последний вопрос, f2
, f6
и f8
заполняется на основе личных предпочтений. Эти значения считаются за пределами, с x
и y
значения как 2.5
и это вне нашего [1,2]
сетка для (x,y)
. В MATLAB реализация этого по умолчанию заключается в заполнении любых значений за пределами определенных границ, чтобы быть не-числом (NaN
), но иногда люди экстраполируют с помощью линейной интерполяции, копируют значения границ или выполняют некоторые сложные дополнения, такие как симметричное или круговое заполнение. Это зависит от того, в какой ситуации вы находитесь, но нет правильного и окончательного ответа о том, как заполнить f2
, f6
и f8
- все зависит от вашего приложения и то, что делает самое разумное для тебя.
в качестве бонуса мы можем проверить правильность моих вычислений в MATLAB. Сначала определим сетку (x,y)
точки в [1,2]
диапазон, затем измените размер изображения так, чтобы оно было в два раза больше, где мы указываем разрешение 0,5 на точку, а не 1. Я собираюсь назвать вашу определенную матрицу A
:
A = [100 50; 70 20]; %// Define original matrix
[X,Y] = meshgrid(1:2,1:2); %// Define original grid of points
[X2,Y2] = meshgrid(1:0.5:2.5,1:0.5:2.5) %// Define expanded grid of points
B = interp2(X,Y,A,X2,Y2,'linear'); %// Perform bilinear interpolation
оригинал (x,y)
сеть точек выглядит так:
>> X
X =
1 2
1 2
>> Y
Y =
1 1
2 2
расширенная сетка для расширения размер матрицы в два раза больше выглядит как:
>> X2
X2 =
1.0000 1.5000 2.0000 2.5000
1.0000 1.5000 2.0000 2.5000
1.0000 1.5000 2.0000 2.5000
1.0000 1.5000 2.0000 2.5000
>> Y2
Y2 =
1.0000 1.0000 1.0000 1.0000
1.5000 1.5000 1.5000 1.5000
2.0000 2.0000 2.0000 2.0000
2.5000 2.5000 2.5000 2.5000
B
вывод с помощью X
и Y
в качестве исходной сетки точек и X2
и Y2
- это точки, которые мы хотим интерполировать.
получаем:
>> B
B =
100 75 50 NaN
85 60 35 NaN
70 45 20 NaN
NaN NaN NaN NaN