gpt4 book ai didi

python - 从 float64 到 uint8 的有损转换

转载 作者:太空宇宙 更新时间:2023-11-03 23:52:31 25 4
gpt4 key购买 nike

代码来自 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 编程经验,请谨慎接受我的回答。

关于python - 从 float64 到 uint8 的有损转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58893860/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com