使用tf.reduce_mean&的灰度转换tf.concat

时间:2016-10-25 08:29:15

标签: python python-3.x tensorflow

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)

enter image description here

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

When grayscale fails

想知道发生了什么我检查了我的变量,结果表明平均值不合适,已在下面的截图中显示,意思是(147,137,88)!= 38

enter image description here

有什么想法吗? 无法弄清楚我做错了什么......

谢谢! pltrdy

1 个答案:

答案 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时的结果(不是很有说服力吗?):

enter image description here

在绘制适合pyplot规范之前,将dtype更改回uint8:

(see lib doc about imshow) 提到它一定是uint8。由于某些原因,使用uint16不起作用(它看起来像是反色。我的意思是在之前的灰度转换中暗区是白色的。不知道为什么)。

在运行之前使用tf.cast回到uint_(例如out = tf.cast(out, tf.uint8))会在下面给出良好的灰度转换:

enter image description here