Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image 如何使用空间遮罩限制光栅处理范围?_Image_Matlab_Image Processing_Shapefile_Arcpy - Fatal编程技术网

Image 如何使用空间遮罩限制光栅处理范围?

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

我试图将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)
validateattributes(x,{'double'},{'real','vector','finite'},mfilename,'X',1);

Error in createMask (line 13)
x = poly2mask(lat,lon, x, y)

这里有三个步骤,我将为此创建3个函数:

  • 计算完整输入图像的NDVI:
    NDVI=comp_NDVI(nir,红色)
  • 从shapefile计算掩码:
    mask=comp\u mask(shape)
  • 将NDVI和遮罩组合起来:
    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