2017-10-19 46 views
1

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

回答

3

有几个公式可将彩色图像转换为灰度图像。 他们很好决定,而且选择通常取决于您是否喜欢更亮或更暗的结果,更好的对比度等。

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(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) 

由于斯捷潘诺维科夫评论。如果您的想法仅仅是预处理图像,您可以使用其他工具并避免麻烦。

您只需要在模型内部执行此操作,以便跟踪此操作中的渐变对您很重要。

+0

我喜欢这个答案,但是值得考虑使用像skimage.color.rgb2grey这样的已存在的光度计算实现 - http://scikit-image.org/docs/0.12.x/​​api/skimage.color .html –

+0

我同意,如果你只是谈论预处理。对于模型运算,如果将张量看作keras张量或张量张量,那么确定,但如果不是,则梯度将丢失(如果梯度很重要)。 –