Skip to main content
 首页 » 编程设计

python之在 TensorFlow 中将张量保存为图像

2024年08月15日29cloudgamer

这可能是一个简单的问题。我只是想对图像进行氡变换并使用 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) 

请您参考如下方法:

问题是函数 radon 返回的值对于 tensorflow 来说太高了。 Tensorflow 希望每个 channel 的值介于 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) 

至于我推荐你使用的tensorboard,你必须使用tf.summary.image: https://www.tensorflow.org/api_docs/python/tf/summary/image

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