我是这个论坛的新手,所以请耐心等待。 我一直在研究这个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
答案 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
来缩减X
和Y
。现在你只需要展平三个矩阵并将它们组合起来:
final = [X(:), Y(:), m(:)]
最后要保存为文件,我建议您在Matlab命令promt中键入help save
或help 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