Настройка NoData для многоканального растра?

10

У меня есть ортоизображение RGB с черной областью вместо NoData, как показано здесь: введите описание изображения здесь

Когда я использую инструмент SetNull, он удаляет черную область, но затем превращает ее в ортоизображение в оттенках серого, а это не то, что мне нужно.

введите описание изображения здесь

Я знаю, что есть способ обойти это, используя инструмент Clip (Data Management), чтобы обрезать растр, и там вы можете установить значение NoData равным значению черных ячеек (0). Тем не менее, я создаю семинар для студентов, и я хотел бы использовать менее противоречивый метод.

Конечно, есть возможность запустить инструмент NoData для каждой полосы в отдельности и затем объединить три полосы вместе, однако мне нужно иметь условие, где band1, band2 и band3 все равны 0, чтобы установить его как NoData. Возможность сделать это в ModelBuilder была бы идеальной, но также было бы неплохо создавать сценарии с использованием ArcPy.

Я использую ArcGIS 10.2 Desktop с расширенной лицензией.

Алекс МакВитти
источник
Вы говорите, что используете «ArcGIS 10.2 Pro», но приложение ArcGIS Pro было выпущено только с ArcGIS 10.3 for Desktop. Вы можете отредактировать свой вопрос, чтобы уточнить, что вы используете, пожалуйста?
PolyGeo
Мои извинения. Я использую ArcGIS 10.2 for Desktop с расширенной лицензией.
Алекс МакВитти
Спасибо, что задали этот вопрос. У меня есть клиенты, которые постоянно возвращаются ко мне, думая, что с их образами что-то не так.
Уэст

Ответы:

12

Вам нужно установить Raster Properties в скрипте или изменить его вручную в ArcCatalog. Это не создаст новый растр и даже не займет очень много времени.

В питоне это немного сложно:

import sys, os, arcpy

InFolder = sys.argv[1]
arcpy.env.workspace = InFolder

for Ras in arcpy.ListRasters():
    arcpy.AddMessage("Processing " + Ras)
    arcpy.SetRasterProperties_management(Ras,nodata="1 0;2 0;3 0")

Поскольку нодата находится далеко внизу списка, мне проще это указать; параметры: Band Value; Band Value; ... до тех пор, пока не будут рассмотрены все полосы. Если в одной и той же папке у вас больше (или меньше) полос, вам придется использовать arcpy.Describe и свойство bandCount, чтобы установить нулевое значение для правильного количества полос:

import sys, os, arcpy

InFolder = sys.argv[1]
arcpy.env.workspace = InFolder

for Ras in arcpy.ListRasters():
    arcpy.AddMessage("Processing " + Ras)
    desc = arcpy.Describe(Ras)
    if desc.bandCount == 3:
        arcpy.SetRasterProperties_management(Ras,nodata="1 0;2 0;3 0")
    elif desc.bandCount == 4:
        arcpy.SetRasterProperties_management(Ras,nodata="1 0;2 0;3 0;4 0")
    elif desc.bandCount == 1:
        arcpy.SetRasterProperties_management(Ras,nodata="1 0")

В ArcCatalog щелкните правой кнопкой мыши слой и перейдите к свойствам: введите описание изображения здесь

нажмите кнопку редактирования:

введите описание изображения здесь

Введите значения, затем нажмите OK, чтобы закрыть редактор NoData, и OK, чтобы применить изменения.

Теперь растр ничего не будет отображать в ArcMap, где значение ячейки равно 0,0,0.

Майкл Стимсон
источник
3

Если вы переходите к свойствам растра, и если символы установлены как составные RGB (которые кажутся), вы можете установить флажок Отображать значения фона (RGB) и установить все, что вам нравится, в качестве пустого фона. Так что просто установите 0 0 0 в качестве значения фона, и вы должны быть в бизнесе.

mr.adam
источник
2

Я думаю, что самый простой способ добиться этого - сначала создать растр с нулевым условием, а затем использовать этот растр для отдельного присвоения значений NoData каждой полосе.

Попробуйте запустить функцию Con, чтобы создать растр с нулевым условием.

nullCondition = Con(((band1 == 0) & (band2 == 0) & (band3 == 0)), 1, 0)

Затем с помощью растрового условия с нулевым условием присвойте значения NoData каждому диапазону с помощью установленной функции Null . Вы должны быть в состоянии сделать это с помощью конструктора моделей или Python.

Бен Госак
источник
2

Я считаю, что вы можете использовать три разные процедуры, которые теоретически должны работать. Растровый вычислитель, где вы можете использовать это выражение SETNULL([raster] == value, [raster]) Переклассифицировать, где вы должны переклассифицировать только то значение, которое вы хотите. А используя ArcPy, вы можете использовать этот скрипт, который я нашел здесь https://gis.stackexchange.com/a/24578/47790

import arcpy
from arcpy import env
from arcpy.sa import *
env.workspace = "C:/sapyexamples/data"
outSetNull = SetNull("elevation", "elevation", "VALUE = 9999")
outSetNull.save("C:/sapyexamples/output/outsetnull")
Диого Матос
источник