2014-10-05 355 views
1

我有一個RGB圖像,我在其三個通道(我也有每個通道的情節)分裂。如何通過三個通道的平均值獲得灰度圖像? 我做python中的rgb圖像的平均灰度

np.average(my_image) 

和我得到的平均值回來,但如果我這樣做

imshow(np.average(my_image) 

我不能繪製圖像和實際看到它(我得到了錯誤:圖像尺寸無效數據)

回答

0

爲了平均過的my_image最後軸,使用

np.average(my_image, axis=-1) 

如果my_image具有形狀(H, W, 3),然後np.average(my_image, axis=-1)將返回形狀(H, W)的陣列。

例如,

In [9]: my_image = np.arange(18).reshape((3,2,3)) 

In [10]: np.average(my_image, axis=-1) 
Out[10]: 
array([[ 1., 4.], 
     [ 7., 10.], 
     [ 13., 16.]]) 

沒有axis=-1np.average取平均在陣列中的所有值。

In [11]: np.average(my_image) 
Out[11]: 8.5 

imshow需要一個數組,而不是一個浮點數。這就是爲什麼你會收到「無效的維度」錯誤。


要使用matplotlib顯示陣列作爲灰度圖像:

In [24]: arr = np.average(my_image, axis=-1) 

In [25]: plt.imshow(arr, interpolation='nearest', cmap=plt.get_cmap('gray')) 
Out[25]: <matplotlib.image.AxesImage at 0xa8f01cc> 

In [26]: plt.show() 

enter image description here


要使用使灰度圖像PIL:

import Image 
import numpy as np 

my_image = np.linspace(0, 255, 300*200*3).reshape((300,200,3)) 
arr = np.average(my_image, axis=-1) 

img = Image.fromarray(arr.astype('uint8')) 
img.save('/tmp/out.png') 

enter image description here


注意,還有其他的方式可將RGB圖像轉換爲灰度圖像比取均值。例如,發光度由以下定義:

0.21 R + 0.72 G + 0.07 B 

並且在實踐中tends to produce a better result

+0

我試過第一種方法,它對我的​​目的非常完美,謝謝! – theggg 2014-10-05 13:10:35