當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。