Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 图像梯度的Tensorflow实现 问题_Python_Tensorflow_Image Processing_Computer Vision - Fatal编程技术网

Python 图像梯度的Tensorflow实现 问题

Python 图像梯度的Tensorflow实现 问题,python,tensorflow,image-processing,computer-vision,Python,Tensorflow,Image Processing,Computer Vision,我试图从头开始实现图像渐变。我知道有多种方法可以做到这一点(包括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

我试图从头开始实现图像渐变。我知道有多种方法可以做到这一点(包括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
    函数计算导数的有限差分近似值,这相当于使用两个核进行卷积:

    | 1-1 | | 1|
    | -1 |
    
    Sobel过滤器与以下两个内核进行卷积:

    | 10-1 | | 12 1|
    |  2  0 -2 | / 8            |  0  0  0 | / 8
    |  1  0 -1 |                | -1 -2 -1 |
    
    这是估计梯度的两种不同方法

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

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

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