如何使用空间掩模限制光栅处理范围?

2024-01-24

我试图将 MATLAB 中的栅格处理限制为仅包含 shapefile 边界内的区域,类似于 ArcGIS Spatial Analyst 函数使用mask http://resources.arcgis.com/en/help/main/10.2/index.html#//001w0000001t000000。这是我正在使用的一些(可重现的)示例数据:

  • A 4 波段 NAIP 图像 http://cloud.insideidaho.org/data/imageryBaseMapsEarthCover/orthoimagery/2011_1m_idaho/41/doi1m2011_41111h4nw_usda.tif(警告下载 169MB)
  • A 研究区域边界的shape文件 http://www.filedropper.com/studyareashapefile(File Dropper 上的压缩 shapefile)

这是我用来计算的 MATLAB 脚本NDVI http://resources.arcgis.com/en/help/main/10.2/index.html#/NDVI_function/009t00000052000000/:

file = 'C:\path\to\doi1m2011_41111h4nw_usda.tif';
[I R] = geotiffread(file);
outputdir = 'C:\output\'

% Calculate NDVI
NIR = im2single(I(:,:,4));
red = im2single(I(:,:,1));

ndvi = (NIR - red) ./ (NIR + red);
double(ndvi);
imshow(ndvi,'DisplayRange',[-1 1]);

% Stretch to 0 - 255 and convert to 8-bit unsigned integer
ndvi = floor((ndvi + 1) * 128); % [-1 1] -> [0 256]
ndvi(ndvi < 0) = 0;             % not really necessary, just in case & for symmetry
ndvi(ndvi > 255) = 255;         % in case the original value was exactly 1
ndvi = uint8(ndvi);             % change data type from double to uint8

% Write NDVI to .tif file (optional)
tiffdata = geotiffinfo(file);
outfilename = [outputdir 'ndvi_' 'temp' '.tif'];  
geotiffwrite(outfilename, ndvi, R, 'GeoKeyDirectoryTag', tiffdata.GeoTIFFTags.GeoKeyDirectoryTag) 

下图说明了我希望使用 MATLAB 完成的任务。对于这个例子,我使用了ArcGIS 栅格计算器 http://resources.arcgis.com/en/help/main/10.2/index.html#//009z000000z7000000(Float(Band 4-Band 1)/Float(Band 4+Band 1)) 生成右侧的 NDVI。我还将研究区域形状文件指定为环境设置中的掩码 http://resources.arcgis.com/en/help/main/10.2/index.html#//001w0000001t000000.

问题:

如何使用多边形 shapefile 作为空间掩码来限制 MATLAB 中的栅格处理范围以复制图中所示的结果?

我拥有的不成功 tried:

roipoly http://www.mathworks.com/help/images/ref/roipoly.html and 多聚二掩模 http://www.mathworks.com/help/images/ref/poly2mask.html,尽管我似乎无法正确应用这些函数(考虑到这些是空间数据)来产生所需的效果。

EDIT:

我尝试了以下方法将 shapefile 转换为蒙版,但没有成功。不知道我哪里出错了......

s = 'C:\path\to\studyArea.shp'

shp = shaperead(s)
lat = [shp.X];
lon = [shp.Y];

x = shp.BoundingBox(2) - shp.BoundingBox(1)
y = shp.BoundingBox(3) - shp.BoundingBox(1) 

x = poly2mask(lat,lon, x, y)

错误信息:

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)

您可以通过以下方式读取感兴趣的区域:

roi = shaperead('study_area_shapefile/studyArea.shp');

截掉尾随的 NaN:

rx = roi.X(1:end-1);
ry = roi.Y(1:end-1);

如果您的 shapefile 中有多个多边形,它们会被 NaN 分隔,您必须单独处理它们。

然后使用卫星图像空间参考中的 worldToIntrinsic 方法将多边形点转换为图像坐标:

