В следующем коде показано, как выполнить билинейную интерполяцию с использованием INTERP2 :
A = [1 2; 3 4];
SCALE = 2;
xi = linspace(1,size(A,2),SCALE*size(A,2)); %# interpolated horizontal positions
yi = linspace(1,size(A,1),SCALE*size(A,1)); %# interpolated vertical positions
[X Y] = meshgrid(1:size(A,2),1:size(A,1)); %# pixels X-/Y-coords
[XI YI] = meshgrid(xi,yi); %# interpolated pixels X-/Y-coords
B = interp2(X,Y,A, XI,YI, '*linear'); %# interp values at these positions
результат согласуется с выводом кода Octave:
B =
1 1.3333 1.6667 2
1.6667 2 2.3333 2.6667
2.3333 2.6667 3 3.3333
3 3.3333 3.6667 4
Я должен отметить, что я получаю разные результаты между MATLAB и Octave IMRESIZE.Например, это то, что я получаю, когда выполняю следующее в MATLAB для матрицы A=[1 2; 3 4]
:
>> B = imresize([1 2; 3 4], 2, 'bilinear')
B =
1 1.25 1.75 2
1.5 1.75 2.25 2.5
2.5 2.75 3.25 3.5
3 3.25 3.75 4
, что говорит о том, что реализация MATLAB делает что-то дополнительное ... К сожалению, нелегко прочитатьIMRESIZE исходный код, особенно потому, что в какой-то момент он вызывает MEX-скомпилированную функцию (без формы исходного кода).
В качестве примечания, похоже, есть и более старая версия этой функции: IMRESIZE_OLD(чисто реализовано в м-коде).Из того, что я мог понять, он выполняет своего рода аффинное преобразование изображения.Возможно, кто-то, более знакомый с техникой, мог бы пролить свет на эту тему ...