Как добавить цветовую интерпретацию для растровых полос, используя GDAL?

9

У меня есть 3 отдельных 1-полосных файла GeoTIFF. Интерпретация цвета для полосы - серый. Я хочу 3-полосный файл RGB. Я использовал gdal_merge.py

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

Но цветовая интерпретация для 3-х полос результирующего output_file.tif - серый, неопределенный, неопределенный. Кроме того, все пиксели равны 0 .

Если я выполню pct2rgb.py, я получу RGB-файл:

pct2rgb.py output_file.tif output_file_rgb.tif

Но, конечно же, пиксели тоже равны 0. Итак, у меня есть 3 вопроса:

  • Является ли gdal_merge.py правильным инструментом для объединения трех 1-полосных файлов в один 3-полосный RGB-файл?
  • Почему я получаю неопределенную интерпретацию цвета для групп?
  • Является ли pct2rgb правильным инструментом для преобразования 3-полосных файлов с такой цветовой интерпретацией в файлы RGB?

ОБНОВЛЕНИЕ : у растров нет таблицы цветов. Просто цветовая интерпретация: серый.

С другой стороны, значения пикселей изменяются от 0 до 1023 (это намеренно)

Больше данных: они повернутые растры (не на север), но все они имеют одинаковое геотрансформирование.

ОБНОВЛЕНИЕ 2 : я могу деформировать изображения, чтобы сделать их севернее, построить VRT и добавить ColorInterp для каждой полосы, но я все еще получаю интерпретацию цвета как серый, неопределенный, неопределенный в выходном результате.

Проблема в том, что мне нужно создать таблицу цветов, по крайней мере, в первой полосе. Я знаю способ их создания , но я не знаю, сколько записей должно быть в моей таблице. Почему в примере GDAL Raster FAQ есть 13 записей? Все пиксели имеют значения от 0 до 1023, если это помогает.

ОБНОВЛЕНИЕ 3 : По-видимому, в формате TIFF нет способа по-настоящему определить цветовую интерпретацию каждой полосы. Способ, которым GDAL создает интерпретацию цвета при чтении файла TIFF, представляет собой сочетание значения тега PHOTOMETRIC и EXTRASAMPLES .

Читая об этих тегах:

  • PHOTOMETRIC представляет цветовое пространство данных изображения. Значение 2 означает, что компоненты значения пикселя являются RGB, но оно предполагает использование байтовых пикселей, а у меня UInt16 пикселей (я пробовал -co "PHOTOMETRIC=rgb"и получил ошибку). Поэтому я не могу указать тег PHOTOMETRIC для выходного файла.

  • EXTRASAMPLES указывает, что каждый пиксель имеет N дополнительных компонентов. Я не уверен, как использовать этот тег для создания моего объединенного файла. Или если мне это нужно.

Итак, в обновлении 2 я предлагаю создание ColorTable, но как? В моих 3 входных файлах значения пикселей изменяются от 0 до 1023. Нужно ли сопоставлять их с цветами? Нужно ли создавать ColorTable с 1024 входами? Как?

В обновлении 3 кажется, что я мог бы использовать некоторые теги GeoTIFF при создании объединенного файла, но я не уверен, действительно ли я могу их использовать или как.

Хорхе Аревало
источник
1
Попробуйте это: используйте gdal_merge, как вы, а затем gdal_translate -co PHOTOMETRIC = RGB, по любой причине, gdal_merge не учитывает -co. Это оказалось на работу для меня. Хотя, возможно, я неправильно понимаю вашу цель.
Спасибо за ваш совет! Я хочу объединить 3 однополосных геотифа в один 3-полосный геотиф. Моя проблема в том, что вывод gdal_merge фактически пустой (пикселей = 0). Я не могу использовать этот вывод ни для чего.
Хорхе Аревало
Возможно ли разместить данные где-то, что-то кажется неправильным.
Я спросил моего босса, и я не могу публиковать данные :-(. Я действительно мог бы смешивать файлы с автономным кодом, который по частям копирует входные файлы на выходе. Я хотел бы сделать это с помощью gdal_merge Моя проблема в том, что я не могу установить интерпретацию цвета RGB для выходного файла с помощью gdal_merge.
Хорхе Аревало
Может быть, у меня была похожая проблема. Получил эту работу с rgb2pct.py. Почему? Я не знаю. Описание команды: Эта утилита вычислит оптимальную таблицу псевдоцветов для данного изображения RGB, используя алгоритм медианного среза на гистограмме RGB с пониженной дискретизацией. Затем я запускаю gdal_translate с расширением rgb.

Ответы:

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 нет способа по-настоящему определить цветовую интерпретацию каждой полосы. Способ, которым GDAL создает интерпретацию цвета при чтении файла TIFF, представляет собой сочетание значения тега PHOTOMETRIC и EXTRASAMPLES.

-Эван (афиша) знает GDAL внутри и снаружи.

Джей Лаура
источник
Я на самом деле сделал это, но я получаю «ОШИБКА 6: SetColorTable () не поддерживается для файлов TIFF с несколькими образцами». И я получаю 0 для всех пикселей. Я не уверен в значении этой ошибки.
Хорхе Аревало
Хорошо, обновленный вопрос. Мне нужна таблица цветов для первой группы.
Хорхе Аревало
Ммм ... спасибо за ответ. Я пробую эти варианты. Кажется, я не могу использовать PHOTOMETRIC = rgb, потому что мой тип данных не int. Но я на этом ...
Хорхе Аревало
3

Первый способ, который я могу придумать, - это создать vrt, отредактировать и перевести:

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

добавьте тег interp, где это необходимо:

...
<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

источник
Я пытался, но мои растровые файлы повернуты ...
Хорхе Аревало
То есть у них нет одинаковых SRS / геотрансформаций?
Нет, все они имеют одинаковые геотрансформации, но они не растры на север (параметры вращения не равны 0). И gdalbuildvrt не поддерживает повернутые геопреобразования. Я не хочу их искажать.
Хорхе Аревало
Мммм, хорошо. Если я искажу их для создания растров на север, я могу создать VRT и добавить ColorInterp, где это необходимо, но я все равно получаю серый, неопределенный, неопределенный. Мне нужно создать таблицу цветов для первой группы, но я не знаю как. Я обновлю вопрос.
Хорхе Аревало
1

Ваш входной диапазон оттенков серого имеет значения от 0 до 1024, но RGB допускает только значения от 0 до 255 для каждого диапазона.

Вы можете использовать gdal_translate -scale [src_min src_max [dst_min dst_max]]для изменения масштаба вашего исходного файла.

Во втором прогоне вы можете сложить свои три полосы с помощью gdal_merge.py и применить -co "PHOTOMETRIC=rgb".

Andrej
источник