Билинейная и бикубическая интерполяция 2D-матрицы в matlab

Я пытаюсь применить билинейную и бикубическую интерполяцию к моему набору данных, который хранится в текстовых файлах. Эти текстовые файлы находятся в папке и называются от output_00.text до output_23.text. Каждый текстовый файл состоит из трех столбцов. Первый - это широта, второй - долгота, а третий столбец - значение температуры на этой широте и долготе (положение над землей).

Столбец температуры содержит -9999,000, а не число или NaN. Это значение NaN появляется для случайных строк в каждом файле.

Я хочу интерполировать эти значения NaN с помощью техники билинейной / бикубической интерполяции. Этот код будет читать каждый текстовый файл и интерполировать его с помощью билинейного метода и сохранять его с помощью method_00.text.

Мой единственный текстовый файл выглядит так

21.500  60.500  295.867
21.500  61.500  295.828
21.500  62.500  295.828
21.500  63.500  295.867
21.500  64.500  296.102
21.500  65.500  296.234
21.500  66.500  296.352
21.500  67.500  296.336
21.500  68.500  296.305
21.500  69.500  298.281
21.500  70.500  301.828
21.500  71.500  302.094
21.500  72.500  299.469
21.500  73.500  301.711
21.500  74.500  -9999.000
21.500  75.500  -9999.000
21.500  76.500  -9999.000
21.500  77.500  -9999.000
21.500  78.500  -9999.000
22.500  60.500  295.477
22.500  61.500  295.484
22.500  62.500  295.516
22.500  63.500  295.547
22.500  64.500  295.852
22.500  65.500  295.859
22.500  66.500  295.852
22.500  67.500  295.711
22.500  68.500  295.969
22.500  69.500  298.562
22.500  70.500  300.828
22.500  71.500  302.352
22.500  72.500  300.570
22.500  73.500  301.383
22.500  74.500  -9999.000
22.500  75.500  -9999.000
22.500  76.500  -9999.000
22.500  77.500  -9999.000
22.500  78.500  -9999.000
23.500  60.500  294.906
23.500  61.500  294.898
23.500  62.500  295.000
23.500  63.500  295.078
23.500  64.500  295.297
23.500  65.500  295.359
23.500  66.500  295.297
23.500  67.500  295.312
23.500  68.500  296.664
23.500  69.500  298.781
23.500  70.500  299.211
23.500  71.500  300.109
23.500  72.500  301.000
23.500  73.500  301.594
23.500  74.500  302.000
23.500  75.500  -9999.000
23.500  76.500  -9999.000
23.500  77.500  -9999.000
23.500  78.500  -9999.000
24.500  60.500  294.578
24.500  61.500  294.516
24.500  62.500  294.734
24.500  63.500  294.789
24.500  64.500  294.844
24.500  65.500  294.562
24.500  66.500  294.734
24.500  67.500  296.367
24.500  68.500  297.438
24.500  69.500  298.531
24.500  70.500  298.453
24.500  71.500  299.195
24.500  72.500  300.062
24.500  73.500  -9999.000
24.500  74.500  -9999.000
24.500  75.500  -9999.000
24.500  76.500  -9999.000
24.500  77.500  -9999.000
24.500  78.500  -9999.000
25.500  60.500  296.258
25.500  61.500  296.391
25.500  62.500  296.672
25.500  63.500  296.398
25.500  64.500  295.773
25.500  65.500  295.812
25.500  66.500  296.609
25.500  67.500  297.977
25.500  68.500  297.109
25.500  69.500  297.828
25.500  70.500  298.430
25.500  71.500  298.836
25.500  72.500  298.703
25.500  73.500  -9999.000
25.500  74.500  -9999.000
25.500  75.500  -9999.000
25.500  76.500  -9999.000
25.500  77.500  -9999.000
25.500  78.500  299.023
26.500  60.500  -9999.000
26.500  61.500  298.266
26.500  62.500  296.773
26.500  63.500  -9999.000
26.500  64.500  -9999.000
26.500  65.500  -9999.000
26.500  66.500  297.250
26.500  67.500  296.188
26.500  68.500  295.938
26.500  69.500  296.906
26.500  70.500  297.828
26.500  71.500  299.312
26.500  72.500  299.359
26.500  73.500  -9999.000
26.500  74.500  -9999.000
26.500  75.500  -9999.000
26.500  76.500  -9999.000
26.500  77.500  298.875
26.500  78.500  296.773
27.500  60.500  -9999.000
27.500  61.500  -9999.000
27.500  62.500  -9999.000
27.500  63.500  -9999.000
27.500  64.500  -9999.000
27.500  65.500  -9999.000
27.500  66.500  -9999.000
27.500  67.500  295.352
27.500  68.500  295.148
27.500  69.500  295.750
27.500  70.500  295.750
27.500  71.500  296.070
27.500  72.500  295.227
27.500  73.500  -9999.000
27.500  74.500  -9999.000
27.500  75.500  -9999.000
27.500  76.500  -9999.000
27.500  77.500  -9999.000
27.500  78.500  296.609
28.500  60.500  -9999.000
28.500  61.500  -9999.000
28.500  62.500  -9999.000
28.500  63.500  -9999.000
28.500  64.500  -9999.000
28.500  65.500  -9999.000
28.500  66.500  -9999.000
28.500  67.500  295.773
28.500  68.500  295.375
28.500  69.500  295.438
28.500  70.500  294.664
28.500  71.500  294.906
28.500  72.500  294.812
28.500  73.500  295.805
28.500  74.500  -9999.000
28.500  75.500  -9999.000
28.500  76.500  -9999.000
28.500  77.500  -9999.000
28.500  78.500  -9999.000
29.500  60.500  -9999.000
29.500  61.500  -9999.000
29.500  62.500  -9999.000
29.500  63.500  -9999.000
29.500  64.500  -9999.000
29.500  65.500  -9999.000
29.500  66.500  -9999.000
29.500  67.500  295.719
29.500  68.500  296.797
29.500  69.500  293.375
29.500  70.500  294.305
29.500  71.500  294.070
29.500  72.500  293.750
29.500  73.500  295.539
29.500  74.500  -9999.000
29.500  75.500  -9999.000
29.500  76.500  -9999.000
29.500  77.500  -9999.000
29.500  78.500  -9999.000
30.500  60.500  -9999.000
30.500  61.500  -9999.000
30.500  62.500  -9999.000
30.500  63.500  -9999.000
30.500  64.500  -9999.000
30.500  65.500  -9999.000
30.500  66.500  -9999.000
30.500  67.500  -9999.000
30.500  68.500  -9999.000
30.500  69.500  -9999.000
30.500  70.500  293.320
30.500  71.500  292.930
30.500  72.500  293.570
30.500  73.500  294.648
30.500  74.500  295.383
30.500  75.500  -9999.000
30.500  76.500  -9999.000
30.500  77.500  -9999.000
30.500  78.500  -9999.000
31.500  60.500  -9999.000
31.500  61.500  -9999.000
31.500  62.500  -9999.000
31.500  63.500  -9999.000
31.500  64.500  -9999.000
31.500  65.500  -9999.000
31.500  66.500  -9999.000
31.500  67.500  -9999.000
31.500  68.500  -9999.000
31.500  69.500  -9999.000
31.500  70.500  293.992
31.500  71.500  293.422
31.500  72.500  294.438
31.500  73.500  294.141
31.500  74.500  -9999.000
31.500  75.500  -9999.000
31.500  76.500  -9999.000
31.500  77.500  -9999.000
31.500  78.500  -9999.000
32.500  60.500  -9999.000
32.500  61.500  -9999.000
32.500  62.500  -9999.000
32.500  63.500  -9999.000
32.500  64.500  -9999.000
32.500  65.500  -9999.000
32.500  66.500  -9999.000
32.500  67.500  -9999.000
32.500  68.500  -9999.000
32.500  69.500  -9999.000
32.500  70.500  -9999.000
32.500  71.500  294.312
32.500  72.500  294.812
32.500  73.500  -9999.000
32.500  74.500  -9999.000
32.500  75.500  -9999.000
32.500  76.500  -9999.000
32.500  77.500  -9999.000
32.500  78.500  -9999.000
33.500  60.500  -9999.000
33.500  61.500  -9999.000
33.500  62.500  -9999.000
33.500  63.500  -9999.000
33.500  64.500  -9999.000
33.500  65.500  -9999.000
33.500  66.500  -9999.000
33.500  67.500  -9999.000
33.500  68.500  -9999.000
33.500  69.500  -9999.000
33.500  70.500  -9999.000
33.500  71.500  -9999.000
33.500  72.500  -9999.000
33.500  73.500  -9999.000
33.500  74.500  -9999.000
33.500  75.500  -9999.000
33.500  76.500  -9999.000
33.500  77.500  -9999.000
33.500  78.500  -9999.000
34.500  60.500  -9999.000
34.500  61.500  -9999.000
34.500  62.500  -9999.000
34.500  63.500  -9999.000
34.500  64.500  -9999.000
34.500  65.500  -9999.000
34.500  66.500  -9999.000
34.500  67.500  -9999.000
34.500  68.500  -9999.000
34.500  69.500  -9999.000
34.500  70.500  -9999.000
34.500  71.500  -9999.000
34.500  72.500  -9999.000
34.500  73.500  -9999.000
34.500  74.500  -9999.000
34.500  75.500  -9999.000
34.500  76.500  -9999.000
34.500  77.500  -9999.000
34.500  78.500  -9999.000
35.500  60.500  -9999.000
35.500  61.500  -9999.000
35.500  62.500  -9999.000
35.500  63.500  -9999.000
35.500  64.500  -9999.000
35.500  65.500  -9999.000
35.500  66.500  -9999.000
35.500  67.500  -9999.000
35.500  68.500  -9999.000
35.500  69.500  -9999.000
35.500  70.500  -9999.000
35.500  71.500  -9999.000
35.500  72.500  -9999.000
35.500  73.500  -9999.000
35.500  74.500  -9999.000
35.500  75.500  -9999.000
35.500  76.500  -9999.000
35.500  77.500  -9999.000
35.500  78.500  -9999.000
36.500  60.500  276.742
36.500  61.500  274.406
36.500  62.500  -9999.000
36.500  63.500  -9999.000
36.500  64.500  -9999.000
36.500  65.500  272.219
36.500  66.500  273.023
36.500  67.500  275.875
36.500  68.500  -9999.000
36.500  69.500  -9999.000
36.500  70.500  -9999.000
36.500  71.500  -9999.000
36.500  72.500  -9999.000
36.500  73.500  -9999.000
36.500  74.500  -9999.000
36.500  75.500  -9999.000
36.500  76.500  -9999.000
36.500  77.500  -9999.000
36.500  78.500  -9999.000
37.500  60.500  277.406
37.500  61.500  277.547
37.500  62.500  276.375
37.500  63.500  275.484
37.500  64.500  276.820
37.500  65.500  275.312
37.500  66.500  274.875
37.500  67.500  275.875
37.500  68.500  -9999.000
37.500  69.500  -9999.000
37.500  70.500  -9999.000
37.500  71.500  -9999.000
37.500  72.500  -9999.000
37.500  73.500  -9999.000
37.500  74.500  -9999.000
37.500  75.500  -9999.000
37.500  76.500  -9999.000
37.500  77.500  -9999.000
37.500  78.500  -9999.000

