出现tf.image.convert_image_dtype错误?值未缩放

时间:2019-03-03 18:21:08

标签: python image tensorflow machine-learning

我正在使用Tensorflow的image.convert_image_dtype https://www.tensorflow.org/api_docs/python/tf/image/convert_image_dtype 将dtype uint16的png转换为float32。

使用Tensorflow 1.12.0。

根据文档: 使用浮点值表示的图像应该具有[0,1)范围内的值。以整数数据类型存储的图像数据的值应在[0,MAX]范围内,其中MAX是该数据类型的最大可表示正数。 此操作会在数据类型之间转换,并在投射前适当缩放值。

这应该将我的值放在[0,1)中以进行浮点转换,但是在评估新的float32张量时,我的白色像素接近65535-uint16的最大值。似乎没有发生任何向上或向下缩放的情况。

我执行操作是否错误?我应该将元素除以65535以获得正确格式的浮点张量吗?

2 个答案:

答案 0 :(得分:0)

我发现了问题。 在类型转换之前使用resize会更改张量类型,因此Tensorflow无法正确进行缩放。

我正在使用:

#CAUSES SCALING ISSUE
file1 = tf.read_file("my_filename_here.png")
img = tf.image.decode_png(file1, channels=1, dtype=tf.uint16)
sizedImage = tf.image.resize_images(img, shape, shape)
finalimg = tf.convert_image_dtype(sizedImage, tf.float32)

这导致没有缩放。通过解码后直接进行转换来解决。

#CORRECT
file1 = tf.read_file("my_filename_here.png")
img = tf.image.decode_png(file1, channels=1, dtype=tf.uint16)
img = tf.convert_image_dtype(img, tf.float32)
finalImage = tf.image.resize_images(img, shape, shape)

我曾经认为我可以通过在转换之前缩小尺寸来提高效率,但这会破坏它。总结:解码后立即执行convert_image_dtype。

答案 1 :(得分:0)

解码图像时指定dtype,否则tensorflow签名为您指定dtype,这会导致resize_函数出现问题。

因此,在您的情况下,dtype 规范是

img = tf.image.decode_png(file1, channels=1, dtype=tf.float32)

此外,resize 确实会返回一个带有 dtype float32 的图像,因此如果之前已经转换过,则必须在使用 resize 后再次将其转换为 uint,而不是转换。所以,更好的是,正确的顺序是解码、调整大小、转换。