Escale de 16 bits a 8 bits dentro del rango utilizando GDAL

11

Estoy buscando escalar una imagen tiff sin signo de 16 bits a una imagen de 8 bits usando GDAL (OSGeo4W). Sin embargo, quiero restringir los valores de píxeles para que se mantengan dentro del rango de las imágenes de 8 bits. Lo que quiero decir es que quiero asegurarme de que la proporción visual en la imagen de 16 bits esté representada en la imagen de 8 bits (0-255). El uso de gdal_translate para convertir de 16 bits a 8 bits reduce los valores de píxeles y no produce una imagen RGB. No estoy seguro de qué función y configuración llamar desde gdal_translate, o si hay una mejor opción.


GDALINFO

C:\>gdalinfo C:\Projects\Stormwater\ForPCI\images\1537TORO_6cm_04761_RGBI.tif
Driver: GTiff/GeoTIFF
Files: C:\Projects\Stormwater\ForPCI\images\1537TORO_6cm_04761_RGBI.tif
Size is 17310, 11310
Coordinate System is `'
Metadata:
  TIFFTAG_DATETIME=2015:05:03 12:27:13
  TIFFTAG_IMAGEDESCRIPTION=UltraCam-Lvl03
--------------
CAM_ID: UC-SXp-1-50215465 [3]
IMG_NO: 4761
RECORD_GUID: 8fc3d7a9-d2e5-40e5-babf-939f1f803dcf
IMG_GUID: C850D0A4-39CA-4BC8-ACD7-81A363D78C6E
FILE_GUID: 86C4F8E4-A2FD-43FB-B3B1-4C4ED8DF0E42
LICENSE_ID: 820342819
SOFTWARE: UltraCam Aerial Radiometry Core 12.6.1408.2501
PIXEL_SIZE_WIDTH: 6 [micron]
PIXEL_SIZE_HEIGHT: 6 [micron]
APERTURE: F_8
EXPOSURE_TIME: 0.002000000000 [s]
HIGH_ISO_MODE_CAPTURE: off
HIGH_ISO_MODE_PROCESSING: off

----- Inner Orientation -----
PRINCIPAL_DISTANCE: 100.500000000000 [mm]
PRINCIPAL_POINT_X: -0.000000000000 [mm]
PRINCIPAL_POINT_Y: 0.180000000000 [mm]
SENSOR_AREA_WIDTH: 103.860000000000 [mm]
SENSOR_AREA_HEIGHT: 67.860000000000 [mm]
-----------------------------

----- Exposure Annotation Data -----
MID_EXPOSURE_CORRECTION: 0.000762000000 [s]
FMS_SENSOR_CODE: UCXp
FMS_CAMERA_PORT: 1
FMS_EXPOSURE_NUMBER: 4761
FMS_PROJECT: 1537TORO
FMS_AREA: 1537TORO_6cm_6030
FMS_LINE_NUMBER: 47
FMS_SEGMENT_NUMBER: 1
FMS_WAY_POINT_NUMBER: 0
GPS_DATE: 150412
GPS_TIME: 162517
GPS_LATITUDE: N43.745319 [degree]
GPS_LONGITUDE: W079.358953 [degree]
GPS_ALTITUDE: 1159 [m]
GPS_POSITION_SOLUTION: GPS
GPS_TRACK_OVER_GROUND: 73 [degree]
GPS_ABOVE_GROUND_LEVEL: 1008.7 [m]
GPS_GROUND_SPEED: 80.4 [mps]
------------------------------------

----- Level-3 Parameters -----
IMG_TYPE: High resolution multi channel RGBI
ROTATION: 0 [degree]
------------------------------------
TIFFTAG_RESOLUTIONUNIT=1 (unitless)
TIFFTAG_SOFTWARE=UltraCam Aerial Radiometry Core 12.6.1408.2501
Image Structure Metadata:
INTERLEAVE=PIXEL
Corner Coordinates:
Upper Left  (    0.0,    0.0)
Lower Left  (    0.0,11310.0)
Upper Right (17310.0,    0.0)
Lower Right (17310.0,11310.0)
Center      ( 8655.0, 5655.0)
Band 1 Block=17310x1 Type=UInt16, ColorInterp=Red
Band 2 Block=17310x1 Type=UInt16, ColorInterp=Green
Band 3 Block=17310x1 Type=UInt16, ColorInterp=Blue
Band 4 Block=17310x1 Type=UInt16, ColorInterp=Undefined
Ryan Garnett
fuente
1
¿Podría proporcionar algunos detalles sobre el tipo de imágenes que está utilizando?
Aaron
Por ejemplo, adjuntando el informe gdalinfo del archivo fuente. Escriba también el comando exacto gdal_translate que utilizó.
user30184
Se ha agregado gdalinfo a la pregunta como una ACTUALIZACIÓN. Las imágenes son imágenes estéreo de nivel 3. El comando gdal_translate utilizado fue: gdal_translate -ot Byte input.tif output.tif
Ryan Garnett el
1
Quizás los datos reales de las imágenes de 16 bits solo están usando una porción estrecha del rango completo. Verificar el histograma con, por ejemplo, QGIS puede revelar eso. También puede probar con el parámetro -scale gdal.org/gdal_translate.html . Si utiliza la salida RGB de la selección original de 4 bandas, seleccione tres de ellas con parámetros -b, por ejemplo-b 1 -b 2 -b 3
user30184

Respuestas:

21

Si no desea que se corten los valores superiores a 255, debe reducirlos. Para ese propósito, gdal_translate proporciona la opción -scale:

Del manual :

-scale [src_min src_max [dst_min dst_max]]: reescala los valores de píxeles de entrada del rango src_min a src_max al rango dst_min a dst_max. Si se omite, el rango de salida es de 0 a 255. Si se omite, el rango de entrada se calcula automáticamente a partir de los datos de origen.

Entonces, lo que puede usar es lo siguiente:

gdal_translate -of GTiff -ot Byte -scale 0 65535 0 255 src_dataset dst_dataset

¿Por qué 255 y 65535?

Tienes valores de 2 ^ nbits. Como el valor mínimo suele ser 0, el valor máximo es 2^nbits-1.

  • 8 bits -> 2 ^ 8 = 256 valores -> 0-255
  • 16 bits -> 2 ^ 16 = 65536 valores -> 0-65535
pLumo
fuente