not jpg example does python numpy matplotlib

python - jpg - matplotlib imshow traza diferentes si usa mapa de colores o matriz RGB



plt.imshow size (1)

Tengo el siguiente problema: estoy guardando imágenes de tiff de 16 bits con un microscopio y necesito analizarlas. Quiero hacer eso con numpy y matplotlib, pero cuando quiero hacer algo tan simple como dibujar la imagen en verde (más adelante necesitaré superponer otras imágenes), falla.

Aquí hay un ejemplo cuando trato de trazar la imagen como una matriz RGB, o con el mapa de color jet predeterminado.

import numpy as np import matplotlib.pyplot as plt import cv2 imageName = ''image.tif'' # image as luminance img1 = cv2.imread(imageName,-1) # image as RGB array shape = (img1.shape[0], img1.shape[1], 3) img2 = np.zeros(shape,dtype=''uint16'') img2[...,1] += img1 fig = plt.figure(figsize=(20,8)) ax1 = fig.add_subplot(1,2,1) ax2 = fig.add_subplot(1,2,2) im1 = ax1.imshow(img1,interpolation=''none'') im2 = ax2.imshow(img2,interpolation=''none'') fig.show()

Que para mí produce la siguiente figura:

Lo siento si la pregunta es demasiado básica, pero no tengo idea de por qué la trama correcta muestra estos artefactos. Me gustaría obtener con la escala verde, algo así como la apariencia de la figura (la imagen J también produce algo similar a la gráfica de la izquierda).

Muchas gracias por su colaboración.


Creo que la trama correcta es mucho más artística ...

matplotlib es bastante complicado cuando se trata de interpretar imágenes. Va más o menos de la siguiente manera:

  • si la imagen es una matriz NxM de cualquier tipo, se interpreta a través del mapa de colores (escala automática, si no se indica lo contrario). (En principio, si la matriz es una matriz float una escala de 0..1, debe interpretarse como una imagen en escala de grises. Esto es lo que dice la documentación, pero en la práctica esto no sucede).

  • si la imagen es una matriz float NxMx3, los componentes RGB se interpretan como componentes RGB entre 0..1. Si los valores están fuera de este rango, se toman con módulo positivo 1, es decir, 1.2 -> 0.2, -1.7 -> 0.3, etc.

  • si la imagen es una matriz NxMx3 uint8 , se interpreta como una imagen estándar (componentes 0.255)

  • si la imagen es NxMx4, la interpretación es como la anterior, pero el cuarto componente es la opacidad (alfa)

Entonces, si le da a matplotlib una matriz NxMx3 de números enteros distintos de uint8 o float , los resultados no están definidos. Sin embargo, al observar el código fuente, se puede entender el comportamiento extraño:

if A.dtype != np.uint8: A = (255*A).astype(np.uint8)

donde A es la matriz de imágenes. Entonces, si le das uint16 valores 0, 1, 2, 3, 4 ..., obtienes 0, 255, 254, 253, ... Sí, se verá muy extraño. (En mi humilde opinión, la interpretación podría ser un poco más intuitiva, pero así es como se hace).

En este caso, la solución más fácil es dividir la matriz en 65535. y luego la imagen debe ser como se esperaba. Además, si la imagen original es realmente lineal, deberá realizar la corrección gamma inversa:

img1_corr = (img1 / 65535.)**(1/2.2)

De lo contrario, sus tonos medios estarán demasiado oscuros.