对于 Tensorflow 中的一批图像,从其本身减去图像的意思

Subtract Image' mean from itself for a batch of images in Tensorflow

给定一批图像,我想从图像本身中减去图像的均值。

显然,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] 的形状。因此,当frames_contrast_adjust是一批大小为[?, 112, 112, 3]的图像时,frame_normalized的大小将变为:[?, ?, 112, 3]。

请注意,我确实想在中间使用队列。

非常感谢任何帮助!!

问题已通过将 tf.reduce_mean 中的 keep_dims 参数设置为 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)

如果你想要的操作几乎像 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