Python 使用tf.reduce_mean&;海螺

Python 使用tf.reduce_mean&;海螺,python,python-3.x,tensorflow,Python,Python 3.x,Tensorflow,TensorFlow新手在这里训练,但我失败了。 重点是将图像转换为灰度 我们的数据基本上是一个HxWx3(三个值r、g、b上的图片高度、宽度和颜色) 因此,它可能相当于将每个数组单元从[r,g,b]转换为[gray,gray,gray],其中gray=mean(r,g,b)对吗 因此,我检查了一个均值函数的文档,发现。 我在颜色轴上使用它,即轴=2,然后再次使用轴2“复制”平均值,并最终得到3倍的灰度值(=平均值),即红色、绿色和蓝色 请参阅下面的代码: import tensorflow a

TensorFlow新手在这里训练,但我失败了。 重点是将图像转换为灰度

我们的数据基本上是一个
HxWx3
(三个值r、g、b上的图片高度、宽度和颜色)

因此,它可能相当于将每个数组单元从
[r,g,b]
转换为
[gray,gray,gray]
,其中
gray=mean(r,g,b)
对吗

因此,我检查了一个均值函数的文档,发现。 我在颜色轴上使用它,即轴=2,然后再次使用轴2“复制”平均值,并最终得到3倍的灰度值(=平均值),即红色、绿色和蓝色

请参阅下面的代码:

import tensorflow as tf
import matplotlib.image as mpimg

filename = "MarshOrchid.jpg"
raw_image_data = mpimg.imread(filename)

image = tf.placeholder("uint8", [None, None, 3])

# Reduce axis 2 by mean (= color)
# i.e. image = [[[r,g,b], ...]] 
# out = [[[ grayvalue ], ... ]] where grayvalue = mean(r, g, b)
out = tf.reduce_mean(image, 2, keep_dims=True)

# Associate r,g,b to the same mean value = concat mean on axis 2.
# out = [[[ grayvalu, grayvalue, grayvalue], ...]]
out = tf.concat(2, [out, out, out])

with tf.Session() as session:
    result = session.run(out, feed_dict={image: raw_image_data})

print(result.shape)
plt.imshow(result)
plt.show()

此代码可以执行,但结果不正常

想知道发生了什么,我检查了我的变量,结果发现平均值不正确,如下面的屏幕截图所示,平均值(147137,88)!=三十八

有什么想法吗? 不知道我做错了什么

谢谢!
pltrdy在计算平均值之前更改数据类型(因为溢出):

错误来自占位符的数据类型。由于类型推断,中间张量的值不能大于255(2^8-1)。当Tensorflow计算平均值(147137,88)时,它首先计算:sum(147137,88)=372,但372>256,所以它保持372%256=116

所以平均值(147137,88)=和(147137,88)/3=116/3=40。 将占位符的数据类型更改为“uint16”或“uint32”

切换到uint16时的结果(不是很有说服力吧?):

在打印之前将数据类型更改回uint8,以符合pyplot规范:

提到它必须是uint8。由于某些原因,使用uint16不起作用(它看起来像是反转颜色。我的意思是,在以前的灰度变换中,深色区域是白色的。不知道为什么)

在运行之前使用
tf.cast
(例如
out=tf.cast(out,tf.uint8)
)返回到uint_uuu,可获得以下良好的灰度变换:


确实如此!干得好&谢谢。尽管如此,它看起来像是反转的颜色(图像的黑色部分在灰度上接近白色)。奇怪,我会调查的,那是另一个问题