我正在尝试训练一个神经网络(自动编码器),该神经网络从文件夹中读取“ .tif”图像,因此我决定使用ImageDataGenerator类。图像值是变量,有时最大值可以是4000,有时可以是0.5,但是当我使用上述类及其方法(flow_from_directory或flow_from_dataframe)时,图像会自动缩放。是否可以保留以前的值?代码有什么问题吗?
train_datagen = ImageDataGenerator(shear_range=0.2,zoom_range=0.2,horizontal_flip=True,dtype='float32')
train_generator = train_datagen.flow_from_directory(directory =train_data_dir,color_mode = 'grayscale',target_size=(img_width, img_height),batch_size=batch_size,class_mode='input',)
我以这种方式控制输入图像:
batch = np.concatenate([next(train_generator)[0] for _ in range(2)])
我希望输入的图像具有不同的值范围,但是似乎每个图像的像素都在[0,255]范围内。
答案 0 :(得分:2)
在后台,ImageDataGenerator uses PIL to load images。将颜色模式设置为灰度时,您会发现.tif图像是通过PIL打开并转换为“ L”模式的(亮度,请参见this excellent explanation在PIL中的不同颜色模式下进行):
...
img = pil_image.open(path)
if color_mode == 'grayscale':
if img.mode != 'L':
img = img.convert('L')
...
L模式意味着您的图像将由包含1字节亮度值的单通道数组表示。这些是您提到的0到255之间的值。
现在,PIL不是probably最好的读取tiff图像的库。如果要将图像的原始值传递到神经网络,则可能需要编写一个自定义的python生成器(有很多教程),该生成器使用适合读取tif并进行转换的第三方库读取图像它们为numpy数组。