繁体   English   中英

Tensorflow 图像渐变的实现

[英]Tensorflow Implementation of image gradients

问题

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

TF 通过这种方法实现图像渐变,如下所示 因此,根据 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 过滤器(如图所示)时,我的输出是,

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

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

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

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

为什么这两种方法的结果不相等?

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

 |  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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM