梯度大小的单位和极限是什么?

What are the units and limits of gradient magnitude?

图像梯度大小的单位和限制是什么?例如,我知道如何获取图像的梯度幅度(见下文)。结果 Mat 将包含源图像中每个边缘的边缘强度(幅度)。

但是'Edge Strength/Magnitude'的单位是什么?梯度方向以 degrees/radians 为单位,幅度的单位是什么? OpenCV 中 Magnitude 的限制是什么?它是 0 到 1,即边的 strength/magnitude 介于 0 和 1 之间,其中 1 是完全垂直的?

所以如果我要在直方图中绘制幅度; x 轴表示边缘 strength/steepness,y 轴表示具有 strength/steepness 的像素数?我说得对吗?

Mat sX, sY, mag;
Sobel(src, sX, CV_32F, 1, 0, 1);
Sobel(src, sY, CV_32F, 0, 1, 1);

magnitude(sX, sY, mag);

// So mag now contains the image gradient magnitude 
// of the all the edges I pulled out by sobel.
// What are the units and limits of 'edge strength'/magnitude?
// For example are the limits 0 to 1?

单位

您正在对一个函数求一些近似导数。例如,如果函数是 f(x),那么请记住您正在查看 f 中的 change 而不是 change ] 在 x。假设函数是基于时间的位置r(t),那么导数的单位是位置差(距离)除以时间差(时间)。那么图像的单位是什么?嗯,它们是某些位置的光度值。光度值的变化只是一个光度值,位置的变化就是一个距离。所以导数的单位是luminosity/distance。

梯度大小

由于我们处理的是图像,最小距离是一个像素,最大可能的变化是从白色到黑色(反之亦然),因此它们对应于最大的渐变。但是 Sobel 可以处理最小值和最大值可以在 0 到 1 或 0 到 255 之外的任意矩阵。

请注意,您可能会得到斜率的负值:以像素为单位的距离始终为正,但从白色到黑色和从黑色到白色的变化符号相反。在 Sobel 计算出这些导数后,您将分别计算 幅度 角度 。您可以根据每个方向的梯度强度对 xy 方向进行加权来计算角度,并且它需要符号 return 0 到 360 之间的任何角度。

如果你想要所有边缘的大小为正值,非边缘为0,你可以采用L1-norm,即abs(x) + abs(y),或者采用 EuclideanL2-normthe magnitude function,即 sqrt(G(x)^2 + G(y)^2),就像您计算三角形的斜边。直接添加意味着一些渐变是正的,一些是负的,留下一个显示黑白边缘的灰色图像。

来自 Sobel 运算符的值

Sobel 运算符简单地计算像素邻域的导数,不仅仅是比较两个像素,而是比较六个像素,并对它们进行加权,将它们全部相加——因此它可以比图像中的值高一点.而且,浮点图像不会在 0 或 1 处被截断,因此您可以发送具有更大值的图像并获得更大的值。除了数据类型可以容纳的最大值之外,运算符没有虚拟最大值。 Sobel算子在梯度计算之前也会做一些平滑处理,去除小的边缘,但是平滑算子不会缩放值。

OpenCV docs for Sobel 显示操作员将图像乘以的值。具体来说,对于 x 方向,每个 3x3 像素邻域按元素乘以

-1 0 1
-2 0 2
-1 0 1

并求和。如果图像类型的最大可能值是 M,最小值是 m,那么渐变中最大的正值是

(1+2+1)*M - (1+2+1)*m = 4*M - 4*m

同样最大的负值是

-(1+2+1)*M + (1+2+1)*m = -4*M + 4*m

每个方向的渐变都是一样的。因此,从 Sobel 开始每个方向的渐变范围将是 [-4M+4m, 4M-4m]

规范化运算符

您将使用 L1 范数或 L2 范数以某种方式将其中两个量级相加。假设您坚持使用 L2 范数,那么根据 L2 范数定义,组合幅度的最大值就是

MAX = sqrt((4*M - 4*m)**2 + (4*M - 4*m)**2) 
    = sqrt(2 * (4*M - 4*m)**2)
    = sqrt(2 * 16 * (M - m)**2) 
    = sqrt(32) * (M - m)

由于 L1 或 L2 范数将正值和负值视为相等(它们与 0 的距离很重要),因此 Sobel 算子中的最小值在组合幅度中给出与最大值相同的响应。当然,您的响应中的某些点可能为 0,这会给出 Sobel 响应,因此总和也为 0,因此 0 将是最小值。

编辑:正如 对这个问题的说明,我们实际上无法同时在 X 和 Y 方向上达到最大值,如果您计算出最大值实际可以达到多少,它就会结束小一点:

sqrt(20) * (M - n)

因此您可以将梯度归一化到具体在 0 和 1 之间 w.r.t。您的图像类型除以最大值。这将允许您比较多个图像的边缘强度。

或者您可以只使用 normalize 函数,但最终值将取决于您的图像,因此您无法比较图像之间的相等值。

最大梯度幅度
我很难同意上面的回答。请注意,对于中心像素 X 及其 3✕3 个相邻像素,它不能同时取最大水平和垂直梯度,因此对于 8 位系统,Sobel 滤波器可以实现的最大梯度应为 sqrt(20)*(M-m),其中 Mm 与接受的答案中定义的相同。社区的结构是 [m M M; m X M; m m M].