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.


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.


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

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.