Jak dodać interpretację kolorów dla pasm rastrowych za pomocą GDAL?

9

Mam 3 oddzielne 1-pasmowe pliki GeoTIFF. Interpretacja kolorów dla pasma jest szara. Chcę 3-pasmowy plik RGB. Użyłem gdal_merge.py

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

Ale interpretacja kolorów dla 3 pasm wynikowego pliku_wyjściowego.tif jest szara, niezdefiniowana, niezdefiniowana. Poza tym wszystkie piksele mają wartość 0 .

Jeśli wykonam pct2rgb.py, otrzymam plik RGB:

pct2rgb.py output_file.tif output_file_rgb.tif

Ale oczywiście piksele też mają 0. Mam więc 3 pytania:

  • Czy gdal_merge.py jest właściwym narzędziem do łączenia 3 1-pasmowych plików w jeden 3-pasmowy plik RGB?
  • Dlaczego otrzymuję nieokreśloną interpretację kolorów dla pasm?
  • Czy pct2rgb jest właściwym narzędziem do przekształcania plików 3-pasmowych z tą interpretacją kolorów na pliki RGB?

AKTUALIZACJA : Rastry nie mają tabeli kolorów. Tylko interpretacja kolorów: szary.

Z drugiej strony wartości pikseli wynoszą od 0 do 1023 (jest to celowe)

Więcej danych: są to obracane rastry (bez północy w górę), ale wszystkie mają tę samą geotransformę.

AKTUALIZACJA 2 : Mogę wypaczać obrazy, aby je skierować na północ, budować VRT i dodawać ColorInterp dla każdego pasma, ale nadal otrzymuję interpretację kolorów jako szary, niezdefiniowany, niezdefiniowany w wyniku wyjściowym.

Problem polega na tym, że muszę stworzyć tabelę kolorów przynajmniej w pierwszym paśmie. Znam sposób ich tworzenia , ale nie wiem, ile wpisów powinna zawierać moja tabela. Dlaczego w przykładzie GDAL Raster FAQ jest 13 pozycji? Wszystkie piksele mają wartości od 0 do 1023, jeśli to pomaga.

AKTUALIZACJA 3 : Najwyraźniej w formacie TIFF nie można naprawdę określić interpretacji kolorów dla każdego pasma. Sposób, w jaki GDAL buduje interpretację kolorów podczas odczytu pliku TIFF, jest kombinacją wartości znacznika PHOTOMETRIC i EXTRASAMPLES .

Czytanie o tych tagach:

  • FOTOMETRYCZNY reprezentuje przestrzeń kolorów danych obrazu. Wartość 2 oznacza, że ​​składowymi wartości piksela są RGB, ale zakłada się, że piksele bajtowe, a ja mam piksele UInt16 (próbowałem -co "PHOTOMETRIC=rgb"i dostałem błąd). Dlatego nie mogę określić znacznika PHOTOMETRIC dla pliku wyjściowego.

  • EXTRASAMPLES określa, że ​​każdy piksel ma N dodatkowych składników. Nie jestem pewien, jak użyć tego znacznika do utworzenia scalonego pliku. Lub jeśli potrzebuję.

Tak więc w aktualizacji 2 sugeruję utworzenie ColorTable, ale jak? W moich 3 plikach wejściowych wartości pikseli wynoszą od 0 do 1023. Czy muszę dopasowywać je do kolorów? Czy muszę utworzyć tabelę kolorów z 1024 wejściami? W jaki sposób?

Wydaje się, że w aktualizacji 3 mogłem użyć niektórych tagów GeoTIFF podczas tworzenia scalonego pliku, ale nie jestem pewien, czy naprawdę mogę ich użyć, ani w jaki sposób.

