MatLab基于给定的行列号范围读取遥感影像

本文介绍如何使用MatLab针对遥感影像的行列号范围进行切片读取,以解决大文件读取慢及内存不足的问题。通过对比geotiffread函数,展示自定义函数readTiff在效率上的优势。

问题背景

最近基于Matlab处理遥感数据时发现,遥感数据往往很大,直接基于matlab的geotiffread函数读取时,会将整景影像全部读取进内存中,消耗的时间较长,如果遥感数据过大,还会存在内存不足而读取失败的情况。因此,我打算写一个基于给的的行列号范围切片读取遥感影像的函数以解决这个问题。

function [inputRaster,R,info] = readTiff(inputRasterPath,rows,cols)
% readTiff 基于给定的行列号范围读取遥感影像
% inputRasterPath: 输入的遥感影像名称;
% rows:需要读取的遥感影像行号范围,如[1,100],读取第1到第100行;
% cols:需要读取的遥感影像行号范围,如[1,100],读取第1到第100列;
% 示例:inputRasterPath = ',/test.tif';
%           rows = [100,1000];
%           cols = [100,1000];
%           [raster,R,info]=readTiff(inputRasterPath,rows,cols);

% 获取原始遥感数据投影等信息
info = geotiffinfo(inputRasterPath);
% 判断给定的行列号上下限是否超出影像实际范围
if rows(1)>info.Height
     rows = [1,info.Height];
     disp('行号超出范围,读取原始影像全部行');
elseif rows(2)>info.Height
    rows = [rows(1),info.Height];
end

if cols(1)>info.Width  
    cols = [1,info.Width];
    disp('列号超出范围,读取原始影像全部列');
elseif cols(2)>info.Width
    cols = [cols(1),info.Width];
end
% 基于imread函数的读取指定范围的遥感影像
inputRaster = imread(inputRasterPath,'PixelRegion',{rows,cols});
R = info.SpatialRef;
% 判断原始影像是地理坐标还是投影坐标,matlab中地理坐标和投影坐标相关属性名有所不同
if contains(class(R),'Geo')  
    cellSize = R.CellExtentInLongitude;
    R.LatitudeLimits= [R.LatitudeLimits(2)-(rows(2)-1)*cellSize,R.LatitudeLimits(2)-(rows(1)-1)*cellSize]; 
    R.LongitudeLimits= [R.LongitudeLimits(1)+(cols(1)-1)*cellSize,R.LongitudeLimits(1)+(cols(2)-1)*cellSize]; 
else
    
    cellSize = R.CellExtentInWorldX;
    R.YWorldLimits= [R.YWorldLimits(2)-(rows(2))*cellSize,R.YWorldLimits(2)-(rows(1)-1)*cellSize]; 
    R.XWorldLimits= [R.XWorldLimits(1)+(cols(1)-1)*cellSize,R.XWorldLimits(1)+(cols(2))*cellSize]; 
end
R.RasterSize = [size(inputRaster,1),size(inputRaster,2)];
end

同geotiffread读取遥感影像(500:1500,500:1500)的速度对比

clc,clear;
inputRasterPath = 'test.tiff';
rows = [500,1500];
cols = [500,1500];
% result = zonal_statistic(a,b,type);
disp('readTiff读取(500:1500,500:1500)范围')
tic;
[result_,R_,info_] =readTiff(inputRasterPath,rows,cols);
toc;
disp('geotiffread读取原始影像')
tic;
[img,R] = geotiffread(inputRasterPath);
info = geotiffinfo(inputRasterPath);
result = img(rows(1):rows(2),cols(1):cols(2),:); 
toc;

可以看出,当原始数据较大时,geotiffread会花费较多的时间读取,而readTiff会节约较多时间。

 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值