首页 > 解决方案 > 在 Go 中读取图像文件与在 Python 中读取图像文件

问题描述

我有用 Python 编写的代码,它使用PIL库读取图像文件,并将其转换为 n 维 numpyuint8值数组:

    def load_image_into_numpy_array(image):
          (im_width, im_height) = image.size
          return np.array(image.getdata()).reshape((im_height, im_width, 3)).astype(np.uint8)

    image_raw = Image.open(img)
    image = load_image_into_numpy_array(image_raw)

一旦我尝试打印从 到 的像素值image[0][0][0]image[9][0][0]我会得到以下输出:

image[0][0][0] = 51
image[1][0][0] = 51
image[2][0][0] = 47
image[3][0][0] = 40
image[4][0][0] = 38
image[5][0][0] = 48
image[6][0][0] = 65
image[7][0][0] = 81
image[8][0][0] = 94
image[9][0][0] = 89
image[10][0][0] = 84

在 Go 中,我通过调用ioutil.ReadFile函数读取图像,并通过调用 Go 的 Tensorflow API 将其转换为 Tensor,如下所示:

b, err := ioutil.ReadFile(imagePath)
if err != nil {
    return nil, err
}

tensor, err := tf.NewTensor(string(b))
if err != nil {
    return nil, err
}

一旦我通过 a 运行这个张量tf.Session以便我可以将它的值转换为uint8,扩展它的尺寸以便它与模型输入匹配并尝试打印从 到 的像素值tensor[0][0][0][0]tensor[0][9][0][0]我得到以下输出:

tensor[0][0][0][0]: 50
tensor[0][1][0][0]: 48
tensor[0][2][0][0]: 45
tensor[0][3][0][0]: 39
tensor[0][4][0][0]: 37
tensor[0][5][0][0]: 47
tensor[0][6][0][0]: 65
tensor[0][7][0][0]: 80
tensor[0][8][0][0]: 95
tensor[0][9][0][0]: 88

我认为当使用PIL库在 python 中读取图像时,它会在内部将字节数组解码为特定格式的图像。在 Go 中,我正在读取一个字节数组并将其按原样转换为张量。没有解码阶段。

我无法在 Python 中更改代码,这意味着我必须找到一种方法来解码ReadFile函数读取的字节数组,就像PIL.Image.open解码它一样。

Go 中是否有一个包可以让我以与 PIL 相同的方式读取图像。解决此类问题的最佳方法是什么?可能找出PIL.Image库是否包装了某个 C 函数并在 Go 中创建相同的包装器函数?

标签: pythontensorflowgopython-imaging-library

解决方案


推荐阅读