2017-10-19 47 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張量或張量張量,那麼確定,但如果不是,則梯度將丟失(如果梯度很重要)。 –