Я пытаюсь ограничить растровую обработку в MATLAB, чтобы включить только области внутри границы шейп-файла, аналогично тому, как функции ArcGIS Spatial Analyst используют mask. Вот некоторые (воспроизводимые) выборка данных Я работаю с:Как ограничить размер растровой обработки с помощью пространственной маски?
- 4-band NAIP image (ВНИМАНИЕ 169MB скачать)
- shapefile of study area boundaries (заархивированный шейпфайл на File Dropper)
Вот скрипт MATLAB Я использую для расчета NDVI:
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 raster calculator (Float (Band4-Band1)/Float (Band4 + Band1)) для создания NDVI справа. Я также указал форма формы области исследования как mask in the environment settings.
Вопрос:
Как можно ограничить степень растровой обработки в MATLAB, используя многоугольник шейп в качестве пространственной маски, чтобы повторить результаты, показанные на рисунке?
То, что я безуспешно пытался:
roipoly и poly2mask, хотя я не могу применить эти функции должным образом (с учетом их пространственные данные) для получения желаемого эффекта.
EDIT:
Я попытался следующие преобразовать шейп в маску, но безуспешно. Не знаете, где я неправильно здесь ...
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)
Это зависит от обработки. Какая функция, например? – chappjc
@chappjc. Два этапа обработки в моем рабочем процессе включают вычисление NDVI и запуск фильтра изображения (imfilter()) для расчета покрытия купола% дерева. – Borealis