[英]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.]]]]
虽然我知道这两种方法都是公认的计算梯度的方法,但我的问题是,
为什么这两种方法的结果不相等?
因为他们做不同的事情。 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.