En aquel Imperio, el Arte de la Cartografía logró tal Perfección que el Mapa de una sola Provincia ocupaba toda una Ciudad, y el Mapa del Imperio, toda una Provincia. Con el tiempo, estos Mapas Desmesurados no satisficieron y los Colegios de Cartógrafos levantaron un Mapa del Imperio, que tenía el Tamaño del Imperio y coincidía puntualmente con él. Menos Adictas al Estudio de la Cartografía, las Generaciones Siguientes entendieron que ese dilatado Mapa era Inútil y no sin Impiedad lo entregaron a las Inclemencias del Sol y los Inviernos. En los Desiertos del Oeste perduran despedazadas Ruinas del Mapa, habitadas por Animales y por Mendigos; en todo el País no hay otra reliquia de las Disciplinas Geográficas.
[Del rigor en la ciencia, Jorge Luis Borges]

2013-01-04

Conversão lossless para JPEG2000


Mais uma cábula... 


o objetivo é armazenar ortofotomapas num formato compacto, para arquivo de segurança: as conversões de formato devem ser  "lossless", i.e. sem alteração da qualidade ou resolução da imagem.

Input

Cada imagem tem 8000 x 10000 células, 4 bandas (RGBI) com um byte por banda.
Está armazenada em formato TIF (band interleaved by pixel).
A informação de referenciação está num "world file" (idêntico "filename" e extensão TFW).
As células quadradas têm dimensão 0.5m no terreno, o centro das células está registado à origem do sistema de eixos coordenados, a matriz de transformação não tem componente de rotação.
Não existe informação quanto ao SRS, seja no "header" do ficheiro de imagem, seja num qualquer ficheiro externo (.prj, .wkt). Os metadados indicam contudo o sistema de referência PT-TM06 (epsg:3763).

Passo 1

Transferir para o "header" do ficheiro de imagem toda a informação de referenciação (incluindo informação de definição do SRS - armazenada para tal num ficheiro "epsg3763.wkt" no formato OGC WKT).

O processamento em batch usa a versão 1.9.2 do GDAL. O comando tem a forma:
gdal_translate -of GTIFF -a_srs epsg3763.wkt input.tif output.tif
O utilitário gdal_translate reconhece a presença do ficheiro tfw associado a cada imagem tif.

Utilizando o gdalinfo sobre o ficheiro output.tif verifica-se que a 4ª banda está a ser tratada e marcada como um alpha channel (i.e. uma máscara de transparência) - o que não corresponde à verdade (é uma banda de infravermelho próximo).

Consultando a documentação em http://www.gdal.org/frmt_gtiff.html, verifica-se que para versões anteriores à 1.10, a primeira banda extra é sempre marcada como "ALPHA".

Conclusão: passou a utilizar-se a versão 1.10 do GDAL disponível em http://www.gisinternals.com/sdk/Download.aspx?file=release-1600-x64-gdal-mapserver.zip

O comando aplicável passa a ser:
gdal_translate -of GTIFF -a_srs epsg3763.wkt -co ALPHA=UNSPECIFIED input.tif output.tif

Passo 2

A conversão "lossless" para JP2000 sem perda pode ser realizada no GDAL_TRANSLATE com o "driver" JP2ECW. O comando tem a forma:
gdal_translate -of JP2ECW -co TARGET=0 input.tif output.jp2
As condições de licenciamento do ECW 3.3 SDK permitem a conversão de imagens inferiores a 500MB.

Alternativas não testadas

Utilizar GDAL_TRANSLATE compilado com o "driver" JPEG2000, baseado na biblioteca JasPer.

Tentativas sem sucesso (por enquanto)...

1) A conversão com o GDAL 1.10 usando o "driver" JP2OpenJPEG não é possível sobre imagens com 4 bandas. O comando teria a forma:
gdal_translate -of JP2OpenJPEG -co REVERSIBLE=TRUE input.tif output.jp2

2) Em situações anteriores, utilizou-se o software GeoJasper, baseado na biblioteca JasPer e disponível em http://www.dimin.net/software/geojasper/
O comando tem a forma:
"C:\Programs\geojasper_win32\geojasper" -f input.tif -F output.jp2 -T jp2
Na presente tentativa, o utilitário deu problemas e não completa as conversões (possivelmente devido a incompatibilidade com o SO de 64bit?).

3) Teoricamente, numa conversão "lossless" para JP2000 seria possível utilizar a biblioteca Kakadu.
Em Windows, o utilitário kdu_compress (entre outros) está disponível em http://www.kakadusoftware.com
O comando tem a forma:
"C:\Program Files (x86)\Kakadu\kdu_compress" -i input.tif -o output.jp2 Creversible=yes
A informação de referenciação é transferida do "header" do ficheiro tif para o "header" do ficheiro jp2.

Contudo, a imagem resultante TEM PERDAS E É VISUALMENTE DIFERENTE DO ORIGINAL.
Não foi possível encontrar uma solução para o problema.

4) Alternativamente, o pacote FWTools 2.10 para Windows suporta JP2000 através da bibliteca kakadu.
As versões superiores não incluem o "driver" JP2KAK.
A versão 2.10 está disponível em http://home.gdal.org/fwtools/ .

As opções suportadas encontram-se em http://www.gdal.org/frmt_jp2kak.html
O comando tem a forma:
gdal_translate -of JP2KAK -co QUALITY=100 input.tif output.jp2

Novamente, a opção QUALITY=100, que deveria realizar a conversão "lossless", origina perdas na imagem. O problema já não é perceptível (visualmente) com uma compressão de 99%...
gdal_translate -of JP2KAK -co QUALITY=99 input.tif output.jp2

Nota sobre a extensão jp2:

The standardized filename extension is .jp2 for ISO/IEC 15444-1 conforming files and .jpx for the extended part-2 specifications, published as ISO/IEC 15444-2.
The registered MIME types are defined in RFC 3745. For ISO/IEC 15444-1 it is image/jp2.

Links + úteis ...

Toda a sequência de posts em http://blog.viasig.com: