1
我有一個RGB圖像,我在其三個通道(我也有每個通道的情節)分裂。如何通過三個通道的平均值獲得灰度圖像? 我做python中的rgb圖像的平均灰度
np.average(my_image)
和我得到的平均值回來,但如果我這樣做
imshow(np.average(my_image)
我不能繪製圖像和實際看到它(我得到了錯誤:圖像尺寸無效數據)
我有一個RGB圖像,我在其三個通道(我也有每個通道的情節)分裂。如何通過三個通道的平均值獲得灰度圖像? 我做python中的rgb圖像的平均灰度
np.average(my_image)
和我得到的平均值回來,但如果我這樣做
imshow(np.average(my_image)
我不能繪製圖像和實際看到它(我得到了錯誤:圖像尺寸無效數據)
爲了平均過的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=-1
,np.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()
要使用使灰度圖像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')
注意,還有其他的方式可將RGB圖像轉換爲灰度圖像比取均值。例如,發光度由以下定義:
0.21 R + 0.72 G + 0.07 B
我試過第一種方法,它對我的目的非常完美,謝謝! – theggg 2014-10-05 13:10:35