В Google я нашел инструмент для билинейной интерполяции изображения или матрицы. На время встряхните этот код можно изменить в соответствии с моими требованиями. Но как?

function interVal=interpImg(img,yx,zpad)
% BiLinear interpolation using 4 pixels around the target location with ceil convention
% RGB = 1 for gray scale images.
% img can be a single layer matrix or a RGB layer colored image
% yx =[y_value, x_value]; It can be either horizontal or vertical vector
%
% zpad is a boolean variable. if true, zeros are used for pixel values
% outside of the given img. If false, the nearest edge value is repeated.
%
% Example:
% [m,n]=meshgrid(1:3);img=[m+n]
% --> 2     3     4
%     3     4     5
%     4     5     6
% interpImg(img,[2.4,2.2])
% --> 4.6
%
%                                   Disi A, Sep,16th,2013
%                                   [email protected]

if nargin<4,RGB=ndims(img);RGB(RGB<3)=1; end
if nargin<3,zpad=true; end

yx0=floor(yx);
wt=yx-yx0; wtConj=1-wt;
interTop=wtConj(2)*pixLookup(img,yx0(1),yx0(2),zpad,RGB)+wt(2)*pixLookup(img,yx0(1),yx(2),zpad,RGB);
interBtm=wtConj(2)*pixLookup(img,yx(1),yx0(2),zpad,RGB)+wt(2)*pixLookup(img,yx(1),yx(2),zpad,RGB);
interVal=wtConj(1)*interTop+wt(1)*interBtm;

