有一些公式可以将彩色图像转换为灰度图像。
它们的选择非常明确,选择通常取决于您想要更亮还是更暗的结果、更好的对比度等。
三个常用公式在这里 https://www.johndcook.com/blog/2009/08/24/algorithms-convert-color-grayscale/。让我们采用“光度”公式。
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 似乎是这样,但这些层的目的是减少“空间”维度,而不是“通道”。您需要大量的解决方法和重塑才能使这些池层之一应用于通道。
如果您更喜欢使用张量流中的现成公式,请再次使用 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)
正如斯捷潘·诺维科夫评论的那样。如果您的想法只是预处理图像,您可以使用其他工具并避免麻烦。
仅当跟踪此操作中的梯度对您来说很重要时,您才需要在模型内执行此操作。