python中rgb图像的平均灰度

时间:2014-10-05 10:43:48

标签: image python-2.7 image-processing numpy

我有一个RGB图像,我在其三个通道中分割(我也有每个通道的图表)。如何通过三个通道的平均值获得灰度图像? 我做了

    np.average(my_image)

我得到了平均值,但是如果我做了

    imshow(np.average(my_image)

我无法绘制图像并实际看到它(我收到错误:图像数据的尺寸无效)

1 个答案:

答案 0 :(得分:1)

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

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