240719_图像二分类任务中图像像素值的转换-[0,255]-[0,1]
在做语义分割二分类任务时,有时下载到的数据集或者我们自己制作的数据集,标签像素值会是[0,255](或者含有一些杂乱像素),但在该类任务中,往往0代表背景,1,2……代表每个类别,我们是二分类,就需要把[0,255]转换成[0,1],以下是查看像素值的代码。
from PIL import Image
import numpy as np
# 打开图片文件
img = Image.open("D:\\mask255\\001.png")
# 将图像转换为 numpy 数组
data = np.array(img)
# 输出图像的像素矩阵
print(data)
此时如果使用的是pycharm,可以在第10行打断点,然后debug执行,点击下方监视窗口中的作为Array查看,就可以在右侧SciView中查看具体的像素值,不同的像素值会有颜色区分,例如图中1采用不同颜色。
以下是一份解决该问题的代码:
from PIL import Image
import numpy as np
import os
'''
将[0,255]的二值图像转成可以训练的[0,1]二值图像
'''
if __name__ == '__main__':
work_dir = "D:\\mask255" # 原图像所在文件夹,请更换为你自己的路径
output_dir = "D:\\mask1" # 处理后图像保存的文件夹,请更换为你自己的路径
if not os.path.exists(output_dir):
os.makedirs(output_dir) # 如果输出文件夹不存在,则创建它
file_names = os.listdir(work_dir)
for file_name in file_names:
file_path = os.path.join(work_dir, file_name)
image = Image.open(file_path)
img = np.array(image)
img[img != 0] = 1
# 重新保存到新文件夹
image = Image.fromarray(img, 'L')
new_name = file_name[:-4].strip("_Segmentation") # 文件名处理
output_path = os.path.join(output_dir, f"{new_name}.png") # 新的保存路径
image.save(output_path) # 保存到指定的输出文件夹
注意这样处理完了之后可能肉眼观察照片就是一片黑(右图),因为0和1差距太小了,如果需要观察可以使用以下代码:
import cv2
import numpy as np
from PIL import Image
# 假设 binary_data 是你的二值化后的 numpy 数组
binary_data = np.array(Image.open("D:\\mask1\\007.png")) > 0
# 将布尔数组转换为整数数组,以便于显示
binary_data = binary_data.astype(np.uint8) * 255
cv2.imshow('Binary Image', binary_data) # 显示图像
cv2.waitKey(0) # 等待按键,0表示无限等待
cv2.destroyAllWindows() # 销毁所有窗口