我刚开始学习Tensorflow和Numpy的概念。我正在使用Tensorflow将不同形状的图像重塑为一个固定的形状,我正在利用它来循环。在循环结束时,我将这个重新整形的图像累积到一个数组中。现在,如果我从这个数组绘制图像,我会得到模糊的图像。但是如果我使用Tensorflow绘制重塑图像的实例,我会得到正确的图像。请问有人可以解释一下我在哪里出错吗?
代码:
fixedW = 227.0
fixedH = 227.0
X_data = np.zeros((3, fixedW, fixedH, 3), dtype = np.float32) # Only 3 images in this example
tf.reset_default_graph()
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
for i in range(3):
img = matplotlib.image.imread(image_file_name[i])
preshape = img.shape
img = np.reshape(img, (1, preshape[0], preshape[1], preshape[2])) #Make it single batched image
tf_img = tf.image.resize_images(img, (fixedW, fixedH), tf.image.ResizeMethod.NEAREST_NEIGHBOR)
resized_img = sess.run(tf_img)[0]
print(resized_img.shape) # Prints correctly
X_data[i, :, :, :] = resized_img[:, :, :] # Something is wrong here
# This plots correctly
plt.imshow(resized_img)
plt.show()
# This plots some blurred image
plt.imshow(X_data[2])
plt.show()
任何人都可以解释一下我在哪里出错了,在理解这项任务时我错过了什么概念。
答案 0 :(得分:0)
我有解决方案。问题出在X_data类型上。函数imshow
仅采用uint8或float32类型的值,而且值必须在0.0到1.0的范围内。
我的变量X_data接受了float32的类型,但是值大于1.因此将X_data的类型转换为uint8解决了这个问题。
以下是解决方案专栏:
X_data = np.zeros((3, fixedW, fixedH, 3), dtype = np.uint8)
答案 1 :(得分:0)
如果将数据转换为uint8
可以解决问题,则以下内容可能会解决此问题(无需将数组声明为uint8
):
plt.imshow(X_data[2], vmin=0, vmax=255)
从你的问题来看,我确实知道你的浮动图像实际上在[0, 255]
的范围内(这是转换为uint的结果)。
真正的问题似乎是matplotlib的imshow
会自动将图片的vmin
和vmax
调整为X_data[2].min()
和X_data[2].max()
默认情况下,如果没有提供它们。
如果您提供vmin=0
和vmax=255
,则绘图应该相同(可能更合适),以便将数据四舍五入为无符号字节。
但是,可能不是这种情况,因为代码无法复制,因此我无法测试它:P。