Image 如何使用空间遮罩限制光栅处理范围?
我试图将MATLAB中的光栅处理限制为仅包含shapefile边界内的区域,类似于ArcGIS Spatial Analyst函数使用图形的方式。以下是我正在处理的一些(可复制的)样本数据:Image 如何使用空间遮罩限制光栅处理范围?,image,matlab,image-processing,shapefile,arcpy,Image,Matlab,Image Processing,Shapefile,Arcpy,我试图将MATLAB中的光栅处理限制为仅包含shapefile边界内的区域,类似于ArcGIS Spatial Analyst函数使用图形的方式。以下是我正在处理的一些(可复制的)样本数据: A(警告169MB下载) A(文件滴管上的压缩形状文件) 下面是我用来计算的MATLAB脚本: 错误消息: Error using poly2mask Expected input number 1, X, to be finite. Error in poly2mask (line 49) val
- A(警告169MB下载)
- A(文件滴管上的压缩形状文件)
错误消息:
Error using poly2mask
Expected input number 1, X, to be finite.
Error in poly2mask (line 49)
validateattributes(x,{'double'},{'real','vector','finite'},mfilename,'X',1);
Error in createMask (line 13)
x = poly2mask(lat,lon, x, y)
这里有三个步骤,我将为此创建3个函数:
NDVI=comp_NDVI(nir,红色)
mask=comp\u mask(shape)
output=Combine\u NDVI\u mask(NDVI,mask)
comp\u ndvi()
的代码。combine\u ndvi\u mask()
的代码取决于您要对遮罩区域执行的操作;如果要将其变为白色,可能会如下所示:
function output = combine_ndvi_mask(ndvi, mask)
output = ndvi;
output(~mask) = 255;
end
在comp_mask()
中,您需要使用poly2mask()
将多边形顶点转换为光栅遮罩。为了帮你,我需要知道你已经得到了什么。你把顶点加载到MATLAB中了吗?您使用poly2mask做了哪些尝试?
您可以通过以下方式读取感兴趣区域:
roi=shaperead('study_area_shapefile/studyArea.shp');
切掉尾随的字母:
rx=roi.X(1:end-1);
ry=roi.Y(1:end-1);
如果您的shapefile中有多个多边形,它们由NaN分隔,您必须将它们分开处理
然后从sat图像的空间参考中使用WorldToIntrisic方法将多边形点转换为图像坐标:
[ix,iy]=R.worldtointrisic(rx,ry);
这假定两个坐标系相同
然后你可以通过以下方式制作面具:
mask=poly2mask(ix,iy,R.RasterSize(1),R.RasterSize(2));
在进行任何计算之前,可以通过以下方式在原始多层图像上使用遮罩:
I(repmat(~mask[1,1,4])=nan;
或通过以下方式在单层(即红色)上使用:
red(~mask)=nan;
如果区域非常小,则将遮罩图像转换为稀疏矩阵可能是有益的(对于内存和计算能力而言)。我没有试过,如果这有什么不同的速度
red(~mask)=0;
sred=稀疏(双色(红色));
不幸的是,稀疏矩阵只能使用双精度矩阵,因此在转换之前需要使用uint8
通常,您应该从图像中裁剪出ROI。查看对象“roi”和“R”以找到有用的参数和方法。我没有在这里做过
最后是我的脚本版本,还有一些轻微的其他更改:
文件='doi1m2011_41111h4nw_usda.tif';
[I R]=geotiffread(文件);
outputdir='';
%读取感兴趣区域
roi=形状READ(“研究区域形状文件/studyArea.shp”);
%从shapefile中删除尾部nan
rx=roi.X(1:end-1);
ry=roi.Y(1:end-1);
%转换为图像坐标
[ix,iy]=R.worldtointrisic(rx,ry);
%做面具
掩模=poly2mask(ix,iy,R.光栅尺寸(1),R.光栅尺寸(2));
%掩蔽卫星图像
I(repmat(~mask[1,1,4]))=0;
%转换为稀疏矩阵
NIR=稀疏(双(I(:,:,4));
红色=稀疏(双(I(:,:,1));
%计算NDVI
ndvi=(近红外-红色)。/(近红外+红色);
%转换回完整矩阵
ndvi=满(ndvi);
imshow(ndvi,'DisplayRange',[-11]);
%拉伸到0-255并转换为8位无符号整数
ndvi=(ndvi+1)/2*255;%[-1 1] -> [0 255]
ndvi=uint8(ndvi);%将数据类型从double更改为uint8
%将NDVI写入.tif文件(可选)
tiffdata=geotiffinfo(文件);
outfilename=[outputdir'ndvi_u''温度'.tif'];
geotiffwrite(outfilename,ndvi,R,'GeoKeyDirectoryTag',tiffdata.GeoTIFFTags.GeoKeyDirectoryTag);
地图显示(出口名称);
这取决于处理过程。例如,什么样的函数?@chappjc我工作流程中的两个处理步骤包括计算NDVI和运行图像过滤器(imfilter())来计算%的树冠覆盖率。谢谢。我更新了我的原始问题,将使用poly2mask()
失败的尝试包括在内。知道我哪里出了问题吗?我明白了。因此,您需要将多边形顶点转换为光栅坐标并使用poly2mask,或者将光栅坐标转换为lat和lon并使用inpolygon。不幸的是,我没有映射工具箱,因此我无法进一步帮助您。如果尚未完成,请使用探查器加快脚本速度。比你看到的慢。
Error using poly2mask
Expected input number 1, X, to be finite.
Error in poly2mask (line 49)
validateattributes(x,{'double'},{'real','vector','finite'},mfilename,'X',1);
Error in createMask (line 13)
x = poly2mask(lat,lon, x, y)
function output = combine_ndvi_mask(ndvi, mask)
output = ndvi;
output(~mask) = 255;
end