Jorge Arévalo
źródło
1
Spróbuj tego: użyj gdal_merge tak jak zrobiłeś, a następnie gdal_translate -co PHOTOMETRIC = RGB, z jakiegokolwiek powodu gdal_merge nie honoruje -co. Ten pojawił się do pracy dla mnie. Chociaż mogę nie rozumieć twojego celu.
Dziękuję za twoją wskazówkę! Chcę scalić 3 jednopasmowe geotiffy w jedną 3-pasmową geotiff. Mój problem jest taki, że wyjście gdal_merge jest faktycznie puste (piksele = 0). Nie mogę użyć tego wyjścia do niczego.
Jorge Arévalo
Czy można gdzieś opublikować dane, coś wydaje się nie w porządku.
Zapytałem mojego szefa i nie mogę opublikować danych :-(. Właściwie mógłbym mieszać pliki z samodzielnym kodem, który kopiuje pasmo po paśmie wejściowych plików na wyjściu. Chciałbym to zrobić z gdal_merge Moim poblemem jest to, że nie mogę ustawić interpretacji kolorów RGB dla pliku wyjściowego za pomocą gdal_merge
Jorge Arévalo
Może miałem podobny problem. Mam to działa z rgb2pct.py. Dlaczego? Nie wiem. Opis polecenia: To narzędzie obliczy optymalną tabelę pseudokolorów dla danego obrazu RGB przy użyciu algorytmu cięcia mediany na histogramie RGB z próbkowaniem w dół. Następnie uruchamiam gdal_translate z rozwinięciem rgb.

Odpowiedzi:

6

gdal_merge.py to właściwe narzędzie do układania obrazów wejściowych w stos.

Zakładając, że twój pierwszy zespół ma prawidłową tabelę kolorów, której możesz użyć:

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

Uwaga: Komenda została ponownie sformatowana -o output_file.tifprzed listą danych wejściowych.

Z dokumentów:

-pct: Weź tabelę pseudokolorów z pierwszego obrazu wejściowego i użyj jej do wydruku. Scalanie obrazów pseudokolorowanych w ten sposób zakłada, że ​​wszystkie pliki wejściowe korzystają z tej samej tabeli kolorów.

Przetestowałbym twoje wyjście, gdalinfo -statsaby upewnić się, że jest odpowiednio ułożone.

Zaktualizowano dla OP

Z listy osgeo wygląda na to, że możesz spróbować użyć innego formatu, aby sprawdzić wyniki:

W formacie TIFF nie ma sposobu, aby naprawdę określić interpretację kolorów dla każdego pasma. Sposób, w jaki GDAL buduje interpretację kolorów podczas odczytu pliku TIFF, jest kombinacją wartości znacznika PHOTOMETRIC i EXTRASAMPLES.

-Evan (plakat) zna GDAL wewnątrz i na zewnątrz.

Jay Laura
źródło
Właściwie to zrobiłem, ale dostaję komunikat „BŁĄD 6: SetColorTable () nie jest obsługiwany dla plików TIFF z wieloma próbkami”. I dostaję 0 dla wszystkich pikseli. Nie jestem pewien znaczenia tego błędu.
Jorge Arévalo
Ok, zaktualizowane pytanie. Potrzebuję tabeli kolorów dla pierwszego zespołu.
Jorge Arévalo
Mmm ... dzięki za odpowiedź. Próbuję tych opcji. Wydaje się, że nie mogę użyć PHOTOMETRIC = rgb, ponieważ mój typ danych nie jest int. Ale jestem na tym ...
Jorge Arévalo
3

Pierwszym sposobem, jaki mogę wymyślić, jest zbudowanie vrt, edycja i tłumaczenie:

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

w razie potrzeby dodaj tag interpretu kolorów:

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

i wtedy:

gdal_translate output.vrt output.tif

źródło
Próbowałem, ale moje pliki rastrowe są obrócone ...
Jorge Arévalo
Czyli nie mają takich samych SRS / geotransform?
Nie, wszystkie mają te same geotransformy, ale nie są rastrami skierowanymi na północ (parametry obrotu nie są równe 0). Gdalbuildvrt nie obsługuje obróconych transformacji geograficznych. Nie chcę ich wypaczać.
Jorge Arévalo
Mmmm ok. Jeśli wypaczę je, aby utworzyć rastry na północy, mogę zbudować VRT i w razie potrzeby dodać ColorInterp, kupuję nadal szary, niezdefiniowany, niezdefiniowany. Muszę stworzyć tabelę kolorów dla pierwszego zespołu, ale nie wiem jak. Zaktualizuję pytanie.
Jorge Arévalo
1

Twoje wejściowe pasmo skali szarości ma wartości od 0 do 1024, ale RGB dopuszcza tylko wartości od 0 do 255 dla każdego pasma.

Możesz użyć gdal_translate -scale [src_min src_max [dst_min dst_max]]do przeskalowania pliku źródłowego.

W drugim przebiegu możesz ułożyć trzy pasma za pomocą gdal_merge.py i zastosować -co "PHOTOMETRIC=rgb".

AndreJ
źródło