1

http://www.cis.rit.edu/people/faculty/rhody/EdgeDetection.htm

这似乎是唯一一篇试图描述 sobel 算子如何来自方程的文章。但我当然不了解这些方面。

在那个页面中,他们让

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 算子,它们是二维的乘积卷积运算。这意味着什么?

4

1 回答 1

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]

应用上述等式与将 A 与 [-1,1] 卷积相同。

举个例子,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]

此操作与将 A 与 [-1,0,1] 卷积相同。

举个例子,B[0,3] = -1xA[0,4] + 0xA[0,3] + 1xA[0,2]=> -1x9 + 0x16 + 1x25 => 16


垂直导数的情况也类似。

(如果需要更多细节,请发表评论。)

于 2012-12-29T19:39:47.420 回答