数据掩膜的好用函数:
除了 poly2mask,MATLAB 中还有其他用于数据掩膜的函数,适用于不同场景:
-
roipoly:
• 交互式选择多边形区域并生成掩膜。适合需要手动选择区域的情况。
• 示例:
matlab
mask = roipoly(srtm);
-
createMask (与 drawrectangle、drawpolygon 等配合使用):
• 通过图形交互工具绘制形状(如矩形、多边形),然后生成掩膜。
• 示例:
matlab
h = drawpolygon('Position', [cols, rows]);
mask = createMask(h);
-
inpolygon :
• 直接检查点是否在多边形内,返回逻辑数组。适合处理非图像数据或需要更灵活的场景。
• 示例:
lon_grid, lat_grid = meshgrid(lon_range, lat_range);
mask = inpolygon(lon_grid, lat_grid, poly_lon, poly_lat);
-
boundarymask (Image Processing Toolbox):
• 从二值图像或分割结果中生成边界掩膜。
• 示例:
mask = boundarymask(segmented_image);
-
地理数据掩膜(Mapping Toolbox):
• 如果处理地理数据,可以使用 geocrop 或 geoclip 直接按地理坐标裁剪数据。
• 示例:
matlab
[cropped_data, cropped_R] = geocrop(srtm, R, latlim, lonlim);
其他注意事项:
• 如果多边形区域较大或数据分辨率较高,掩膜生成可能会消耗较多内存。可以尝试分块处理或优化多边形顶点数量。
• 对于全球或大范围数据,建议使用地理坐标系统(如 inpolygon)而非图像坐标系统(如 poly2mask),以避免投影变形的影响。
希望这些信息对你有帮助!
程序介绍
这段 MATLAB 代码主要用于从 SRTM(航天飞机雷达地形任务)的 GeoTIFF 数据中提取指定多边形区域的高程范围(最大值和最小值)。以下是代码的详细介绍:
代码功能说明:
-
读取数据:
• 使用 geotiffread 函数读取 GeoTIFF 格式的 SRTM 高程数据,返回高程矩阵 srtm 和空间参考对象 R。
• 将无效数据(如 -32768)替换为 NaN,以便后续计算时忽略这些值。
-
定义多边形区域:
• 通过经纬度坐标(poly_lon 和 poly_lat)定义一个四边形区域,用于提取该范围内的 SRTM 数据。
-
坐标转换:
• 使用 latlon2pix 函数将经纬度坐标转换为图像的行列索引(像素坐标),以便在图像中定位多边形区域。
-
生成掩膜:
• 使用 poly2mask 函数根据多边形坐标生成一个二值掩膜矩阵,标记出多边形区域内的像素(值为 1)和区域外的像素(值为 0)。
-
提取区域内高程值:
• 通过掩膜矩阵提取多边形区域内的 SRTM 高程值,存储在 srtm_region 中。
-
计算高程范围:
• 使用 max 和 min 函数计算区域内高程的最大值和最小值,忽略 NaN 值。
-
输出结果:
• 打印区域内的高程范围(最大值和最小值)。
main_process
matlab
% 1. 读取 SRTM GeoTIFF 数据
[srtm, R] = geotiffread('srtm_mosaic_asp-adj.tif'); % 替换为实际路径
% srtm = double(srtm); % 确保为 double 类型以便数值运算
% 若有 nodata 值(比如 -32768),将其设置为 NaN
srtm(srtm <= -32768) = NaN;
% 2. 定义四边形经纬度坐标(顺时针或逆时针)
% 示例:经纬度 [lon, lat]
poly_lon = [ 81.295004, 95.423861, 94.174992, 80.938984]; % 经度
poly_lat = [ 42.752665, 40.485906, 37.647841, 40.034679]; % 纬度
% 3. 将经纬度坐标转换为图像行列(像素索引)
[rows, cols] = latlon2pix(R, poly_lat, poly_lon); % R 是 spatial referencing object
% 4. 生成掩膜
mask = poly2mask(cols, rows, size(srtm,1), size(srtm,2));
% 5. 提取区域内像素值
srtm_region = srtm(mask);
% 6. 计算最大值和最小值(忽略 NaN)
max_val = max(srtm_region, [], 'omitnan');
min_val = min(srtm_region, [], 'omitnan');
% 7. 输出结果
fprintf('SRTM Elevation Range in Selected Area:\n');
fprintf(' Max Elevation: %.2f meters\n', max_val);
fprintf(' Min Elevation: %.2f meters\n', min_val);