ImageDataGenerator (Keras) 中 channel_shift_range 和 brightness_range 的区别?

Difference between channel_shift_range and brightness_range in ImageDataGenerator (Keras)?

有多个页面(如 this and this)展示了有关图像中 channel_shift_range 效果的示例。乍一看,图像似乎只是应用了亮度变化。

This issue 有多条评论提到了这一观察结果。那么,如果 channel_shift_rangebrightness_range 做同样的事情,为什么它们都存在?

频道转换和亮度变化完全不同。

Channel Shift: Channel Shift通过改变[R,G,B]通道来改变像素的颜色饱和度(例如浅色Red/dark红色)输入图像。 Channel shift用于在数据集中引入颜色增强,使模型学习基于颜色的特征,而不管其饱和度值如何。 以下是文章中提到的频道转换示例: 在上图中,如果你仔细观察,物体(特别是云区域)即使在通道偏移增强之后仍然清晰可见并且与邻近区域区分开来。

亮度变化:图像的亮度水平解释了整个图像的光强度,并用于在数据集中添加曝光不足和过度曝光增强。 下面是亮度增强的例子: 在上图中,在低亮度值下,物体(例如云)由于光线强度水平低而失去了可见性。

经过长时间的逆向工程,我发现:

  • channel_shift_range:对所有像素应用(R + i, G + i, B + i)操作在图像中,其中 i[0, 255][= 范围内的整数值42=].
  • brightness_range:对所有像素应用(R * f, G * f, B * f)操作在图像中,其中 f1.0[=43 附近的浮点值=].

这两个参数都与亮度有关,但是,我发现了一个非常有趣的区别:channel_shift_range应用的操作大致保留图像的对比度,而brightness_range 应用的运算大致 乘以 图像的对比度 f 并大致 保留它的饱和度。重要的是要注意,对于 if[ 的大值,这些结论无法实现。 =42=],因为图像的亮度会很强烈,它会丢失很多信息。