[ix, iy] = R.worldToIntrinsic(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 = sparse(double(red));

不幸的是,稀疏矩阵只能使用双精度数,因此您的 uint8 需要先进行转换。

一般来说,您应该从图像中裁剪出 ROI。查看对象“roi”和“R”以查找有用的参数和方法。我这里没做过。

最后是我的脚本版本,还有一些细微的其他更改:

file = 'doi1m2011_41111h4nw_usda.tif';
[I R] = geotiffread(file);
outputdir = '';

% Read Region of Interest
roi = shaperead('study_area_shapefile/studyArea.shp');
% Remove trailing nan from shapefile
rx = roi.X(1:end-1);
ry = roi.Y(1:end-1);
% convert to image coordinates
[ix, iy] = R.worldToIntrinsic(rx,ry);
% make the mask
mask = poly2mask(ix,iy,R.RasterSize(1),R.RasterSize(2));
% mask sat-image
I(repmat(~mask,[1,1,4])) = 0;

% convert to sparse matrizes
NIR = sparse(double(I(:,:,4)));
red = sparse(double(I(:,:,1)));
% Calculate NDVI
ndvi = (NIR - red) ./ (NIR + red);
% convert back to full matrizes
ndvi = full(ndvi);
imshow(ndvi,'DisplayRange',[-1 1]);

% Stretch to 0 - 255 and convert to 8-bit unsigned integer
ndvi = (ndvi + 1) / 2 * 255; % [-1 1] -> [0 255]
ndvi = uint8(ndvi);          % change and round data type from double to uint8 

% Write NDVI to .tif file (optional)
tiffdata = geotiffinfo(file);
outfilename = [outputdir 'ndvi_' 'temp' '.tif'];  
geotiffwrite(outfilename, ndvi, R, 'GeoKeyDirectoryTag', tiffdata.GeoTIFFTags.GeoKeyDirectoryTag);
mapshow(outfilename);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用空间掩模限制光栅处理范围? 的相关文章

  • Matlab 编辑器不使用 emacs 快捷方式

    Is there some way I can make the matlab integrated editor not use emacs shortcut but use more normal shortcuts such that
  • opencv中矩阵的超快中值(与matlab一样快)

    我正在 openCV 中编写一些代码 想要找到一个非常大的矩阵数组 单通道灰度 浮点数 的中值 我尝试了几种方法 例如对数组进行排序 使用 std sort 和选择中间条目 但与 matlab 中的中值函数相比 它非常慢 准确地说 在 ma
  • 请推荐一个用于将 IPTC 数据写入图像的 Node 模块?

    我有一个 Node js 服务器 其工作是下载 JPEG 图像 将某些数据写入几个 IPTC 字段 例如Iptc Application2 Caption 并将图像传递给另一个服务 理想情况下 我想将 IPTC 数据写入内存缓冲区 而不将图
  • 如何以编程方式指定 MATLAB 编辑器键绑定

    我想将键盘键绑定设置为Windows 默认设置我想在启动时使用startup m因为我希望在大量系统上设置此设置 首选项对话框中的等效设置是 MATLAB gt Keyboard gt Shortcuts gt Active Setting
  • 具有相对 URL 的 CSS 图像有时相对于 IE 中的页面 URL

    我似乎发现 IE 有时会尝试使用相对 URL 加载 CSS 图像 相对于页面 url 而不是 CSS 文件 url 示例 有人加载此网址 https www main events com event 234 my awesome show
  • 在 Matlab 中快速加载大块二进制文件

    我有一些相当大的 int16 格式的数据文件 256 个通道 大约 75 1 亿个样本 每个文件约 40 50 GB 左右 它以平面二进制格式编写 因此结构类似于 CH1S1 CH2S1 CH3S1 CH256S1 CH1S2 CH2S2
  • MATLAB:比较两个不同长度的数组

    我有两个长度不同的数组 由于采样率不同 需要比较 我想对较大的数组进行下采样以匹配较小的数组的长度 但是该因子不是整数而是小数 举个例子 a 1 1 375 1 75 2 125 2 5 2 875 3 25 b 1 2 3 有什么方法可以
  • 提高 pytesseract 从图像中正确识别文本的能力

    我正在尝试使用读取验证码pytesseract模块 大多数时候它都能提供准确的文本 但并非总是如此 这是读取图像 操作图像以及从图像中提取文本的代码 import cv2 import numpy as np import pytesser
  • 如何将美国人口普查局的州级形状文件合并为全国性形状

    人口普查局不提供全国范围内公共使用微数据区域的形状文件 美国社区调查中可用的最小地理区域 我尝试用几种不同的方法将它们结合起来 但即使是消除重复标识符的方法一旦到达加利福尼亚州也会崩溃 我是在做一些愚蠢的事情还是需要一个困难的解决方法 下面
  • 如何在 Node.js 中将 HTML 转换为图像

    我需要在 Node 服务器上将 HTML 模板转换为图像 服务器将以字符串形式接收 HTML 我尝试过 PhantomJS 使用一个名为 Webshot 的库 但它不能很好地与 Flex 框和现代 CSS 配合使用 我尝试使用 Chrome
  • 使用 matplotlib 从 TeX 创建数学表达式的图像

    使用 python 库 matplotlib 我发现了这个问题的解决方案 在 PyQt 中 很好地 显示代数表达式 https stackoverflow com questions 14097463 displaying nicely a
  • 对图像使用 Pixellib 自定义训练时出现 input_image 元形状错误

    我正在使用 Pixellib 来训练自定义图像实例分割 我创建了一个数据集 可以在下面的链接中看到 数据集 https drive google com drive folders 1MjpDNZtzGRNxEtCDcTmrjUuB1ics
  • 在 MATLAB 中创建共享库

    一位研究人员在 MATLAB 中创建了一个小型仿真 我们希望其他人也能使用它 我的计划是进行模拟 清理一些东西并将其变成一组函数 然后我打算将其编译成C库并使用SWIG https en wikipedia org wiki SWIG创建一
  • MATLAB 图中轴标签与轴之间的距离

    我正在使用 MATLAB 绘制一些数据 我想调整轴标签与轴本身之间的距离 但是 只需向标签的 位置 属性添加一点即可使标签移出图窗窗口 是否有 保证金 属性或类似的东西 在上图中 我想增加数字和标签 Time s 之间的距离 同时自动扩展数
  • 调整回形针大小以适合矩形框

    我有一个矩形图像 例如 30x800 像素 如何用回形针缩放它以保留 100x100 像素图像的纵横比 并用边框填充空白区域 一个例子 http www imagemagick org Usage thumbnails pad extent
  • 使用 TCPDF PHP 库横向显示的图像

    我正在使用 TCPDF PHP 库生成包含照片的 PDF 文档 由于某种原因 某些照片在我的计算机和网络上正确显示 但当我将该图像放入 PDF 中时 它似乎是横向的 这只发生在某些图像上 大多数图像显示正确 下面是在 PDF 中横向显示的示
  • 减少1000张图片的HTTP请求?

    我知道这个问题可能听起来有点疯狂 但我想也许有人会想出一个聪明的主意 假设您在一个 HTML 页面上有 1000 个缩略图 图像大小约为5 10 kb 有没有办法在单个请求中加载所有图像 以某种方式将所有图像压缩到一个文件中 或者您对该主题
  • 如何在 Python 中将图像分割成多个部分

    我正在尝试使用 PIL 将一张照片分成多块 def crop Path input height width i k x y page im Image open input imgwidth im size 0 imgheight im
  • iOS - 基于设备的不同图像或缩放相同的图像?

    似乎开发人员总是为不同的设备创建不同的图像资源 并根据设备加载它们 但是 只为最高分辨率的设备 iPad 创建图像 然后为 iPhone 6 5 等缩小该图像 有什么缺点吗 我使用 SpriteKit 因此我只需创建不同大小的 SKSpri
  • 使用 SSL 的 Xamarin.Forms Image.Source

    我正在使用一个在线商店来存储通过我们的应用程序上传的用户图像 并受 SSL 保护 上传工作一切顺利 因为我使用的是带有附加证书的 WebClient 但是当我尝试使用 Xamarin Forms Image 组件时 例如将源设置为 http

随机推荐