end


function pixVal=pixLookup(img,y,x,zpad,RGB)
% This helper function looks up a pixel value from a given input image
% img is the input image (RGB or Grayscale)
% yx is the coordinate and repEdge tells the condition for pixel values out
% side of img (Use round up convention)
% For grayscale use RGB =1
if nargin<4,RGB=3;end

pixVal=zeros(1,1,RGB); %Initialize the pixel 

if nargin<3
    zpad=true; %pad with black pixels
end

if RGB==3
    [ROW,COL,~]=size(img);
else
    [ROW,COL]=size(img);
end
% If the pixel value is outside of image given
if (x<=0)||(x>COL)||(y<=0)||(y>ROW) 
    if zpad
        pixVal(:)=0;
    else
        y0=y;x0=x;
        y0(y0<1)=1; x0(x0<1)=1;
        y0(y0>ROW)=ROW;x0(x0>COL)=COL;
        pixVal=img(y0,x0,:);
    end
else
    pixVal=img(ceil(y),ceil(x),:);
end

end

. Ссылка на этот инструмент находится здесь http://www.mathworks.com/matlabcentral/fileexchange/43533-bilinear-interpolation-of-an-image-or-matrix


person Muhammad Usman Saleem    schedule 08.03.2016    source источник
comment
Бикубический и билинейный - разные методы, какой из них вы хотите? Исходя из вашего контекста, я бы предположил, что interp2 с linear интерполяцией - хороший выбор.   -  person Daniel    schedule 08.03.2016
comment
нет. Я хочу использовать билинейную интерполяцию. Matlab не имеет возможности выполнить это. Документация на mathworks.com/matlabcentral/ fileexchange / скажите мне, что билинейный режим занимает в среднем 4 балла. Я не хочу использовать interp2 или интерпол разброса данных. Я хочу использовать билинейную интерполяцию. Пожалуйста, ответьте на этот вопрос в этой связи   -  person Muhammad Usman Saleem    schedule 08.03.2016
comment
Я не сомневаюсь, что вы хотите, но ваше введение говорит, что билинейная / бикубическая интерполяция - это разные методы.   -  person Daniel    schedule 08.03.2016
comment
Документация сообщает мне mathworks.com/help/vision/ug/interpolation-methods .html, это разные методы, потому что у них другой способ интерполяции. Я хочу применить оба метода. Пожалуйста, помогите, если можете   -  person Muhammad Usman Saleem    schedule 08.03.2016


