【问题标题】:Tensorflow Implementation of image gradients图像渐变的Tensorflow实现
【发布时间】:2020-11-29 21:16:36
【问题描述】:

问题

我正在尝试从头开始实现图像渐变。我知道有多种方法可以做到这一点(包括 Sobel 和其他过滤器)。我的问题是关于图像渐变的 Tensorflow 实现。

TF 通过这种方法实现图像渐变,如here 所示。所以根据 TF 文档,对于虚拟输入,

  [[ 0.  1.  2.  3.  4.]
  [ 5.  6.  7.  8.  9.]
  [10. 11. 12. 13. 14.]
  [15. 16. 17. 18. 19.]
  [20. 21. 22. 23. 24.]

dy 和 dx 分别是,

dy = [[5. 5. 5. 5. 5.]
  [5. 5. 5. 5. 5.]
  [5. 5. 5. 5. 5.]
  [5. 5. 5. 5. 5.]
  [0. 0. 0. 0. 0.]]

dx = [[1. 1. 1. 1. 0.]
  [1. 1. 1. 1. 0.]
  [1. 1. 1. 1. 0.]
  [1. 1. 1. 1. 0.]
  [1. 1. 1. 1. 0.]],

但是当使用 Sobel 过滤器时(如图所示 here)我的输出是,

dx = [[[[-8., -8., -8.],
          [-8., -8., -8.],
          [-8., -8., -8.]]]]

dy = [[[[-40., -40., -40.],
          [-40., -40., -40.],
          [-40., -40., -40.]]]]

虽然我知道这两种方法都是公认的计算梯度的方法,但我的问题是,

  1. 为什么这两种方法的结果不一样?
  2. 有没有办法将一种方法的结果转换成另一种方法?

【问题讨论】:

    标签: python tensorflow image-processing computer-vision


    【解决方案1】:

    为什么这两种方法的结果不一样?

    因为他们做不同的事情。 Tensorflow 的image_gradients 函数计算导数的有限差分逼近,相当于用两个核进行卷积:

     |  1 -1 |                     |  1 |
                                   | -1 |
    

    Sobel 滤波器与这两个内核卷积:

    |  1  0 -1 |                |  1  2  1 |
    |  2  0 -2 | / 8            |  0  0  0 | / 8
    |  1  0 -1 |                | -1 -2 -1 |
    

    这是估计梯度的两种不同方法。

    请注意,某些实现使用不同的规范化。 OP 中 Sobel 的结果正好是导数期望值的 8 倍,因此它根本没有对内核进行归一化。它缺少获得正确幅度所需的/8

    有没有办法将一种方法的结果转换成另一种方法?

    是的,我想你可以弄清楚如何做到这一点,但你为什么要这样做?从输入图像直接计算所需的输出要容易得多。

    【讨论】:

      猜你喜欢
      • 2011-08-20
      • 1970-01-01
      • 1970-01-01
      • 2012-07-14
      • 2015-03-22
      • 2014-03-13
      • 1970-01-01
      • 2019-03-24
      • 1970-01-01
      相关资源
      最近更新 更多