我想在给出一批图像的情况下从图像中减去图像的平均值。
显然,tf.image.per_image_standardization
不是我想要的,因为我不想除以标准偏差。
并且frames_normalized = tf.map_fn(lambda frame: tf.reduce_mean(frame, axis=[2]), frames_contrast_adjust)
不是我想要的,因为这会减少原始图像的尺寸。也就是说,如果单个图像的尺寸是[112,112,3],则tf.reduce_mean
图像的结果将具有[112,112]的形状。因此,当frame_normalized
是一批大小为[?,112,112,3]的图像时,frames_contrast_adjust
的大小将变为:[?,?,112,3]。
请注意,我确实想要使用队列。
非常感谢任何帮助!!
答案 0 :(得分:1)
如果您希望op的行为几乎与per_image_standadization
相似但没有差异,您可以看看tf.image.per_image_standadization是如何实现的,并删除与方差相关的所有内容(我对其进行了评论):
image = ops.convert_to_tensor(image, name='image')
image = control_flow_ops.with_dependencies(_Check3DImage(image, require_static=False), image)
num_pixels = math_ops.reduce_prod(array_ops.shape(image))
image = math_ops.cast(image, dtype=dtypes.float32)
image_mean = math_ops.reduce_mean(image)
#variance = (math_ops.reduce_mean(math_ops.square(image)) -math_ops.square(image_mean))
#variance = gen_nn_ops.relu(variance)
#stddev = math_ops.sqrt(variance)
# Apply a minimum normalization that protects us against uniform images.
#min_stddev = math_ops.rsqrt(math_ops.cast(num_pixels, dtypes.float32))
#pixel_value_scale = math_ops.maximum(stddev, min_stddev)
pixel_value_offset = image_mean
image = math_ops.subtract(image, pixel_value_offset)
#image = math_ops.div(image, pixel_value_scale)
return image
答案 1 :(得分:0)
通过将keep_dims
中的tf.reduce_mean
参数设置为true,可以解决问题。现在:
tf.map_fn(lambda frame: tf.reduce_mean(frame, axis=[2], keep_dims=True), frames_contrast_adjust)
为了从图像本身中减去图像的平均值,我做了以下几点:
frames_normalized = tf.map_fn(lambda frame: frame - tf.reduce_mean(frame, axis=[2], keep_dims=True), input_frames)