Ответы (1)


Вы захотите прочитать данные, определить все строки, в которых последний столбец неизвестен. Затем, используя «хорошие» точки данных, вы можете построить 2D-интерполянт (f(x,y)) для выборки в неизвестных точках.

Вам придется использовать griddata вместо _ 3_, поскольку ваши данные разрознены. Вы захотите использовать метод интерполяции linear ( дефолт).

Приведенный ниже код должен достичь этого результата.

% Read in data from file into an M x 3 matrix
fid = fopen('data.txt', 'rb');
data = textscan(fid, '%f %f %f');
data = cat(2, data{:});

% Find rows where third column is unknown
isUnknown = data(:,3) == -9999;
isKnown = ~isUnknown;

% Perform scattered interpolation AT unknown location USING known locations
newValues = griddata(data(isKnown,1), data(isKnown,2), data(isKnown,3), ...
                     data(isUnknown,1), data(isUnknown, 2), 'linear');

% Replace the unknown values with the interpolated values
data(isUnknown, 3) = newValues;

Если визуализировать это, мы увидим следующее.

введите описание изображения здесь

К сожалению, многие из ваших пустых значений данных на самом деле лежат вне диапазона данных, который вам известен. griddata заполнит их NaN. Чтобы заполнить их, вы не можете просто полагаться на интерполяцию, а скорее должны попытаться использовать экстраполяция.

