Keras RGB到灰度

时间:2017-10-19 18:14:13

标签: keras

我想要一个关于在Keras中将输入rgb图像转换为灰度图像的最佳方法的规范答案。 This answer暗示也许这样的事情最好用Lambda来实现,但这对我来说效率低下。在我看来Average Pooling layers应该能够做到这一点,但我似乎无法弄清楚这一点。是否存在我在文档中缺少的RGB到灰度层?看起来这是一个非常普通的操作。

2 个答案:

答案 0 :(得分:6)

有一些公式可以将彩色图像转换为灰度图像。 他们非常确定,选择通常取决于你是否喜欢更亮或更暗的结果,更好的对比度等。

Three common formulas are here。让我们来看看"光度"式。

result =  0.21 R + 0.72 G + 0.07 B

这只能通过lambda层来实现。并且它没有用处,它只是必要的数学。

def converter(x):

    #x has shape (batch, width, height, channels)
    return (0.21 * x[:,:,:,:1]) + (0.72 * x[:,:,:,1:2]) + (0.07 * x[:,:,:,-1:])

将此lambda图层添加到模型中:

Lambda(converter)

尽管AveragePooling似乎是这样,但这些层意味着减少空间"维度,而不是"渠道"。您需要大量的解决方法并重新整形,以使其中一个池模式适用于渠道。

如果您更喜欢使用tensorflow中的现成公式,请再次使用lambda图层,现在使用此函数,基于您提供的答案:

Lambda(lambda x: tf.image.rgb_to_grayscale(x))

converter的其他选项:

#perhaps faster? perhaps slower? 
def converter(x):

    weights = K.constant([[[[0.21 , 0.72 , 0.07]]]])
    return K.sum(x*weights, axis=-1,keepdims=True)

Stepan Novikov评论道。如果您的想法只是预处理图像,您可以使用其他工具并避免麻烦。

如果您需要在此操作中跟踪渐变,则只需在模型内执行此操作。

答案 1 :(得分:4)

在Keras中,有一种更简单的方法> = 2.1.6在RGB和灰度之间进行转换。使用ImageDataGenerator类增强图像数据时,可以使用flow_from_directory方法创建一个生成器对象,该对象可用于使用fit_generator方法来训练模型。

flow_from_directory方法的优点是它具有几个参数来执行更多图像处理,其中之一是color_mode,可以将其设置为“ rgb”或“灰度”。我不确定为什么此参数包含在生成器对象中,而不包含在ImageDataGenerator对象参数中,但是可以解决问题。

如果您愿意花点力气来设置生成器(文档:here),则可以使用此生成器以及其他一些有用的预处理参数。