使用CV2或PIL将Numpy数组转换为图像

时间:2018-06-04 11:10:04

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

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

这是我尝试使用CV2将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)

任何想法?

提前致谢。

1 个答案:

答案 0 :(得分:4)

大多数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是有损压缩),尝试将它们保存为另一种具有无损压缩的格式。