读取单张与多张分割掩码图像时unique值不匹配问题
问题原因分析:批量与单张读取分割掩码的unique值差异
核心差异来源
1. 灰度转换与像素值归一化
批量处理时,你调用了skimage.io.imread(mask,as_gray="True"):
as_gray参数会将图像转为灰度图,同时把原始uint8类型的0/255像素值归一化到[0,1]的float64范围。- 单张读取时未设置该参数,图像保留原始
uint8格式,像素值维持0和255。
2. 图像resize的插值操作
批量流程中使用了resize(mask,(1024,768)):
- skimage的
resize函数默认采用双线性插值(order=1)调整尺寸,插值过程会对相邻像素加权计算,生成大量介于0和1之间的中间浮点值,彻底破坏了原本的二值掩码特性。 - 单张读取没有resize步骤,自然保留原始二值结果。
批量处理保留二值掩码的修正方案
如果需要在批量处理中维持二值掩码,可调整代码如下:
import glob import skimage.io from skimage.transform import resize import numpy mask_names = glob.glob("./drive/MyDrive/ISBI2016_ISIC_Part3B_Training_Data/*.png") mask_names.sort() mask_names_subset = mask_names[0:30] mask_list = [] for mask in mask_names_subset: # 读取原始uint8格式图像,跳过灰度归一化 mask = skimage.io.imread(mask) # 使用最近邻插值resize,避免生成中间值 mask1 = resize(mask, (1024, 768), order=0, preserve_range=True) # 阈值化确保转回二值(处理插值可能的微小误差) mask1 = (mask1 > 127).astype(numpy.uint8) * 255 mask_list.append(mask1) mask_dataset = numpy.array(mask_list) print(numpy.unique(mask_dataset[2]))
内容的提问来源于stack exchange,提问作者Manbir Singh
相关产品推荐
相关产品推荐

