重新采样矩阵并在单个Matrix中恢复

时间:2013-04-16 10:28:30

标签: matlab

我是这个论坛的新手,所以请耐心等待。 我一直在研究这个Matlab问题:

我有一个tif格式的数字高程模型(DEM)new_sub(x,y)。所以它是一个包含高度(x)的x-by-y矩阵。我希望以不同的分辨率重新采样这个DEM的部分,并在另一个矩阵中恢复它。到目前为止,我一直在使用for循环来改变DEM不同区域的分辨率,然后将结果写入xyz文件:

x y z 1 1 123 1 2 233 1 3 231 2 1 235 2 2 531 2 3 452

等等。 这是代码:

xmax = size(new_sub,2);
ymax = size(new_sub,1);

for k=1:200 % y
    for l=1:xmax % x
        fprintf(fid, '%d %d %d \n',l,xmax+1-k,new_sub(k,l));
    end
end

% 1:4
for k=200/2+1:size(new_sub,1)/2
    for l=1:size(new_sub,2)/2
        fprintf(fid, '%d %d %d \n',l*2,ymax+2-k*2,new_sub(k*2,l*2));
    end
end

这确实有效,但似乎相当复杂。此外,它不允许我将重采样区域存储在Matlab中的单个矩阵中。

是否有更有效的方法重新采样具有不同分辨率的Matrix的某些区域,将它们写入包含所有重采样区域的新Matrix,然后将其写入文件?我正在研究repmap,但想不出一个聪明的方法来使用它!

非常感谢您的帮助!

THEO

2 个答案:

答案 0 :(得分:1)

在Matlab中重新采样矩阵:

例如矩阵M

M = [1  2  3  4  5; 
     6  7  8  9  10; 
     11 12 13 14 15; 
     16 17 18 19 20; 
     21 22 23 24 25];

如果我们想在每个第n个像素上进行采样,就像这样简单:

m = M(1:n:end, 1:n:end)

所以n=2

m = 1  3  5
    11 13 15
    21 23 25

我建议您阅读indexing in matlab以及使用colon operator to create vectors in matlab

现在,为了获得您提到的“x y z”格式,首先使用meshgrid生成X和Y坐标矩阵。

[X, Y] = meshgrid(1:n:size(M,1), 1:n:size(M,2))

请注意,我使用n来缩减XY。现在你只需要展平三个矩阵并将它们组合起来:

final = [X(:), Y(:), m(:)]

最后要保存为文件,我建议您在Matlab命令promt中键入help savehelp dlmwrite,然后使用其中任何一个函数保存final

答案 1 :(得分:0)

对我来说,最简单的方法就是使用imresize。您可以将高程地图视为图像I.然后,您可以通过索引和重新缩放来剪切部分,如下所示:

I = imread('my.tiff'); % read
section = I(1:200, :); % cut the first 200 rows and all columns
sectionResized = imresize(section, [numrows numcols]) % resample
imwrite(sectionResized, 'mynew.tiff'); % save