为多波段栅格设置NoData吗?


10

我有一个具有黑色区域而不是NoData的RGB正射影像,如下图所示: 在此处输入图片说明

当我使用SetNull工具时,它确实删除了黑色区域,但是随后将其变成了灰度正射影像,这不是我想要的。

在此处输入图片说明

我知道可以使用“裁剪(数据管理)”工具将栅格裁剪为其自身,并且可以在其中将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。
Alex McVittie

感谢您提出这个问题。我的客户经常回到我身边,以为他们的图像有问题。
2015年

Answers:


12

您要做的是在脚本中设置栅格属性或在ArcCatalog中手动更改它。这不会创建新的栅格,甚至不会花费很长时间。

在python中有点棘手:

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")

因为nodata在列表的下方,所以我发现更容易指定它。参数是Band Value; Band Value; ...,直到所有频段都被寻址为止。如果您可能在同一文件夹中有更多(或更少)频段,则必须使用arcpy.DescribebandCount属性为正确的频段数设置null:

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中,右键单击图层并转到属性: 在此处输入图片说明

点击编辑按钮:

在此处输入图片说明

输入值,然后单击“确定”以关闭NoData编辑器,并单击“确定”以执行更改。

现在,栅格将在像元值为0,0,0的ArcMap中不显示任何内容。


3

如果转到栅格属性,并且将符号系统设置为RGB复合(看起来是这样),则可以选中“显示背景值(RGB)”框,然后将任意内容设置为空心背景。因此,只需将0 0 0设置为背景值就可以了。


2

我认为实现此目的的最简单方法是先创建一个空条件栅格,然后使用该栅格将NoData值分别分配给每个波段。

尝试运行Con函数以创建空条件栅格。

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

然后使用空条件栅格通过设置的Null函数将NoData值分配给每个波段。您应该能够使用模型构建器或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")
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.