OpenVINO开发小组
直播中

胖子的逆袭

13年用户 1184经验值
私信 关注
[问答]

为什么无法使用“numpy.array”函数加载图像文件?


  • 创建了一个指定形状的数组,并用随机值填充它: random_input_data = np.random.randn(1, 3, 224, 224).astype(np.float16)
  • 将随机值替换为图像文件: random_input_data = np.array(r"image.png").astype(np.float16)
  • 遇到错误: ValueError: 无法将字符串转换为浮点数

回帖(2)

田野

2025-3-6 14:13:00
使用 cv2.imread(“image.png”)
举报

hsdou月半

2025-3-6 17:46:33

你遇到的错误是因为你尝试将字符串 "image.png" 直接转换为浮点数,而 numpy.array 函数无法直接将图像文件路径转换为数组。要加载图像文件并将其转换为 NumPy 数组,你需要使用专门的图像处理库,如 PillowOpenCV


以下是使用 PillowOpenCV 加载图像并将其转换为 NumPy 数组的示例:


使用 Pillow 加载图像


from PIL import Image
import numpy as np

# 加载图像
image = Image.open("image.png")

# 将图像转换为 NumPy 数组
image_array = np.array(image)

# 如果需要将图像转换为 float16 类型
image_array = image_array.astype(np.float16)

print(image_array.shape)

使用 OpenCV 加载图像


import cv2
import numpy as np

# 加载图像
image = cv2.imread("image.png")

# 将图像转换为 NumPy 数组
image_array = np.array(image)

# 如果需要将图像转换为 float16 类型
image_array = image_array.astype(np.float16)

print(image_array.shape)

注意事项




  1. 图像形状:加载的图像数组的形状通常是 (height, width, channels),其中 channels 通常是 3(RGB)或 1(灰度)。如果你需要将图像转换为 (1, 3, 224, 224) 的形状,你可能需要对图像进行额外的处理,如调整大小和添加批次维度。




  2. 数据类型:图像通常以 uint8 类型加载(像素值范围为 0-255)。如果你需要 float16 类型,记得进行类型转换。




  3. 图像路径:确保图像路径是正确的,并且图像文件存在。




调整图像形状


如果你需要将图像调整为 (1, 3, 224, 224) 的形状,可以使用以下代码:


from PIL import Image
import numpy as np

# 加载图像
image = Image.open("image.png")

# 调整图像大小
image = image.resize((224, 224))

# 将图像转换为 NumPy 数组
image_array = np.array(image)

# 如果图像是灰度图,转换为 3 通道
if len(image_array.shape) == 2:
    image_array = np.stack([image_array] * 3, axis=-1)

# 添加批次维度并转置为 (1, 3, 224, 224)
image_array = np.transpose(image_array, (2, 0, 1))[np.newaxis, ...]

# 转换为 float16 类型
image_array = image_array.astype(np.float16)

print(image_array.shape)

这样,你就可以成功地将图像文件加载为 NumPy 数组,并将其转换为所需的形状和数据类型。

举报

更多回帖

×
20
完善资料,
赚取积分