我有一个RGB图像,我在其三个通道中分割(我也有每个通道的图表)。如何通过三个通道的平均值获得灰度图像? 我做了
np.average(my_image)
我得到了平均值,但是如果我做了
imshow(np.average(my_image)
我无法绘制图像并实际看到它(我收到错误:图像数据的尺寸无效)
答案 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()
使用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