gpt4 book ai didi

python - 使用 TensorFlow 对图像中的点进行插值采样

转载 作者:太空狗 更新时间:2023-10-29 20:15:24 25 4
gpt4 key购买 nike

给定一个灰度图像 I 作为 2D 张量(维度 W,H)和一个坐标 C(Dim.None,2)的张量。我想将 C 的行解释为 I 中的坐标,使用某种插值在这些坐标处对 I 进行采样(双线性可能会很好对于我的用例),并将结果值存储在一个新的张量 P 中(维度为无,即一维的条目数与 C 的行数一样多)。

TensorFlow 是否可以(有效地)实现这一点?我所能找到的只是调整图像大小(如果你愿意,可以进行等距重采样)的函数。但是我无法在坐标列表中找到任何开箱即用的东西。

即我本以为会找到类似 tf.interpolate() 函数的东西:

I = tf.placeholder("float", shape=[128, 128])
C = tf.placeholder("float", shape=[None, 2])
P = tf.interpolate(I, C, axis=[0, 1], method="linear")

理想情况下,我会寻找一种解决方案,允许我使用形状为 (None, M) 的 C 沿着 M 维度插入 N 维张量 I并产生 N-M+1 维输出,如上面代码中的“axis”参数所示。

(顺便说一句,我的应用程序中的“图像”不是图片,它是来自物理模型(用作占位符时)或替代学习模型(用作变量时)的采样数据。现在这个物理模型有2 个自由度,因此在“图像”中插值目前就足够了,但我可能会在未来研究更高维度的模型。)

如果现有的 TensorFlow 功能无法实现类似的功能:当我想实现类似 tf.interpolate() 运算符的功能时,我应该从哪里开始? (文档和/或简单的示例代码)

最佳答案

没有执行这种插值的内置运算符,但您应该能够使用现有 TensorFlow 运算符的组合来执行此操作。对于双线性情况,我建议采用以下策略:

  1. 根据索引的张量 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)
  2. 从表示特定角点的每个张量中,从 I 在这些点处提取值向量。例如,对于以下函数,它针对 2-D 情况执行此操作:

    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)
  3. 首先计算水平方向的插值:

    # 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))
  4. 现在计算垂直方向的插值:

    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))

关于python - 使用 TensorFlow 对图像中的点进行插值采样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34902782/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com