python-3.x - 使用 OpenCV 或 PIL 将 Numpy 数组转换为图像

标签 python-3.x numpy opencv python-imaging-library

我正在尝试使用 OpenCV 或 PIL 库将我的数组转换为图像,在这两个库中,我都得到了颜色混合的图像。

这是我尝试使用 OpenCV 将 Numpy 数组转换为图像的方式:

   for i in range(len(batch_tx)):
        cls_pred = sess.run(y_pred_cls, feed_dict={x: batch_tx})
        cls_true = sess.run(tf.argmax(batch_ty, 1))
        img = cv2.resize(batch_tx[i], (FLAGS.img_size, FLAGS.img_size))
        img = cv2.cvtColor(img.astype(np.uint8), cv2.COLOR_BGR2RGB)
        cv2.imwrite(
            './saveImage/img' + str(i) + ': ' + 'True: ' + str(cls_true[i]) + ', Pred:' +
            str(cls_pred[i]) + '.JPEG', img)

我所有图像的输出如下图(这是一张船的图像)

enter image description here

我也尝试了 PIL 库并获得了相同的输出。

batch_tx[1] 是我数据集中第一张图片的数组,类型是 numpy.ndarray,形状为 (96,96,3)

有什么想法吗?

提前致谢。

最佳答案

大多数 OpenCV 函数仅适用于 BGR 图像,不适用于 RGB,例如 imshow 或 imwrite。 OpenCV 将为您完成工作,以正确的方式放置它并将其保存为 JPG 图像,可以由任何其他应用程序加载。如果您将它与另一个订单一起使用,那么该函数将不知道这一点并以错误的顺序保存它。

删除这一行:

img = cv2.cvtColor(img.astype(np.uint8), cv2.COLOR_BGR2RGB)

应该为您完成工作。

我的猜测是它的格式也不正确 (np.uint8),因为您在我刚刚告诉您要删除的行中使用了它。因此,您还必须将保存部分更改为:

cv2.imwrite(
            './saveImage/img' + str(i) + ': ' + 'True: ' + str(cls_true[i]) + ', Pred:' +
            str(cls_pred[i]) + '.JPEG', img.astype(np.uint8))

现在一切正常。此图像也可以使用 PIL 和任何其他库在另一时刻加载,您将获得几乎相同的图像(JPG 是有损压缩)如果您想要相同,请尝试将它们保存为具有无损压缩的另一种格式。

关于python-3.x - 使用 OpenCV 或 PIL 将 Numpy 数组转换为图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50679202/

相关文章:

c++ - 如何在opencv中实现局部阈值化

python - 在一对多加入 Pandas 中分配值(value)

python - 获取已编译函数对象的函数

python - 对于 numpy 数组的每一行,将特定元素设置为 n

python - 对于二维 numpy 数组的每一行,获取第二个二维数组中相等行的索引

Python:为什么是 `np.sum([x for x in c]) != np.sum(x for x in c)`

c++ - 使用 OpenCV 从一组 2D 图像切片重建 3D 模型?

c++ - 使用同一词典中的多个标记进行 Aruco 标记跟踪

python - 使用Python操作Excel电子表格

python - 递归压平列表,跟踪递归深度