如何使用GDAL为光栅带添加颜色解释?


9

我有3个单独的1频段GeoTIFF文件。带的颜色解释为灰色。我想要一个3波段RGB文件。我用过gdal_merge.py

gdal_merge.py -separate file1.tif file2.tif file3.tif -o output_file.tif

但是,结果output_file.tif的3个波段的颜色解释为灰色,未定义,未定义。除此之外,所有像素均为0

如果执行pct2rgb.py,我将得到一个RGB文件:

pct2rgb.py output_file.tif output_file_rgb.tif

但当然,像素也为0。因此,我有3个问题:

  • gdal_merge.py是将3个1波段文件合并为一个3波段RGB文件的正确工具吗?
  • 为什么我得到乐队未定义的颜色解释?
  • pct2rgb是将具有这种颜色解释的3波段文件转换为RGB文件的正确工具吗?

更新:栅格没有颜色表。只是颜色解释:灰色。

另一方面,像素值从0到1023(这是有意的)

更多数据:它们是旋转的栅格(不向北),但是它们都具有相同的地理变换。

更新2:我可以扭曲图像以使其朝北,构造一个VRT并为每个波段添加ColorInterp,但是在输出结果中我仍然得到颜色解释为灰色,未定义和未定义。

问题是我至少需要在第一个波段中创建一个颜色表。我知道创建它们的方法,但是我不知道我的表应该有多少个条目。为什么在GDAL Raster FAQ示例中有13个条目?如果有帮助,所有像素的值都在0到1023之间。

更新3:显然,TIFF格式无法真正指定每个频段的颜色解释。读取TIFF文件时,GDAL构建颜色解释的方式是PHOTOMETRIC和EXTRASAMPLES标记的值的组合

阅读这些标签:

  • PHOTOMETRIC表示图像数据的色彩空间。值2表示像素值的组成部分是RGB,但是它假定为Byte像素,并且我有UInt16像素(我尝试过-co "PHOTOMETRIC=rgb",并遇到错误)。因此,我无法为输出文件指定PHOTOMETRIC标签。

  • EXTRASAMPLES指定每个像素具有N个额外的分量。我不确定如何使用此标记创建合并的文件。或者,如果我需要它。

因此,在更新2中,我建议创建一个ColorTable,但是如何呢?在我的3个输入文件中,像素值从0到1023。是否必须将它们与颜色匹配?我必须创建一个具有1024个输入的ColorTable吗?怎么样?

在更新3中,似乎在创建合并文件时可以使用一些GeoTIFF标签,但是我不确定是否真的可以使用它们,或者如何使用。


1
尝试以下操作:像以前一样使用gdal_merge,然后使用gdal_translate -co PHOTOMETRIC = RGB,无论出于何种原因gdal_merge不尊重-co。这似乎对我有用。虽然我可能会误解您的目标。

感谢您的提示!我想将3个单波段Geotiff合并为一个3波段Geotiff。我的问题是gdal_merge的输出实际上是空的(像素= 0)。我什么都不能使用该输出。
豪尔赫·阿雷瓦洛(JorgeArévalo)

是否有可能将数据发布到某个地方,似乎有些不对劲。

我已经问过老板,我无法发布数据:-(。实际上我可以将文件与独立代码混合,从而在输出中一带一带地复制输入文件。我想使用gdal_merge我的poblem是我不能设置RGB色彩演绎与gdal_merge输出文件。
豪尔赫·阿雷瓦洛

也许,我有类似的问题。与rgb2pct.py一起使用了。为什么?,我不知道。命令说明:该实用程序将在降采样的RGB直方图上使用中位数剪切算法为给定的RGB图像计算最佳伪色表。然后,我用expand rgb运行gdal_translate。

Answers:


6

gdal_merge.py是“堆叠”输入图像的正确工具。

假设您的第一个波段具有有效的色表,则可以使用:

gdal_merge.py -separate -pct -o output_file.tif file1.tif file2.tif file3.tif

注意:该命令已在-o output_file.tif输入列表之前重新格式化。

从文档:

-pct:从第一个输入图像中获取伪色表,并将其用于输出。以这种方式合并伪彩色图像时,假定所有输入文件都使用相同的颜色表。

我将测试您的输出,gdalinfo -stats以确保正确堆叠。

已更新OP

osgeo列表中,您似乎可以尝试使用其他格式来检查结果:

TIFF格式无法真正指定每个频段的颜色解释。读取TIFF文件时,GDAL建立颜色解释的方式是PHOTOMETRIC和EXTRASAMPLES标记的值的组合。

-海报的埃文(Evan)内外都知道GDAL。


我实际上是这样做的,但是我收到“错误6:多样本TIFF文件不支持SetColorTable()”。我得到所有像素的0。我不确定此错误的含义。
豪尔赫·阿雷瓦洛(JorgeArévalo)2013年

好的,更新的问题。我需要第一个乐队的颜色表。
JorgeArévalo2013年

嗯...感谢您的回复。我正在尝试这些选项。似乎我无法使用PHOTOMETRIC = rgb,因为我的数据类型不是int。但是我在…
乔治·阿雷瓦洛(JorgeArévalo)

3

我能想到的第一种方法是构建vrt,编辑和翻译:

gdalbuildvrt -separate output.vrt file1.tif file2.tif file3.tif

在需要的地方添加颜色插入标签:

...
<VRTRasterBand dataType="Byte" band="1">
<ColorInterp>Red</ColorInterp>
<NoDataValue>255</NoDataValue>
<ComplexSource>
  <SourceFilename relativeToVRT="1">test.tif</SourceFilename>
  <SourceBand>1</SourceBand>
  <SourceProperties RasterXSize="42" RasterYSize="22" DataType="Byte" BlockXSize="42" BlockYSize="22" />
  <SrcRect xOff="0" yOff="0" xSize="42" ySize="22" />
  <DstRect xOff="0" yOff="0" xSize="42" ySize="22" />
  <NODATA>-32768</NODATA>
</ComplexSource>

然后:

gdal_translate output.vrt output.tif

我尝试过,但是我的栅格文件却被旋转了……
JorgeArévalo13年

意味着它们没有相同的SRS /地理转换?

不,它们都具有相同的地理变换,但是它们不是北上栅格(旋转参数不为0)。而且gdalbuildvrt不支持旋转的地理变换。我不想扭曲他们。
豪尔赫·阿雷瓦洛(JorgeArévalo)2013年

嗯好 如果我扭曲它们以创建向上的栅格,则可以构建VRT,并在需要的地方添加ColorInterp,购买后我仍然会得到灰色,不确定的,不确定的。我需要为第一个乐队创建一个颜色表,但是我不知道如何。我将更新问题。
豪尔赫·阿雷瓦洛(JorgeArévalo),

1

您输入的灰度带的值为0到1024,但是RGB仅允许每个带的灰度值为0到255。

您可以gdal_translate -scale [src_min src_max [dst_min dst_max]]用来重新缩放源文件。

在第二轮中,您可以将三个频段与gdal_merge.py堆叠并套用-co "PHOTOMETRIC=rgb"

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.