将图像转换为单热阵列并返回返回黑色图像

时间:2018-03-20 13:11:32

标签: python numpy tensorflow one-hot-encoding

我有一个numpy数组的3个灰度图像,只有0和255个值(shape: (3, 512, 512))。我使用tf.one_hotshape: (3, 512, 512, 2))将它们转换为一个热门编码为2个类。现在,我正试图通过np.argmax将它们恢复原状。但是当我阅读图像时,它们都是黑色的。

    labels = []
    labels.append(label_1)
    labels.append(label_2)
    labels.append(label_3)
    labels = np.asarray(labels)

    print(labels.shape)                # (3, 512, 512)

    sess = tf.InteractiveSession()

    labels = tf.one_hot(labels, 2)     # (3, 512, 52, 2)
    print(labels.shape)
    #print(labels)

    labels = labels.eval()             # to convert to numpy array from tensor

    imgs = np.argmax(labels, axis=3)   # also tried tf.argmax
    print(imgs.shape)                  # (3, 512, 512)

    for i in range(imgs.shape[0]):
        image = imgs[i]
        print(img.shape)               # (512, 512)
        indices = np.where(image > 0) 
        print(indices)                 # array([], dtype=int64), array([], dtype=int64)
        print(indices)
        image = Image.fromarray(image, 'L')
        image.show()                   # black images, values all zero

我确信我错过了一些非常简单但却无法理解的东西。任何帮助将不胜感激。感谢。

修改

我检查了数组具有非零值的索引。但是所有的值似乎都是零。所以,不是显示图像的问题。我认为问题出在argmax,但我不知道是什么。

1 个答案:

答案 0 :(得分:1)

Argmax返回在某个维度上出现最大值的索引。在您的情况下,您将argmax放在长度为2的维度上,因此对于(3,512,512)数组中的每个位置,它返回0或1。这两个选项在8位刻度上非常暗,并且显示为黑色!您必须确保将二进制图像显示为二进制文件。

之前我没有使用过此库,但可能会尝试mode='I'?或其他一些模式https://pillow.readthedocs.io/en/3.1.x/handbook/concepts.html#concept-modes。 argmax的返回类型很重要。