没有内置的op可以执行这种插值,但是您应该能够使用现有TensorFlow op的组合来做到这一点。对于双线性情况,我建议采用以下策略:
根据
C
索引张量,计算与四个角点相对应的整数张量。例如(名称假设原点在左上方):top_left = tf.cast(tf.floor(C), tf.int32)
top_right = tf.cast(
tf.concat(1, [tf.floor(C[:, 0:1]), tf.ceil(C[:, 1:2])]), tf.int32)bottom_left = tf.cast(
tf.concat(1, [tf.ceil(C[:, 0:1]), tf.floor(C[:, 1:2])]), tf.int32)bottom_right = tf.cast(tf.ceil(C), tf.int32)
从代表特定拐角点的每个张量中,从
I
这些点处提取值的向量。例如,对于以下功能,在二维情况下执行此 *** 作:def get_values_at_coordinates(input, coordinates):
input_as_vector = tf.reshape(input, [-1])
coordinates_as_indices = (coordinates[:, 0] * tf.shape(input)[1]) + coordinates[:, 1]
return tf.gather(input_as_vector, coordinates_as_indices)values_at_top_left = get_values_at_coordinates(I, top_left)
values_at_top_right = get_values_at_coordinates(I, top_right)
values_at_bottom_left = get_values_at_coordinates(I, bottom_left)
values_at_bottom_right = get_values_at_coordinates(I, bottom_right)首先在水平方向上计算插值:
# Varies between 0.0 and 1.0.
horizontal_offset = C[:, 0] - tf.cast(top_left[:, 0], tf.float32)
horizontal_interpolated_top = (
((1.0 - horizontal_offset) * values_at_top_left)
+ (horizontal_offset * values_at_top_right))horizontal_interpolated_bottom = (
((1.0 - horizontal_offset) * values_at_bottom_left)
+ (horizontal_offset * values_at_bottom_right))现在计算垂直方向的插值:
vertical_offset = C[:, 1] - tf.cast(top_left[:, 1], tf.float32)
interpolated_result = (
((1.0 - vertical_offset) * horizontal_interpolated_top)
+ (vertical_offset * horizontal_interpolated_bottom))
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)