在TensorFlow中将张量保存为图像

时间:2018-06-23 18:47:20

标签: python tensorflow back-projection

这可能是一个简单的问题。我只是想对图像进行radon转换并使用TensorFlow中的函数保存它。但是结果不对。我知道我可以使用plt.imsave()正确保存图像,但是我想知道如何在TensorFlow中进行操作。

我是TensorFlow的新手,感谢您的帮助。

This is the shepp-logan.jpg image I use. It is a grayscale image with size 64*64

This is the saved image

这是我的代码。

from skimage.transform import radon,iradon
import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np

sess = tf.Session()
img = plt.imread('shepp-logan.jpg')
theta = np.linspace(0., 180., max(img.shape), endpoint=False)
sinogram = radon(img, theta=theta, circle=True)
sinogram = tf.cast(sinogram, tf.uint8)
sinogram = tf.expand_dims(sinogram, -1)
sinogram = tf.image.encode_jpeg(sinogram, quality=100, format='grayscale')
writer = tf.write_file('test_sinogram.jpg', sinogram)
sess.run(writer)

1 个答案:

答案 0 :(得分:2)

问题在于函数radon返回的值对于tensorflow而言太高了。 Tensorflow希望每个通道的值在0到255(uint8)之间。

我没想到是什么原因,但是在查看sinogram中的值之后,我进行了快速测试,并决定除以np.max(sinogram),结果看起来更接近于您的期望相信:)

from skimage.transform import radon,iradon
import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np

sess = tf.Session()
img = plt.imread('shepp-logan.jpg')
theta = np.linspace(0., 180., max(img.shape), endpoint=False)
sinogram = radon(img, theta=theta, circle=True)

# scaling the values here
sinogram = 255*sinogram/np.max(sinogram)

sinogram = tf.cast(sinogram, tf.uint8)
sinogram = tf.expand_dims(sinogram, -1)
sinogram = tf.image.encode_jpeg(sinogram, quality=100, format='grayscale')
writer = tf.write_file('test_sinogram.jpg', sinogram)
sess.run(writer)

对于张量板,我建议您使用tf.summary.image:https://www.tensorflow.org/api_docs/python/tf/summary/image

这是张量板的指南:https://www.tensorflow.org/programmers_guide/summaries_and_tensorboard