Posteriormente a mirar en diferentes repositorios y foros al concluir descubrimos la respuesta que te compartiremos ahora.
Solución:
La advertencia se explica por sí misma: color.convert_colorspace(in_hsv_h, 'HSV', 'RGB')
es de tipo float64
y imsave
convertir elementos a uint8
.
Los píxeles de la imagen PNG se almacenan como un byte por componente (un byte para el rojo, uno para el verde y otro para el azul).
Cada componente es un valor entero en el rango [0, 255] (escribe uint8
).
La salida de color.convert_colorspace es de float64
cada componente de color está dentro del rango [0, 1] de tipo float64
(almacenado como 64 bits en la memoria, y mucho más preciso que uint8
).
La conversión de float64
rango [0, 1] a uint8
rango [0, 255] se realiza como: uint8_val = round(float64_val*255)
.
La operación de redondeo pierde algunos datos (por ejemplo: en caso float64_val*255 = 132.658, el resultado se redondea a 133).
Convierta la imagen a uint8 antes de guardar para suprimir esta advertencia
Le dice que convierta los elementos de la imagen a uint8
antes de guardar.
La solución es simple.
Multiplica por 255 y suma .astype(np.uint8)
.
imsave('testing-sorted-hue.png', (color.convert_colorspace(in_hsv_h, 'HSV', 'RGB')*255).astype(np.uint8))
Para que su código funcione, también debe agregar .astype(np.uint8)
al construir newImage
:
newImage = np.random.randint(0, 255, (300, 300, 3)).astype(np.uint8)
Código completo:
from imageio import imsave
from skimage import color
import numpy as np
newImage = np.random.randint(0, 255, (300, 300, 3)).astype(np.uint8)
in_hsv_h = color.convert_colorspace(newImage, 'RGB', 'HSV')
in_hsv_s = in_hsv_h.copy()
in_hsv_v = in_hsv_h.copy()
for i in range(newImage.shape[0]):
in_hsv_h[i,:,0] = np.sort(in_hsv_h[i,:,0])
in_hsv_s[i,:,1] = np.sort(in_hsv_s[i,:,1])
in_hsv_v[i,:,2] = np.sort(in_hsv_v[i,:,2])
imsave('testing-sorted-hue.png', (color.convert_colorspace(in_hsv_h, 'HSV', 'RGB')*255).astype(np.uint8))
imsave('testing-sorted-saturation.png', (color.convert_colorspace(in_hsv_s, 'HSV', 'RGB')*255).astype(np.uint8))
Observación:
El ejemplo en makeartwithpython usa from imageio import imsave
en vez de from scipy.misc import imsave
y el ejemplo en el sitio funciona correctamente.
Nota:
No tengo mucha experiencia en programación de Python, tome mi respuesta con precaución.