当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python tf.image.convert_image_dtype用法及代码示例


image 转换为 dtype ,如果需要,缩放其值。

用法

tf.image.convert_image_dtype(
    image, dtype, saturate=False, name=None
)

参数

  • image 一个图像。
  • dtype 一个 DTypeimage 转换为。
  • saturate 如果 True ,请在投射之前剪辑输入(如有必要)。
  • name 此操作的名称(可选)。

返回

  • image ,转换为 dtype

抛出

  • AttributeError 当 dtype 既不是浮点数也不是整数时引发属性错误

该操作支持 uint8 , uint16 , uint32 , uint64 , int8 , int16 , int32 , int64 , float16 , float32 , float64 , bfloat16 的数据类型(对于 imagedtype )。

使用浮点值表示的图像应具有 [0,1) 范围内的值。存储在整数数据类型中的图像数据的值应在 [0,MAX] 范围内,其中 MAX 是数据类型的最大正数。

此操作在数据类型之间转换,在转换之前适当地缩放值。

使用示例:

x = [[[1, 2, 3], [4, 5, 6]],
     [[7, 8, 9], [10, 11, 12]]]
x_int8 = tf.convert_to_tensor(x, dtype=tf.int8)
tf.image.convert_image_dtype(x_int8, dtype=tf.float16, saturate=False)
<tf.Tensor:shape=(2, 2, 3), dtype=float16, numpy=
array([[[0.00787, 0.01575, 0.02362],
        [0.0315 , 0.03937, 0.04724]],
       [[0.0551 , 0.063  , 0.07086],
        [0.07874, 0.0866 , 0.0945 ]]], dtype=float16)>

将整数类型转换为浮点类型会返回 [0, 1) 范围内的归一化浮点值;这些值由输入 dtype 的 MAX 值标准化。考虑以下两个示例:

a = [[[1], [2]], [[3], [4]]]
a_int8 = tf.convert_to_tensor(a, dtype=tf.int8)
tf.image.convert_image_dtype(a_int8, dtype=tf.float32)
<tf.Tensor:shape=(2, 2, 1), dtype=float32, numpy=
array([[[0.00787402],
        [0.01574803]],
       [[0.02362205],
        [0.03149606]]], dtype=float32)>
a_int32 = tf.convert_to_tensor(a, dtype=tf.int32)
tf.image.convert_image_dtype(a_int32, dtype=tf.float32)
<tf.Tensor:shape=(2, 2, 1), dtype=float32, numpy=
array([[[4.6566129e-10],
        [9.3132257e-10]],
       [[1.3969839e-09],
        [1.8626451e-09]]], dtype=float32)>

尽管具有相同的 a 值和 float32 的输出 dtype ,但由于输入 dtype 不同( int8int32 ),输出有所不同。这又是因为这些值是由输入 dtype 的 MAX 值规范化的。

请注意,将浮点值转换为整数类型可能会丢失精度。在下面的示例中,dtype float32 的图像张量 b 被转换为 int8 并返回到 float32 。然而,由于精度损失,最终输出与原始输入b 不同。

b = [[[0.12], [0.34]], [[0.56], [0.78]]]
b_float32 = tf.convert_to_tensor(b, dtype=tf.float32)
b_int8 = tf.image.convert_image_dtype(b_float32, dtype=tf.int8)
tf.image.convert_image_dtype(b_int8, dtype=tf.float32)
<tf.Tensor:shape=(2, 2, 1), dtype=float32, numpy=
array([[[0.11811024],
        [0.33858266]],
       [[0.5590551 ],
        [0.77952754]]], dtype=float32)>

从整数类型(输入 dtype)放大到另一个整数类型(输出 dtype)不会将输入 dtype 的 MAX 映射到输出 dtype 的 MAX 但来回转换应该不会导致任何变化。例如,如下所示,int8 (=127) 的 MAX 值未映射到 int16 (=32,767) 的 MAX 值,但是当按比例缩小时,我们得到相同的原始值 c .

c = [[[1], [2]], [[127], [127]]]
c_int8 = tf.convert_to_tensor(c, dtype=tf.int8)
c_int16 = tf.image.convert_image_dtype(c_int8, dtype=tf.int16)
print(c_int16)
tf.Tensor(
[[[  256]
  [  512]]
 [[32512]
  [32512]]], shape=(2, 2, 1), dtype=int16)
c_int8_back = tf.image.convert_image_dtype(c_int16, dtype=tf.int8)
print(c_int8_back)
tf.Tensor(
[[[  1]
  [  2]]
 [[127]
  [127]]], shape=(2, 2, 1), dtype=int8)

从整数类型缩小到另一种整数类型可能是有损转换。请注意,在下面的示例中,将 int16 转换为 uint8 并返回到 int16 会丢失精度。

d = [[[1000], [2000]], [[3000], [4000]]]
d_int16 = tf.convert_to_tensor(d, dtype=tf.int16)
d_uint8 = tf.image.convert_image_dtype(d_int16, dtype=tf.uint8)
d_int16_back = tf.image.convert_image_dtype(d_uint8, dtype=tf.int16)
print(d_int16_back)
tf.Tensor(
[[[ 896]
  [1920]]
 [[2944]
  [3968]]], shape=(2, 2, 1), dtype=int16)

请注意,从浮点输入转换为整数类型可能会导致上溢/下溢问题。将 saturate 设置为 True 以避免在有问题的转换中出现此类问题。如果启用,饱和将在执行潜在危险转换之前将输出剪辑到允许的范围内(并且仅在执行此类转换之前,即从浮点类型转换为整数类型时,以及从有符号类型转换为无符号类型时; saturate 对浮点数之间的强制转换或增加类型范围的强制转换没有影响)。

相关用法


注:本文由纯净天空筛选整理自tensorflow.org大神的英文原创作品 tf.image.convert_image_dtype。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。