Если вы действительно хотите сделать это (вместо того, чтобы оставлять их как NaN), вы захотите использовать _ 7_ с linear экстраполяцией < / а>.

interpolant = scatteredInterpolant(data(isKnown,1:2), data(isKnown,3), 'linear', 'linear');
newValues = interpolant(data(isUnknown,1:2));

data(isUnknown,3) = newValues;

Теперь вы можете видеть, что эти значения были экстраполированы.

введите описание изображения здесь

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

person Suever    schedule 08.03.2016
comment
спасибо за вашу любезную помощь. На самом деле я пробовал интерполировать 1 и интерполировать 2 для этих наборов данных. Но у меня не сеточная форма набора данных, а набор данных с разбросом. Вот почему я использую скатердатаинтерпол. Но это scaterdatainterpol только держать, линейный, естественный и ближайший метод интерполяции. Не выполняйте билинейную и бикубическую интерполяцию. Спасибо за любезный код. Но, пожалуйста, преобразуйте это в способ билинейной / бикубической интерполяции. - person Muhammad Usman Saleem; 08.03.2016
comment
@MuhammadUsmanSaleem: В ответе используется билинейная интерполяция. Би-просто означает 2-мерное. Если вы хотите бикубический, используйте параметр cubic вместо linear - person Daniel; 08.03.2016
comment
спасибо за ваш любезный ответ. Подскажите пожалуйста, держит ли scatteredinterpolant кубическую интерполяцию или нет? а линейная интерполяция в scattereinterpolant означает билинейную интерполяцию? - person Muhammad Usman Saleem; 08.03.2016
comment
@MuhammadUsmanSaleem Пожалуйста, прочтите документацию. Для scatteredInterpolant он поддерживает linear, но не кубический. Для griddata он поддерживает оба, но не поддерживает экстраполяцию. Вам нужно решить, что важно, поскольку у вас не может быть и того, и другого. - person Suever; 09.03.2016
comment
@Suever, спасибо за любезный ответ. Я хочу использовать метод интерполяции griddata. В моей папке 24 текстовых файла. Эти текстовые файлы имеют имена от output_00.text до output_23.text. Я хочу, чтобы этот код читал все эти файлы по отдельности и выполнял бикубическую и билинейную интерполяцию столбцов температуры (без изменения его широты и долготы) с использованием интерполяции данных сетки (также для экстраполяции), а затем сохранял этот интерполированный каждый текстовый файл с помощью method_00.text. Теперь после этого в моей папке будет 60 текстовых файлов, 48 файлов интерполяции и 24 исходных данных. Пожалуйста, измените этот код. - person Muhammad Usman Saleem; 09.03.2016
comment
Дорогая Сьювер, я хочу получить известие от вас? - person Muhammad Usman Saleem; 09.03.2016
comment
@MuhammadUsmanSaleem, это другой вопрос. Пожалуйста, опубликуйте его как таковой или найдите ТАК, как перебирать файлы в папке. Я считаю, что, поскольку этот ответ предоставил вам ваше решение, вы можете продолжить и отметить его как завершенное. - person Suever; 09.03.2016
comment
@Suver спасибо за ваш любезный ответ. Скажите, могу ли я применить метод интерполяции IDW и kringing к моему набору данных в Matlab? - person Muhammad Usman Saleem; 11.03.2016