用Python从三个float32 numpy数组创建RGB图像

8
我有三个数组,每个数组的大小为400x600,代表我想制作的图片的三种颜色。
我在这里找到了一个潜在的方法:http://docs.scipy.org/doc/scipy-0.13.0/reference/generated/scipy.misc.imsave.html,但是他们要求我将浮点数转换为uint8。如果我通过'image.dtype = np.uint8'改变数据类型,那么维度会变成400x600x24(而当我不改变数据类型时,它是400x600x3)。
我该如何解决这个问题?(其他方法也可以)
2个回答

18

image.dtype = np.uint8 强制将 float64 类型转换为 uint8 类型。由于每个 float64 占用 8 个字节,而每个 uint8 只占用 1 个字节,因此您会获得 8 倍的值。

为了转换这些值,可以使用 astype 方法,而不是重新解释字节:

image = image.astype(np.uint8)

然而,出于两个原因,这可能并不是非常有用。首先,最重要的一点,您的浮点值可能全部在0.0-1.0范围内。其次, astype 截断而不是四舍五入。因此,转换为整数只会使它们中的大部分变为0,其余变为1,而不是从0-255平滑地范围变化。

所以,您可能需要像这样:

image = (image * 255).round().astype(np.uint8)

1
感谢 @abarnert!这正是我所寻找的,从像sklearn.datasets.fetch_olivetti_faces()这样具有float32类型和值范围在0-1之间的数据集中加载图像,以便与使用uint8类型和值范围在0-255之间的OpenCV 软件配合使用。
import numpy as np
import cv2 as cv
from sklearn import datasets

data = datasets.fetch_olivetti_faces()
image = data.images[15]
image

``` 数组([[0.6694215, 0.6818182, 0.7066116, ..., 0.5082645, 0.55785125, 0.58677685], [0.677686, 0.70247936, 0.71487606, ..., 0.5289256, 0.5495868, 0.58264464], [0.6983471, 0.7107438, 0.70247936, ..., 0.5495868, 0.55785125, 0.5785124], ..., [0.59917355, 0.59917355, 0.54545456, ..., 0.10743801, 0.11157025, 0.10330579], [0.59090906, 0.6198347, 0.5785124, ..., 0.11157025, 0.10743801, 0.10743801], [0.5661157, 0.6280992, 0.59917355, ..., 0.11157025, 0.11157025, 0.10743801]], dtype=float32) ```
img = (image * 255).round().astype(np.uint8)
img

数组([[171, 174, 180, ..., 130, 142, 150], [173, 179, 182, ..., 135, 140, 149], [178, 181, 179, ..., 140, 142, 148], ..., [153, 153, 139, ..., 27, 28, 26], [151, 158, 148, ..., 28, 27, 27], [144, 160, 153, ..., 28, 28, 27]], 数据类型=无符号整数8位) img现在准备在cv库中进行进一步处理。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接