http://www.cis.rit.edu/people/faculty/rhody/EdgeDetection.htm
这似乎是唯一一篇试图描述索贝尔运算符如何来自等式的文章。但我当然不理解这些方面。
在该页面中,他们让
A = array of actual image , B = grayscale version
Horizontal gradient B(j ,k) = taking column values = A ( j,k+1 ) - A (j,k)
我的问题,为什么要将列值取为水平?
然后,他们又说:
This can be represented by a filter array as shown below: as a matrix [-1,1]
这个滤镜阵列是如何来自这个等式的?另外,我很难理解为什么[-1,1]变为[-1,0,1],然后这个水平和垂直矩阵没有“乘以”得到sobel算子,它们是二维的乘积卷积运算。黑客意味着什么?
答案 0 :(得分:3)
考虑一个示例数组A = [1,4,9,16,25]
。
我们需要根据你提到的文章找到这个数组的水平导数。
当我们谈论水平导数时,我们需要在一行中的元素之间取差异。即数据如何连续变化,即水平导数。同样,列中数据的变化是垂直导数。
第一个等式是: B[j,k] = A[j,k+1] - A[j,k]
=> B[0,0] = A[0,1] - A[0,0]
=> B [0,0] = 4-1 => 3
=> B[0,1] = A[0,2] - A[0,1]
=> B [0,1] = 9-4 => 5
=> B[0,2] = A[0,3] - A[0,2]
=> B [0,2] = 16-9 => 7
=> B[0,3] = A[0,4] - A[0,3]
=> B [0,3] = 25-16 => 9
最后 B = [3,5,7,9]
应用上述方程式与使用[-1,1]进行卷积A相同。
仅举例来说,B[0,3] = -1xA[0,3] + 1xA[0,4]
=> -1x16 + 1x25 => 9
现在我们尝试使用第二个等式: B[j,k] = A[j,k+1] - A[j,k-1]
=> B[0,1] = A[0,2] - A[0,0]
=> B [0,1] = 9-1 => 8
=> B[0,2] = A[0,3] - A[0,1]
=> B [0,2] = 16-4 => 12
=> B[0,3] = A[0,4] - A[0,2]
=> B [0,3] = 25-9 => 16
最后, B = [8,12,16]
此操作与使用[-1,0,1]进行卷积A相同。
仅举例来说,B[0,3] = -1xA[0,4] + 0xA[0,3] + 1xA[0,2]
=> -1x9 + 0x16 + 1x25 => 16
类似于垂直导数也是如此。
(如果需要更多细节,请发表评论。)