分配后图像模糊

时间:2017-01-24 12:28:37

标签: python numpy matplotlib tensorflow

我刚开始学习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()

Correct image

# This plots some blurred image
plt.imshow(X_data[2])
plt.show()

Blurred incorrect image

任何人都可以解释一下我在哪里出错了,在理解这项任务时我错过了什么概念。

2 个答案:

答案 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会自动将图片的vminvmax调整为X_data[2].min()X_data[2].max()默认情况下,如果没有提供它们。

如果您提供vmin=0vmax=255,则绘图应该相同(可能更合适),以便将数据四舍五入为无符号字节。

但是,可能不是这种情况,因为代码无法复制,因此我无法测试它:P。