1 votos

Visualización de imágenes de 11 bits

Estoy tratando de visualizar una imagen TIFF de 11 bits usando matplotlib. Para hacerlo, cargo la imagen usando tifffile para obtener un array numpy 3D. A continuación, tengo que reducir la resolución de la imagen porque el array contiene valores más allá del rango [0, 255]. Aquí está mi código:

import tifffile as ti
from scipy.misc import bytescale

x_3band = ti.imread(ruta_del_archivo_tres_bandas)
# transponer para que la forma sea [M, N, 3]
X = np.transpose(x_3band, (1,2,0))
X = bytescale(X)
plt.imshow(X)
plt.show()

El problema es que la imagen visualizada es diferente a la que se visualiza en QGIS (ver la imagen, la imagen izquierda es con matplotlib).

¿Cómo puedo mostrar la imagen como en QGIS?entrar descripción de la imagen aquí

1voto

Lucas Puntos 128

QGIS está aplicando un estiramiento de contraste.

Un simple estiramiento del 2-98% se puede lograr de esta manera:

import numpy as np

def bytescale(data, in_min, in_max):

    data = np.clip(data, in_min, in_max)
    data = (data - float(in_min)) / float(in_max - in_min)
    return np.array(data * 255, dtype=np.uint8)

in_min, in_max = np.percentile(data , (2,98))  # Donde data = una sola banda
data = bytescale(data, in_min, in_max)

Tenga en cuenta que este ejemplo simple no maneja valores NoData/Null/NaN (pista: np.nanpercentile) y solo está escalando un sola banda/canal, necesitará iterar a través de cada banda, volver a escalar/estirar y juntar las bandas en un array 3d.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X