tf.image.convert_image_dtype功能:将图像转换为dtype,如果需要,缩放其值。API定义如下
convert_image_dtype(
image,
dtype,
saturate=False,
name=None)
1、如果image的数值类型是int,dtype=float时会将数值缩放到[0,1)范围。
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
import tensorflow as tf
from scipy import misc,ndimage
data=misc.imread('Lenna.png',mode='L') # shape 512x512
data=ndimage.zoom(data, 0.01) # 缩放为原来的0.01倍
print(data.dtype) # uint8
print(type(data)) #
print(data.shape) # (5, 5)
print(data)
'''
[[161 131 137 151 130]
[ 93 181 183 153 157]
[ 97 142 103 64 135]
[ 46 87 84 151 46]
[ 41 69 134 112 106]]
'''
float_image_batch = tf.image.convert_image_dtype(data, tf.float16)
sess=tf.InteractiveSession()
tf.global_variables_initializer().run()
print(float_image_batch.eval())
'''
[[ 0.63134766 0.51367188 0.53710938 0.59228516 0.50976562]
[ 0.36474609 0.70996094 0.71777344 0.60009766 0.61572266]
[ 0.38037109 0.55664062 0.40380859 0.25097656 0.52929688]
[ 0.18041992 0.34106445 0.3293457 0.59228516 0.18041992]
[ 0.1607666 0.27050781 0.52539062 0.43920898 0.41577148]]
'''
2、如果image原本数据类型为unit8,而转成unit16,dtype=float,会发现缩放后的数值存在很大的问题
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
import tensorflow as tf
from scipy import misc,ndimage
import numpy as np
data=misc.imread('Lenna.png',mode='L') # shape 512x512
data=ndimage.zoom(data, 0.01) # 缩放为原来的0.01倍
print(data.dtype) # uint8
print(type(data)) #
print(data.shape) # (5, 5)
data=data.astype(np.uint16)
print(data)
'''
[[161 131 137 151 130]
[ 93 181 183 153 157]
[ 97 142 103 64 135]
[ 46 87 84 151 46]
[ 41 69 134 112 106]]
'''
float_image_batch = tf.image.convert_image_dtype(data, tf.float16)
sess=tf.InteractiveSession()
tf.global_variables_initializer().run()
print(float_image_batch.eval())
'''
[[ 0.00245667 0.0019989 0.00209045 0.00230408 0.00198364]
[ 0.00141907 0.00276184 0.00279236 0.00233459 0.00239563]
[ 0.0014801 0.00216675 0.00157166 0.00097656 0.00205994]
[ 0.0007019 0.00132751 0.00128174 0.00230408 0.0007019 ]
[ 0.00062561 0.00105286 0.00204468 0.00170898 0.00161743]]
'''
3、如果image的数值类型是float,dtype=float 数值不会缩放到[0,1)范围
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
import tensorflow as tf
from scipy import misc,ndimage
import numpy as np
data=misc.imread('Lenna.png',mode='L') # shape 512x512
data=ndimage.zoom(data, 0.01) # 缩放为原来的0.01倍
print(data.dtype) # uint8
print(type(data)) #
print(data.shape) # (5, 5)
data=data.astype(np.float16)
print(data)
'''
[[ 161. 131. 137. 151. 130.]
[ 93. 181. 183. 153. 157.]
[ 97. 142. 103. 64. 135.]
[ 46. 87. 84. 151. 46.]
[ 41. 69. 134. 112. 106.]]
'''
float_image_batch = tf.image.convert_image_dtype(data, tf.float16)
sess=tf.InteractiveSession()
tf.global_variables_initializer().run()
print(float_image_batch.eval())
'''
[[ 161. 131. 137. 151. 130.]
[ 93. 181. 183. 153. 157.]
[ 97. 142. 103. 64. 135.]
[ 46. 87. 84. 151. 46.]
[ 41. 69. 134. 112. 106.]]
'''
总结:如果image数据类型已是float,再使用convert_image_dtype转成float类型,并不会对image的数值做归一化,则需通过别的途径进行归一化处理,如:(image-mean(image,0))/var(image,0)
并且如果没有使用数据的原本的格式,使用convert_image_dtype转成float类型会出现很大的问题
所以使用convert_image_dtype一定要检查好原数据的数据类型,否则转换会存在问题。
转载自:https://blog.csdn.net/wc781708249/article/details/78392754