TensorFlow新手在这里训练a simple tutorial我失败了。 重点是将图像转换为灰度。
我们的数据基本上是HxWx3
(图片的高度,宽度和三个值r,g,b的颜色)。
所以它可能相当于将每个数组单元格从[r, g, b]
变换为[gray, gray, gray]
,其中gray = mean(r, g, b)
对吗?
因此,我检查了文档的平均函数并找到了reduce_mean。 我在颜色轴上使用它,即轴= 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()
(You can get original image here)
此代码可以执行,但结果不正常。
想知道发生了什么我检查了我的变量,结果表明平均值不合适,已在下面的截图中显示,意思是(147,137,88)!= 38
有什么想法吗? 无法弄清楚我做错了什么......
谢谢! pltrdy
答案 0 :(得分:2)
在计算平均值之前更改dtype(因为溢出):
错误来自占位符的dtype。导致类型推断,中间张量不能具有大于255(2 ^ 8-1)的值。当Tensorflow计算平均值(147,137,88)时,首先计算:sum(147,137,88)= 372,但372> 256,因此保持372%256 = 116。
所以意味着(147,137,88)=总和(147,137,88)/ 3 = 116/3 = 40。 将占位符的dtype更改为" uint16"或者" uint32"。
切换到uint16时的结果(不是很有说服力吗?):
在绘制适合pyplot规范之前,将dtype更改回uint8:
(see lib doc about imshow) 提到它一定是uint8。由于某些原因,使用uint16不起作用(它看起来像是反色。我的意思是在之前的灰度转换中暗区是白色的。不知道为什么)。
在运行之前使用tf.cast
回到uint_(例如out = tf.cast(out, tf.uint8)
)会在下面给出良好的灰度转换: