图像转独热数组再还原后出现全黑图像问题求助
问题分析与解决方案
嘿,我知道你为啥还原后图像全黑了——问题出在原始标签值和one-hot编码的类别索引不匹配上,咱们一步步理清楚:
核心问题
你的原始标签是0和255,但tf.one_hot的输入需要的是类别索引(比如0和1对应2类),而不是像素值。当你直接把255喂给tf.one_hot(depth=2)时:
- TensorFlow会把
255当成超出[0, depth-1]的无效索引,对应的独热向量会变成全0 - 之后用
np.argmax时,全0向量的最大值索引是0,所以还原后所有像素都变成了0,自然显示全黑
修正步骤(附修改后的代码)
我们需要先把0/255的像素值转换成0/1的类别索引,再做one-hot编码,最后还原时再转回去:
labels = [] labels.append(label_1) labels.append(label_2) labels.append(label_3) labels = np.asarray(labels) print(labels.shape) # (3, 512, 512) # 第一步:把0/255转换成0/1的类别索引(两种方式任选其一) # 方式1:用np.where labels_idx = np.where(labels == 255, 1, 0) # 方式2:更简洁的整数除法(255//255=1,0//255=0) # labels_idx = labels // 255 sess = tf.InteractiveSession() # 第二步:正确生成2类独热编码 one_hot_labels = tf.one_hot(labels_idx, depth=2) one_hot_np = one_hot_labels.eval() # 得到形状(3,512,512,2)的数组 # 第三步:还原并转回0/255的像素值 restored_idx = np.argmax(one_hot_np, axis=-1) # 得到0/1的索引 restored_labels = restored_idx * 255 # 把1转回255,0保持不变 # 现在显示restored_labels就会和原始图像一致了!
验证要点
- 转换后的
labels_idx应该只有0和1两个值 one_hot_np中,原始0对应的是[1,0],原始255对应的是[0,1]- 还原后的
restored_labels形状回到(3,512,512),值为0和255
内容的提问来源于stack exchange,提问作者Anakin
相关产品推荐
相关产品推荐

