代码之家  ›  专栏  ›  技术社区  ›  A.M

使用cv2或pil将numpy数组转换为图像

  •  3
  • A.M  · 技术社区  · 7 年前

    我正在尝试使用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 回复  |  直到 7 年前
        1
  •  4
  •   Jeru Luke    7 年前

    大多数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是有损压缩)如果您想要相同的图像,请尝试将它们保存为另一种有损压缩的格式。