Skip to main content
 首页 » 编程设计

python之从 float64 到 uint8 的有损转换

2024年08月12日42mfryf

代码来自 https://www.makeartwithpython.com/blog/visualizing-sort-algorithms-in-python/

from imageio import imsave 
 
import numpy as np 
 
newImage = np.random.randint(0, 255, (300, 300, 3)) 
 
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')) 
imsave('testing-sorted-saturation.png', color.convert_colorspace(in_hsv_s, 'HSV', 'RGB')) 

从 float64 到 uint8 的有损转换。范围 [0, 1]。在保存之前将图像转换为 uint8 以抑制此警告。

还是很新手,有什么快速解决这个问题的方法吗?

请您参考如下方法:

警告是不言自明的:color.convert_colorspace(in_hsv_h, 'HSV', 'RGB') 是 float64 类型,并且 imsave,将元素转换为 uint8。

PNG 图像的像素,以每个组件一个字节的形式存储(红色一个字节,绿色一个字节,蓝色一个字节)。
每个组件都是 [0, 255] 范围内的整数值(类型 uint8)。

color.convert_colorspace 的输出是float64,每个颜色分量在[0, 1]范围内,类型float64(在内存中存储为64位,并且比 uint8 准确得多)。

从 float64 范围 [0, 1] 到 uint8 范围 [0, 255] 的转换执行如下: uint8_val = round(float64_val*255) 。
舍入操作丢失了一些数据(例如:如果 float64_val*255 = 132.658,结果将舍入为 133)。

Convert image to uint8 prior to saving to suppress this warning

告诉您在保存之前将图像元素转换为 uint8。

解决方法很简单。
乘以 255,然后添加 .astype(np.uint8)。

imsave('testing-sorted-hue.png', (color.convert_colorspace(in_hsv_h, 'HSV', 'RGB')*255).astype(np.uint8)) 

为了让您的代码正常工作,您还应该在构建 newImage 时添加 .astype(np.uint8):

newImage = np.random.randint(0, 255, (300, 300, 3)).astype(np.uint8) 

完整代码:

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)) 

备注:
makeartwithpython 中的示例使用 from imageio import imsave 而不是 from scipy.misc import imsave,站点中的示例工作正常。

注意:
我没有很多 Python 编程经验,请谨慎接受我的回答。